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

Last change on this file since 2686 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
Line 
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
13from quintagroup.gauth.interfaces import IGAuthUtility
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
31    def getListFeed(self, query=None):
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.