197 lines
7.6 KiB
Python
197 lines
7.6 KiB
Python
from osv import osv, fields
|
|
import gdata.docs.data
|
|
import gdata.docs.client
|
|
from gdata.client import RequestError
|
|
from gdata.docs.service import DOCUMENT_LABEL
|
|
|
|
# _columns = {
|
|
# 'id': fields.integer('ID', readonly=True),
|
|
# 'model': fields.many2one('ir.model', 'Model'),
|
|
# 'multiple': fields.boolean('Multiple'),
|
|
# '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 google_docs_get(self, cr, uid, model, id):
|
|
# attachment = self.search(cr, uid, [('res_model', '=', model), ('res_id', '=', id), ('type', '=', 'url'), ('url', 'like', 'https://docs.oogle.com')])
|
|
# if attachment:
|
|
# return self.read(cr, uid, attachment)[0]['url']
|
|
# else:
|
|
# url = self.pad_generate_url(cr, uid, model, id)
|
|
# self.create(cr, uid, {
|
|
# 'res_model' : model,
|
|
# 'res_id' : id,
|
|
# 'type' : 'url',
|
|
# 'name' : 'Pad',
|
|
# 'url' : url,
|
|
# })
|
|
# return url
|
|
#
|
|
# def generate_name(self, cr, uid, model, id):
|
|
# template_vars = {
|
|
# 'db' : cr.dbname,
|
|
# 'model' : model,
|
|
# 'id' : id,
|
|
# 'salt' : salt,
|
|
# 'name' : self.pool.get(model).name_get(cr,uid,[id])[0],
|
|
# }
|
|
# return pad_url_template % template_vars
|
|
#
|
|
#
|
|
# def button_add_google_docs_google_docs_add_doc(self, cr, uid, model, id):
|
|
# #pad_url_template = self.pool.get('res.users').browse(cr,uid,[uid])[0].company_id.pad_url_template
|
|
# #s = string.ascii_uppercase + string.digits
|
|
# #salt = ''.join([s[random.randint(0, len(s) - 1)] for i in range(8)])
|
|
#
|
|
# # i lookup in the table google_docs.templates to check the policy
|
|
#
|
|
# # if multiple: 1
|
|
#
|
|
# # if i find a template i will duplicate the template
|
|
#
|
|
# # else empty 'word' text
|
|
#
|
|
# # else
|
|
# # if no document exists do like 1 -^
|
|
# # else
|
|
# # jumpt to the existing document
|
|
#
|
|
|
|
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),
|
|
'name_template': fields.char('GDoc name template', size=64, translate=False)
|
|
}
|
|
|
|
edit_url_template = 'https://docs.google.com/Edit?docid=%s'
|
|
prefix_gdoc_id_res = DOCUMENT_LABEL + ':'
|
|
|
|
def copy_gdoc(self, cr, uid, model, folder=None, 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 folder: folder in which to store the copy.
|
|
@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={}
|
|
|
|
template_vars = {
|
|
'db' : cr.dbname,
|
|
'model' : model,
|
|
'id' : id,
|
|
'salt' : salt,
|
|
'name' : '',
|
|
}
|
|
name_template = 'Sales order %s'
|
|
|
|
# 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= self.name_template % (model, ))
|
|
|
|
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(prefix_gdoc_id_res), 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.
|
|
@return -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
|
|
|
|
|
|
class google_docs_folder(osv.osv):
|
|
_name = 'google.docs.folder'
|
|
_columns = {
|
|
'res_id': fields.char('GDocs resource id', size=64, translate=False),
|
|
}
|