source: products/quintagroup.gdocs.spreadsheet/trunk/quintagroup/gdocs/spreadsheet/adapters.py @ 2688

Last change on this file since 2688 was 2686, checked in by mylan, 14 years ago

Update getListFeed method or IGSpreadsheetDataProvider interface and adapter

  • Property svn:eol-style set to native
File size: 3.0 KB
RevLine 
[2682]1from zope.interface import implements
2from zope.component import adapts, queryUtility
3
4from gdata.spreadsheet.text_db import Table
5from gdata.spreadsheet.text_db import DatabaseClient
6from gdata.spreadsheet.text_db import ConvertStringsToColumnHeaders
7from gdata.spreadsheet import SpreadsheetsListFeed
8from gdata.spreadsheet import SpreadsheetsCellsFeedFromString
9from gdata.spreadsheet.service import SpreadsheetsService
10from gdata.spreadsheet.service import CellQuery as shCellQuery
11from gdata.spreadsheet.service import DocumentQuery as shDocumentQuery
12
[2686]13from quintagroup.gauth.interfaces import IGAuthUtility
[2682]14from quintagroup.gdocs.spreadsheet import logException, logger
15from quintagroup.gdocs.spreadsheet.interfaces import IGSpreadsheet
16from quintagroup.gdocs.spreadsheet.interfaces import IGSpreadsheetDataProvider
17
18
19class GSpreadsheetDataProvider(object):
20
21    adapts(IGSpreadsheet)
22    implements(IGSpreadsheetDataProvider)
23
24    def __init__(self, context):
25        gauth = queryUtility(IGAuthUtility)
26        self.context = context
27        self.dbcl = DatabaseClient(gauth.email, gauth.password)
28        self.shcl = SpreadsheetsService(gauth.email, gauth.password)
29        self.shcl.ProgrammaticLogin()
30
[2686]31    def getListFeed(self, query=None):
[2682]32        """ Get SpreadsheetsListFeed
33        """
34        if query is None:
35            query = shDocumentQuery()
36        return self._safeQuery(self.shcl.GetListFeed,
37                              self.context.spreadsheet_id,
38                              wksht_id=self.context.worksheet_id,
39                              query=query)
40
41    def getWorksheetColumnsInfo(self, maxr='1', minr='1'):
42        first_row_contents = []
43        query = shCellQuery()
44        query.max_row = maxr
45        query.min_row = minr
46        feed = self._safeQuery(
47            self.dbcl._GetSpreadsheetsClient().GetCellsFeed,
48            self.context.spreadsheet_id,
49            wksht_id=self.context.worksheet_id,
50            query=query)
51        for entry in feed.entry:
52            first_row_contents.append(entry.content.text)
53        # Get the next set of cells if needed.
54        next_link = feed.GetNextLink()
55        while next_link:
56            feed = self._safeQuery(
57                self.dbcl._GetSpreadsheetsClient().Get,
58                next_link.href, converter=SpreadsheetsCellsFeedFromString)
59            for entry in feed.entry:
60                first_row_contents.append(entry.content.text)
61            next_link = feed.GetNextLink()
62        # Convert the contents of the cells to valid headers.
63        return ConvertStringsToColumnHeaders(first_row_contents)
64
65    def _safeQuery(self, meth, *margs, **mkwargs):
66        # Make safe method call with logging information about exception
67        try:
68            return meth(*margs, **mkwargs)
69        except Exception:
70            logException('%s function call: key=%s, wksht_id=%s' % (
71                meth.__name__, self.context.spreadsheet_id,
72                self.context.worksheet_id), self.context)
73        return None
Note: See TracBrowser for help on using the repository browser.