diff options
Diffstat (limited to 'addons/google_docs/google_docs.py')
| -rw-r--r-- | addons/google_docs/google_docs.py | 142 |
1 files changed, 140 insertions, 2 deletions
diff --git a/addons/google_docs/google_docs.py b/addons/google_docs/google_docs.py index 73f4bca3664..099890665f8 100644 --- a/addons/google_docs/google_docs.py +++ b/addons/google_docs/google_docs.py @@ -21,8 +21,10 @@ 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 _ +from urlparse import urlparse _logger = logging.getLogger(__name__) @@ -174,11 +176,27 @@ class google_docs_ir_attachment(osv.osv): class config(osv.osv): _name = 'google.docs.config' _description = "Google Drive templates config" + + def _resource_get(self, cr, uid, ids, name, arg, context=None): + result = {} + for data in self.browse(cr, uid, ids, context): + template_url = data.gdocs_template_url + url = urlparse(template_url) + res = url.path.split('/') + resource = res[1] + if res[1]== "spreadsheet": + key = url.query.split('=')[1] + else: + key = res[3] + res_id = resource + ":" + key + result[data.id] = str(res_id) + return result _columns = { 'model_id': fields.many2one('ir.model', 'Model', required=True), 'filter_id' : fields.many2one('ir.filters', 'Filter'), - 'template_url': fields.char('Template Url', required=True, size=1024), + 'gdocs_template_url': fields.char('Template Url', required=True, size=1024), + 'gdocs_resource_id' : fields.function(_resource_get,type="char" ,string='Resource Id',store=True), '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), } @@ -194,6 +212,126 @@ class config(osv.osv): return res _defaults = { - 'name_template': 'gdoc_%(name)s', + 'name_template': '%(name)s_model_filter_gdoc', } + + def _wrap_create(self, old_create, model): + """ Return a wrapper around `old_create` calling both `old_create` and + `_process`, in that order. + """ + def wrapper(cr, uid, vals, context=None): + # avoid loops or cascading actions + + if context and context.get('action'): + return old_create(cr, uid, vals, context=context) + + context = dict(context or {}, action=True) + new_id = old_create(cr, uid, vals, context=context) + + # as it is a new record, we do not consider the actions that have a prefilter + action_dom = [('model_id', '=', model)] + config_ids = self.search(cr, uid, action_dom, context=context) +# +# # check postconditions, and execute actions on the records that satisfy them + for action in self.browse(cr, uid, config_ids, context=context): + if self._filter(cr, uid, action, action.filter_id, [new_id], context=context): + self._process(cr, uid, action, [new_id], context=context) + return new_id + + return wrapper + + def _filter(self, cr, uid, action, action_filter, record_ids, context=None): + """ filter the list record_ids that satisfy the action filter """ + if record_ids and action_filter: + assert action.model_id.model == action_filter.model_id, "Filter model different from action rule model" + model = self.pool.get(action_filter.model_id) + domain = [('id', 'in', record_ids)] + eval(action_filter.domain) + ctx = dict(context or {}) + ctx.update(eval(action_filter.context)) + record_ids = model.search(cr, uid, domain, context=ctx) + return record_ids + + def _process(self, cr, uid, action, record_ids, context=None): + """ process the given action on the records """ + # execute server actions + model = self.pool.get(action.model_id.model) + template_url = action.gdocs_template_url + attach_obj = self.pool.get('ir.attachment') + for record_id in record_ids: + record_id = int(record_id) + model_fields_dic = self.pool.get(action.model_id.model).read(cr, uid, record_id, [], context=context) + name_gdocs = action.name_template + name_gdocs = name_gdocs.replace('model',action.model_id.name) + name_gdocs = name_gdocs.replace('filter',action.filter_id.name) + try: + name_gdocs = name_gdocs % model_fields_dic + except: + raise osv.except_osv(_('Key Error!'), _("Your Google Drive Name Pattern's key does not found in object.")) + attachments = attach_obj.search(cr, uid, [('res_id','=',record_id),('name','=',name_gdocs)]) + if not attachments: + google_template_id = action.gdocs_resource_id + attach_obj.copy_gdoc(cr, uid, action.model_id.model, record_id, name_gdocs, google_template_id, context=context) + return True + + def _wrap_write(self, old_write, model): + """ Return a wrapper around `old_write` calling both `old_write` and + `_process`, in that order. + """ + def wrapper(cr, uid, ids, vals, context=None): + # avoid loops or cascading actions + if context and context.get('action'): + return old_write(cr, uid, ids, vals, context=context) + + context = dict(context or {}, action=True) + ids = [ids] if isinstance(ids, (int, long, str)) else ids + + # retrieve the action rules to possibly execute + action_dom = [('model_id', '=', model)] + config_ids = self.search(cr, uid, action_dom, context=context) + gconfigs = self.browse(cr, uid, config_ids, context=context) + + # check preconditions + pre_ids = {} + for gconfig in gconfigs: + pre_ids[gconfig] = self._filter(cr, uid, gconfig, gconfig.filter_id, ids, context=context) + + # execute write + old_write(cr, uid, ids, vals, context=context) + + # check postconditions, and execute actions on the records that satisfy them + for gconfig in gconfigs: + post_ids = self._filter(cr, uid, gconfig, gconfig.filter_id, pre_ids[gconfig], context=context) + print 'post_idsss',post_ids + if post_ids: + print 'post_idsss',post_ids + self._process(cr, uid, gconfig, post_ids, context=context) + return True + + return wrapper + + def _register_hook(self, cr, ids=None): + """ Wrap the methods `create` and `write` of the models specified by + the rules given by `ids` (or all existing rules if `ids` is `None`.) + """ + if ids is None: + ids = self.search(cr, SUPERUSER_ID, []) + for config in self.browse(cr, SUPERUSER_ID, ids): + model = config.model_id.model + model_obj = self.pool.get(model) + model_obj.create = self._wrap_create(model_obj.create, model) + model_obj.write = self._wrap_write(model_obj.write, model) + return True + + def create(self, cr, uid, vals, context=None): + res_id = super(config, self).create(cr, uid, vals, context=context) + self._register_hook(cr, [res_id]) + return res_id + + def write(self, cr, uid, ids, vals, context=None): + if isinstance(ids, (int, long)): + ids = [ids] + super(config, self).write(cr, uid, ids, vals, context=context) + self._register_hook(cr, ids) + return True + config() |
