diff --git a/addons/account/account.py b/addons/account/account.py index 04a0bb5da68..61319f7f973 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -1965,13 +1965,12 @@ class account_add_tmpl_wizard(osv.osv_memory): if not tids or not tids[0]['parent_id']: return False ptids = tmpl_obj.read(cr, uid, [tids[0]['parent_id'][0]],['code']) + res = None if not ptids or not ptids[0]['code']: raise osv.except_osv(_('Error !'), _('Cannot locate parent code for template account!')) res = acc_obj.search(cr,uid,[('code','=',ptids[0]['code'])]) - if res: - return res[0] - else: - return False + + return res and res[0] or False _columns = { 'cparent_id':fields.many2one('account.account', 'Parent target', help="Creates an account with the selected template under this existing parent.", required=True), diff --git a/addons/account/partner_view.xml b/addons/account/partner_view.xml index e1e43420d6e..7fbc1c14eb7 100644 --- a/addons/account/partner_view.xml +++ b/addons/account/partner_view.xml @@ -133,11 +133,7 @@ - - - - - + diff --git a/addons/base_action_rule/base_action_rule.py b/addons/base_action_rule/base_action_rule.py index a1213dd7542..85c4e9d4480 100644 --- a/addons/base_action_rule/base_action_rule.py +++ b/addons/base_action_rule/base_action_rule.py @@ -19,14 +19,16 @@ # ############################################################################## -import time -import mx.DateTime -import re - -import tools +from datetime import datetime from osv import fields, osv, orm from osv.orm import except_orm +from osv.osv import osv_pool from tools.translate import _ +import mx.DateTime +import pooler +import re +import time +import tools class base_action_rule(osv.osv): """ Base Action Rules """ @@ -132,6 +134,74 @@ the rule to mark CC(mail to any other person defined in actions)."), _order = 'sequence' + def pre_action(self, cr, uid, ids, model, context=None): + # Searching for action rules + cr.execute("SELECT m.model, r.id from base_action_rule r left join ir_model m on (m.id = r.name)") + res = cr.fetchall() + # Check if any rule matching with current object + for obj_name, rule_id in res: + if not (model == obj_name): + continue + else: + obj = self.pool.get(obj_name) + self._action(cr, uid, [rule_id], obj.browse(cr, uid, ids, context=context)) + return True + + def new_create(self, old_create, model, context=None): + if not context: + context = {} + def make_call_old(cr, uid, vals, context=context): + new_id = old_create(cr, uid, vals, context=context) + if not context.get('action'): + self.pre_action(cr, uid, [new_id], model, context=context) + return new_id + return make_call_old + + def new_write(self, old_write, model, context=None): + if not context: + context = {} + def make_call_old(cr, uid, ids, vals, context=context): + if isinstance(ids, (str, int, long)): + ids = [ids] + if not context.get('action'): + self.pre_action(cr, uid, ids, model, context=context) + return old_write(cr, uid, ids, vals, context=context) + return make_call_old + + def create(self, cr, uid, vals, context=None): + if not context: + context = {} + res_id = super(base_action_rule, self).create(cr, uid, vals, context) + model_pool = self.pool.get('ir.model') + model = model_pool.browse(cr, uid, vals.get('name'), context=context).model + obj_pool = self.pool.get(model) + obj_pool.__setattr__('old_create', obj_pool.create) + obj_pool.__setattr__('old_write', obj_pool.write) + obj_pool.__setattr__('create', self.new_create(obj_pool.create, model, context=context)) + obj_pool.__setattr__('write', self.new_write(obj_pool.write, model, context=context)) + return res_id + + def write(self, cr, uid, ids, vals, context=None): + res = super(base_action_rule, self).write(cr, uid, ids, vals, context) + model_pool = self.pool.get('ir.model') + if not context: + context = {} + for rule in self.browse(cr, uid, ids, context=context): + model = model_pool.browse(cr, uid, rule.name.id, context=context).model + obj_pool = self.pool.get(model) + obj_pool.__setattr__('old_create', obj_pool.create) + obj_pool.__setattr__('old_write', obj_pool.write) + obj_pool.__setattr__('create', self.new_create(obj_pool.create, model, context=context)) + obj_pool.__setattr__('write', self.new_write(obj_pool.write, model, context=context)) + return res + + def _check(self, cr, uid, automatic=False, use_new_cursor=False, \ + context=None): + rule_pool= self.pool.get('base.action.rule') + rule_ids = rule_pool.search(cr, uid, [], context=context) + return rule_pool.write(cr, uid, rule_ids, {}, context=context) + + def format_body(self, body): """ Foramat Action rule's body @param self: The object pointer """ @@ -235,6 +305,7 @@ the rule to mark CC(mail to any other person defined in actions)."), context.update({'active_id':obj.id, 'active_ids':[obj.id]}) self.pool.get('ir.actions.server').run(cr, uid, [action.server_action_id.id], context) write = {} + if hasattr(obj, 'user_id') and action.act_user_id: obj.user_id = action.act_user_id write['user_id'] = action.act_user_id.id @@ -279,12 +350,10 @@ the rule to mark CC(mail to any other person defined in actions)."), @param ids: List of Basic Action Rule’s IDs, @param objects: pass objects @param context: A standard dictionary for contextual values """ - + context.update({'action': True}) if not scrit: scrit = [] - cr.execute("select id from base_action_rule order by sequence") - rule_ids = map(lambda x: x[0], cr.fetchall()) - for action in self.browse(cr, uid, rule_ids): + for action in self.browse(cr, uid, ids): level = action.max_level if not level: break @@ -333,6 +402,7 @@ the rule to mark CC(mail to any other person defined in actions)."), self.do_action(cr, uid, action, model_obj, obj, context) break level -= 1 + context.update({'action': False}) return True def _check_mail(self, cr, uid, ids, context=None): @@ -359,4 +429,27 @@ the rule to mark CC(mail to any other person defined in actions)."), base_action_rule() + +class ir_cron(osv.osv): + _inherit = 'ir.cron' + + def _poolJobs(self, db_name, check=False): + try: + db, pool = pooler.get_db_and_pool(db_name) + except: + return False + cr = db.cursor() + try: + next = datetime.now().strftime('%Y-%m-%d %H:00:00') + # Putting nextcall always less than current time in order to call it every time + cr.execute('UPDATE ir_cron set nextcall = \'%s\' where numbercall<>0 and active and model=\'base.action.rule\' ' % (next)) + cr.commit() + res = super(ir_cron, self)._poolJobs(db_name, check=check) + finally: + cr.commit() + cr.close() + +ir_cron() + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/crm/crm_lead_view.xml b/addons/crm/crm_lead_view.xml index 31872e27ef4..dbfbeedf0a8 100644 --- a/addons/crm/crm_lead_view.xml +++ b/addons/crm/crm_lead_view.xml @@ -12,9 +12,11 @@ [('object_id.model', '=', 'crm.lead')] {'object_id':'crm.lead'} - + + + @@ -26,10 +28,11 @@ [('object_id.model', '=', 'crm.lead')] {'object_id':'crm.lead'} - + + diff --git a/addons/crm/crm_meeting.py b/addons/crm/crm_meeting.py index e45ee85b31d..133cb98f9dc 100644 --- a/addons/crm/crm_meeting.py +++ b/addons/crm/crm_meeting.py @@ -57,7 +57,8 @@ class crm_meeting(osv.osv, crm_case): Define Responsible user and Email account for mail gateway.'), 'email_from': fields.char('Email', size=128, help="These people will receive email."), 'id': fields.integer('ID'), - + 'create_date': fields.datetime('Creation Date' , readonly=True), + 'write_date': fields.datetime('Write Date' , readonly=True), # Meeting fields 'thread_id': fields.many2one('mailgate.thread', 'Thread', required=False), 'categ_id': fields.many2one('crm.case.categ', 'Meeting Type', \ diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml index e84bbb673ee..e2decc30340 100644 --- a/addons/crm/crm_meeting_view.xml +++ b/addons/crm/crm_meeting_view.xml @@ -13,8 +13,8 @@ {'object_id':'crm.meeting'} - + diff --git a/addons/crm/crm_opportunity_view.xml b/addons/crm/crm_opportunity_view.xml index 8b5cc42c502..407c3c53cf4 100644 --- a/addons/crm/crm_opportunity_view.xml +++ b/addons/crm/crm_opportunity_view.xml @@ -14,8 +14,8 @@ + id="menu_crm_case_opportunity-act" name="Categories" + parent="menu_crm_config_opportunity" /> @@ -29,8 +29,8 @@ + id="menu_crm_opportunity_stage_act" name="Stages" + parent="menu_crm_config_opportunity" /> @@ -44,8 +44,8 @@ + id="menu_crm_opportunity_resource_act" name="Resource" + parent="menu_crm_config_opportunity" /> @@ -329,7 +329,7 @@ - + diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml index 65b77ed5abe..c5813a38b09 100644 --- a/addons/crm/crm_phonecall_view.xml +++ b/addons/crm/crm_phonecall_view.xml @@ -13,8 +13,8 @@ {'object_id':'crm.phonecall'} - + @@ -27,10 +27,9 @@ {'object_id':'crm.phonecall'} - - + diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml index 52450419fd2..f854981858c 100644 --- a/addons/crm/crm_view.xml +++ b/addons/crm/crm_view.xml @@ -1,8 +1,20 @@ - + + + + + + + + + @@ -117,9 +129,7 @@ - - - + crm.case.categ.form @@ -156,11 +166,11 @@ form - + id="menu_crm_case_section_act" sequence="4" + parent="base.menu_crm_config_sales" /> + @@ -201,8 +211,6 @@ form - Cases by section @@ -342,10 +350,11 @@ form tree,form - + groups="base.group_extended" sequence="5" + parent="base.menu_crm_config_sales" /> view.users.form.crm.modif.inherited1 diff --git a/addons/crm/res_partner_view.xml b/addons/crm/res_partner_view.xml index 24523f7b072..254d2c8f3b4 100644 --- a/addons/crm/res_partner_view.xml +++ b/addons/crm/res_partner_view.xml @@ -11,52 +11,48 @@ - - - - - - - - - - - - - - - - - -