summaryrefslogtreecommitdiff
path: root/addons/google_docs/google_docs.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/google_docs/google_docs.py')
-rw-r--r--addons/google_docs/google_docs.py119
1 files changed, 119 insertions, 0 deletions
diff --git a/addons/google_docs/google_docs.py b/addons/google_docs/google_docs.py
new file mode 100644
index 00000000000..a2693ac95a7
--- /dev/null
+++ b/addons/google_docs/google_docs.py
@@ -0,0 +1,119 @@
+from osv import osv, fields
+import gdata.docs.data
+import gdata.docs.client
+from gdata.client import RequestError
+
+class google_docs(osv.osv):
+ _name = 'google.docs'
+
+ _table = 'google_docs_templates'
+ _columns = {
+ 'id': fields.integer('ID', readonly=True),
+ 'model': fields.many2one('ir.model', 'Model'),
+ 'gdocs_res_id': fields.char('Google resource ID', size=64, translate=False)
+ }
+
+ edit_url_template = 'https://docs.google.com/Edit?docid=%s'
+ prefix_gdoc_id_res = 'document:'
+
+ def copy_gdoc(self, cr, uid, model, context=None):
+ '''Associate a copy of the gdoc identified by 'gdocs_res_id' to the current entity.
+ @param cr: the current row from the database cursor.
+ @param uid: the current user ID, for security checks.
+ @param model: the current model name.
+ @param context: a standard dictionary for contextual values.
+ @return the url of the copy itself.
+ @return -1 if the template hasn't been assigned yet.
+ @return -2 if the google_base_account hasn't been configured yet.'''
+
+ if context==None:
+ context={}
+
+ # check template for the current model
+ model_obj = self.pool.get(model)
+ res_gdocs_obj = self.pool.get('google.docs')
+ domain = [('model' , '=', model_obj)]
+ gdoc = res_gdocs_obj.search(cr,uid,domain,context=context)
+ if not gdoc:
+ return -1
+
+ # check google_base_account
+ users_obj = self.pool.get('res.users')
+ user = users_obj.browse(cr, uid, [uid])[0]
+ if not user.gmail_user or not user.gmail_password:
+ return -2
+
+ # copy the document
+ client = gdata.docs.client.DocsClient(source='openerp.com')
+ client.ssl = True
+ client.http_client.debug = False
+ client.ClientLogin(user.gmail_user, user.gmail_password, client.source, service='writely')
+ resource = client.get_resource_by_id(gdoc.gdocs_res_id)
+ copied_resource = client.copy_resource(entry=resource, title=resource.title.text + ' (generated from OpenERP)')
+
+ return self.edit_url_template % (copied_resource.resource_id.text,)
+
+ def get_documents_list(self, cr, uid, context=None):
+ '''Return the list of google documents available at the user's account.
+ @param cr: the current row from the database cursor.
+ @param uid: the current user ID, for security checks.
+ @param context: a standard dictionary for contextual values.
+ @return a list with information about the documents in form of tuples (document_name, document_resource_id).
+ @return -2 if the google_base_account hasn't been configured yet.'''
+
+ if context == None:
+ context = {}
+
+ # check google_base_account
+ users_obj = self.pool.get('res.users')
+ user = users_obj.browse(cr, uid, [uid])[0]
+ if not user.gmail_user or not user.gmail_password:
+ return -2
+
+ # get the documents list
+ client = gdata.docs.client.DocsClient(source='openerp.com')
+ client.ssl = True
+ client.http_client.debug = False
+ client.ClientLogin(user.gmail_user, user.gmail_password, client.source, service='writely')
+
+ return map(lambda doc: (doc.title.text, doc.resource_id.text[len(prefix_gdoc_id_res):]), filter(lambda r: r.resource_id.text.startswith('document:'), client.get_all_resources()))
+
+
+ def set_model_document_template(self, cr, uid, model, resource_id, context=None):
+ '''Set the default document template for the specified model. This template doesn't have to be a google documents template itself, but just a document.
+ @param cr: current row for the database cursor.
+ @param uid: the current user ID, for security checks.
+ @param model: the current model name.
+ @param resource_id: resource_id associated to the chosen document.
+ @param context: a standard dictionary for contextual values.
+ @return 0 on successful execution.
+ @return -2 if the google_base_account hasn't been configured yet.
+ @retrurn -3 if the given resource_id doesn't exist in the user's google docs account.
+ '''
+
+ if context == None:
+ context = {}
+
+ # check google_base_account
+ users_obj = self.pool.get('res.users')
+ user = users_obj.browse(cr, uid, [uid])[0]
+ if not user.gmail_user or not user.gmail_password:
+ return -2
+
+ # check resource_id
+ client = gdata.docs.client.DocsClient(source='openerp.com')
+ client.ssl = True
+ client.http_client.debug = False
+ client.ClientLogin(user.gmail_user, user.gmail_password, client.source, service='writely')
+ try:
+ client.get_resource_by_id(resource_id)
+ except RequestError:
+ return -3
+
+ # set the model document template
+ model_template_id = self.create(cr, uid,
+ { 'model': self.pool.get(model),
+ 'gdocs_res_id': resource_id
+ })
+
+ return 0