[IMP]Making gdoc_resource_id as a function field and Checking for the google doc template and creating while creating and editing any record matching the filter criteria

bzr revid: dhr@tinyerp.com-20130305131757-sseqparoc0j2m9ax
This commit is contained in:
Dharti Ratani (Open ERP) 2013-03-05 18:47:57 +05:30
parent bc7563ed87
commit 7db017fb82
2 changed files with 142 additions and 3 deletions

View File

@ -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()

View File

@ -32,7 +32,8 @@
filter on Agrolait and save the filter.
</p>
</div>
<field name='template_url' placeholder="https://docs.google.com/document/d/1vOtpJK9scIQz6taD9tJRIETWbEw3fSiaQHArsJYcua4/edit"/>
<field name='gdocs_template_url' placeholder="https://docs.google.com/document/d/1vOtpJK9scIQz6taD9tJRIETWbEw3fSiaQHArsJYcua4/edit" required="1"/>
<field name='gdocs_resource_id' invisible="1"/>
<label for='name_template'/>
<div>
<field name='name_template'/>