bzr revid: dle@openerp.com-20130626095736-0ni7i86wckc6coo5
This commit is contained in:
Denis Ledoux 2013-06-26 11:57:36 +02:00
parent 2da193d242
commit 66520d9e8e
3 changed files with 38 additions and 41 deletions

View File

@ -37,7 +37,7 @@ class base_config_settings(osv.osv_memory):
'module_auth_oauth': fields.boolean('Use external authentication providers, sign in with google, facebook, ...'),
'module_base_import': fields.boolean("Allow users to import data from CSV files"),
'module_google_drive': fields.boolean('Attach a google document to any record',
help="""This installs the module google_docs."""),
help="""This installs the module google_docs."""),
}
def open_company(self, cr, uid, ids, context=None):

View File

@ -44,7 +44,7 @@
Integrate google document to OpenERP record.
============================================
This module allows you to integrate google documents to any of your OpenERP record quickly and easily using OAuth 2.0 for Installed Applications,
This module allows you to integrate google documents to any of your OpenERP record quickly and easily using OAuth 2.0 for Installed Applications,
You can configure your google Authorization Code from Settings > Configuration > General Settings by clicking on "Generate Google Authorization Code"
"""
}

View File

@ -18,9 +18,7 @@
#
##############################################################################
import logging
from datetime import datetime
from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
from openerp import SUPERUSER_ID
from openerp.osv import fields, osv
from openerp.tools.translate import _
@ -32,10 +30,11 @@ import json
_logger = logging.getLogger(__name__)
class config(osv.osv):
_name = 'google.drive.config'
_description = "Google Drive templates config"
def get_google_doc_name(self, cr, uid, ids, res_id, tamplate_id, context=None):
pool_model = self.pool.get("ir.model")
res = {}
@ -48,13 +47,13 @@ class config(osv.osv):
model_name = model.name
filter_name = config.filter_id and config.filter_id.name or False
record = self.pool.get(res_model).read(cr, uid, res_id, [], context=context)
record.update({'model': model_name, 'filter':filter_name})
record.update({'model': model_name, 'filter': filter_name})
name_gdocs = config.name_template or "%(name)s_%(model)s_%(filter)s_gdrive"
try:
name_gdocs = name_gdocs % record
except:
raise osv.except_osv(_('Key Error!'), _("Your Google Doc Name Pattern's key does not found in object."))
attach_pool = self.pool.get("ir.attachment")
attach_ids = attach_pool.search(cr, uid, [('res_model', '=', res_model), ('name', '=', name_gdocs), ('res_id', '=', res_id)])
url = False
@ -65,51 +64,51 @@ class config(osv.osv):
url = self.copy_doc(cr, uid, ids, res_id, tamplate_id, name_gdocs, res_model, context)
res[config.id] = {'url': url}
return res
def copy_doc(self, cr, uid, ids, res_id, tamplate_id, name_gdocs, res_model, context=None):
ir_config = self.pool[ 'ir.config_parameter']
ir_config = self.pool['ir.config_parameter']
google_drive_client_id = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_client_id')
google_drive_client_secret = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_client_secret')
google_drive_refresh_token = ir_config.get_param(cr, SUPERUSER_ID, 'google_drive_refresh_token')
google_web_base_url = ir_config.get_param(cr, SUPERUSER_ID, 'web.base.url')
#For Getting New Access Token With help of old Refresh Token
#For Getting New Access Token With help of old Refresh Token
headers = {"Content-type": "application/x-www-form-urlencoded"}
data = dict(client_id = google_drive_client_id,
refresh_token = google_drive_refresh_token,
client_secret = google_drive_client_secret,
grant_type = "refresh_token")
data = urllib.urlencode(data)
data = dict(client_id=google_drive_client_id,
refresh_token=google_drive_refresh_token,
client_secret=google_drive_client_secret,
grant_type="refresh_token")
data = urllib.urlencode(data)
resp, content = Http().request("https://accounts.google.com/o/oauth2/token", "POST", data, headers)
content = json.loads(content)
# Copy template in to drive with help of new access token
if content.has_key('access_token'):
if 'access_token' in content:
request_url = "https://www.googleapis.com/drive/v2/files/%s?fields=parents/id&access_token=%s" % (tamplate_id, content['access_token'])
resp, parents = Http().request(request_url, "GET")
parents_dict = json.loads(parents)
headers = {'Content-type': 'application/json', 'Accept': 'text/plain'}
record_url = "Click on link to open Record in OpenERP\n %s/?db=%s#id=%s&model=%s" %(google_web_base_url, cr.dbname, res_id, res_model )
data = {"title": name_gdocs, "description": record_url, "parents":parents_dict['parents']}
record_url = "Click on link to open Record in OpenERP\n %s/?db=%s#id=%s&model=%s" % (google_web_base_url, cr.dbname, res_id, res_model)
data = {"title": name_gdocs, "description": record_url, "parents": parents_dict['parents']}
request_url = "https://www.googleapis.com/drive/v2/files/%s/copy?access_token=%s" % (tamplate_id, content['access_token'])
resp, content = Http().request(request_url, "POST", json.dumps(data), headers)
content = json.loads(content)
res = False
if 'alternateLink' in content.keys():
attach_pool = self.pool.get("ir.attachment")
attach_vals = {'res_model': res_model, 'name': name_gdocs, 'res_id': res_id, 'type': 'url', 'url':content['alternateLink']}
attach_vals = {'res_model': res_model, 'name': name_gdocs, 'res_id': res_id, 'type': 'url', 'url': content['alternateLink']}
attach_pool.create(cr, uid, attach_vals)
res = content['alternateLink']
else:
raise self.pool.get('res.config.settings').get_config_warning(cr, _("You haven't configured 'Authorization Code' generated from google, Please generate and configure it in %(menu:base_setup.menu_general_configuration)s."), context=context)
return res
def get_google_drive_config(self, cr, uid, res_model, res_id, context=None):
'''
Function called by the js, when no google doc are yet associated with a record, with the aim to create one. It
will first seek for a google.docs.config associated with the model `res_model` to find out what's the template
of google doc to copy (this is usefull if you want to start with a non-empty document, a type or a name
of google doc to copy (this is usefull if you want to start with a non-empty document, a type or a name
different than the default values). If no config is associated with the `res_model`, then a blank text document
with a default name is created.
:param res_model: the object for which the google doc is created
@ -122,21 +121,20 @@ class config(osv.osv):
# check if a model is configured with a template
config_ids = self.search(cr, uid, [('model_id', '=', res_model)], context=context)
configs = []
for config in self.browse(cr, SUPERUSER_ID, config_ids, context=context):
for config in self.browse(cr, SUPERUSER_ID, config_ids, context=context):
if config.filter_id:
if (config.filter_id.user_id and config.filter_id.user_id.id != uid):
#Private
continue
google_doc_configs = self._filter(cr, uid, config, config.filter_id, res_id, context=context)
if google_doc_configs:
if google_doc_configs:
configs.append({'id': config.id, 'name': config.name})
else:
configs.append({'id': config.id, 'name': config.name})
return configs
def _filter(self, cr, uid, action, action_filter, record_ids, context=None):
""" filter the list record_ids that satisfy the action filter """
records = {}
if record_ids and action_filter:
if not action.model_id == action_filter.model_id:
raise osv.except_osv(_('Warning!'), _("Something went wrong with the configuration of attachments with google drive.Please contact your Administrator to fix the problem."))
@ -146,11 +144,11 @@ class config(osv.osv):
ctx.update(eval(action_filter.context))
record_ids = model.search(cr, uid, domain, context=ctx)
return record_ids
def _list_all_models(self, cr, uid, context=None):
cr.execute("SELECT model, name from ir_model order by name")
return cr.fetchall()
def _resource_get(self, cr, uid, ids, name, arg, context=None):
result = {}
for data in self.browse(cr, uid, ids, context):
@ -158,7 +156,6 @@ class config(osv.osv):
try:
url = urlparse(template_url)
res = url.path.split('/')
resource = res[1]
if res[1] == "spreadsheet":
key = url.query.split('=')[1]
else:
@ -167,7 +164,7 @@ class config(osv.osv):
except:
raise osv.except_osv(_('Incorrect URL!'), _("Please enter a valid URL."))
return result
def _client_id_get(self, cr, uid, ids, name, arg, context=None):
result = {}
for config_id in ids:
@ -176,27 +173,27 @@ class config(osv.osv):
return result
_columns = {
'name' : fields.char('Template Name', required=True, size=1024),
'name': fields.char('Template Name', required=True, size=1024),
'model_id': fields.selection(_list_all_models, 'Model', required=True),
'filter_id' : fields.many2one('ir.filters', 'Filter'),
'filter_id': fields.many2one('ir.filters', 'Filter'),
'google_drive_template_url': fields.char('Template URL', required=True, size=1024),
'google_drive_resource_id' : fields.function(_resource_get, type="char" , string='Resource Id'),
'google_drive_client_id' : fields.function(_client_id_get, type="char" , string='Google Client '),
'google_drive_resource_id': fields.function(_resource_get, type="char", string='Resource Id'),
'google_drive_client_id': fields.function(_client_id_get, type="char", string='Google Client '),
'name_template': fields.char('Google Drive Name Pattern', size=64, help='Choose how the new google drive will be named, on google side. Eg. gdoc_%(field_name)s', required=True),
}
def onchange_model_id(self, cr, uid, ids, model_id, context=None):
res = {'domain':{'filter_id':[]}}
if model_id:
res = {'domain': {'filter_id': []}}
if model_id:
res['domain'] = {'filter_id': [('model_id', '=', model_id)]}
else:
res['value'] = {'filter_id': False}
return res
else:
res['value'] = {'filter_id': False}
return res
_defaults = {
'name_template': '%(name)s_%(model)s_%(filter)s_gdrive',
}
def _check_model_id(self, cr, uid, ids, context=None):
config_id = self.browse(cr, uid, ids[0], context=context)
if config_id.filter_id.id and config_id.model_id != config_id.filter_id.model_id: