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.py142
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()