diff --git a/addons/crm/crm.py b/addons/crm/crm.py index 238029a3f58..1a2f0716abe 100644 --- a/addons/crm/crm.py +++ b/addons/crm/crm.py @@ -122,7 +122,9 @@ class crm_case_section(osv.osv): 'note': fields.text('Description'), 'working_hours': fields.float('Working Hours', digits=(16,2 )), 'stage_ids': fields.many2many('crm.case.stage', 'section_stage_rel', 'section_id', 'stage_id', 'Stages'), - 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="cascade", required=True), + 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="restrict", required=True, + help="This Unique Mail Box Alias of the Sales Team allows to manage the Seamless email communication between Mail Box and OpenERP," + "This Alias MailBox also create and Manage the new Email Leads for this Sales Team and also manage the existing Lead email communication."), } def _get_stage_common(self, cr, uid, context): @@ -158,33 +160,19 @@ class crm_case_section(osv.osv): name = record['parent_id'][1] + ' / ' + name res.append((record['id'], name)) return res - - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(crm_case_section,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context) - if not domain: - doc = etree.XML(res['arch']) - alias_node = doc.xpath("//field[@name='alias_id']")[0] - parent = alias_node.getparent() - parent.remove(alias_node) - res['arch'] = etree.tostring(doc) - return res def create(self, cr, uid, vals, context=None): - model_pool = self.pool.get('ir.model.data') alias_pool = self.pool.get('mail.alias') if not vals.get('alias_id'): - model, res_id = model_pool.get_object_reference( cr, uid, "crm", "model_crm_lead") - vals.update({'alias_name': "sales", - 'alias_model_id': res_id}) - alias_pool.create_unique_alias(cr, uid, vals, context=context) - res = super(crm_case_section, self).create(cr, uid, vals, context) - record = self.read(cr, uid, res, context) - alias_pool.write(cr, uid, [record['alias_id']],{'alias_defaults':{'section_id':record['id'],'type':'lead'}},context) - return res - return super(crm_case_section, self).create(cr, uid, vals, context) - + name = vals.get('alias_name') or vals['name'] + alias_id = alias_pool.create_unique_alias(cr, uid, + {'alias_name': "sales_team_"+name, + 'alias_model_id': self._name}, context=context) + alias = alias_pool.read(cr, uid, alias_id, ['alias_name'],context) + vals.update({'alias_id': alias_id, 'alias_name': alias['alias_name']}) + res = super(crm_case_section, self).create(cr, uid, vals, context) + alias_pool.write(cr, uid, [vals['alias_id']],{'alias_defaults':{'section_id': res,'type':'lead'}},context) + return res class crm_case_categ(osv.osv): """ Category of Case """ diff --git a/addons/crm/crm_view.xml b/addons/crm/crm_view.xml index 6e4bfd8cdc8..8bb255ec4ac 100644 --- a/addons/crm/crm_view.xml +++ b/addons/crm/crm_view.xml @@ -71,8 +71,8 @@ - + @@ -90,6 +90,12 @@ + +
+
+
diff --git a/addons/fetchmail/fetchmail.py b/addons/fetchmail/fetchmail.py index 55923c3043a..f0e6a5179b4 100644 --- a/addons/fetchmail/fetchmail.py +++ b/addons/fetchmail/fetchmail.py @@ -71,7 +71,7 @@ class fetchmail_server(osv.osv): 'password' : fields.char('Password', size=1024, readonly=True, states={'draft':[('readonly', False)]}), 'action_id':fields.many2one('ir.actions.server', 'Server Action', help="Optional custom server action to trigger for each incoming mail, " "on the record that was created or updated by this mail"), - 'object_id': fields.many2one('ir.model', "Create a New Record", required=True, help="Process each incoming mail as part of a conversation " + 'object_id': fields.many2one('ir.model', "Create a New Record", help="Process each incoming mail as part of a conversation " "corresponding to this document type. This will create " "new documents for new conversations, or attach follow-up " "emails to the existing conversations (documents)."), @@ -189,10 +189,14 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS result, data = imap_server.search(None, '(UNSEEN)') for num in data[0].split(): result, data = imap_server.fetch(num, '(RFC822)') - res_id = mail_thread.message_process(cr, uid, server.object_id.model, data[0][1], - save_original=server.original, - strip_attachments=(not server.attach), - context=context) + if server.object_id: + res_id = mail_thread.message_process(cr, uid, server.object_id.model, + data[0][1], + save_original=server.original, + strip_attachments=(not server.attach), + context=context) + else: + res_id = mail_thread.message_catchall(cr, uid, data[0][1]) if res_id and server.action_id: action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]}) imap_server.store(num, '+FLAGS', '\\Seen') @@ -213,11 +217,14 @@ openerp_mailgate.py -u %(uid)d -p PASSWORD -o %(model)s -d %(dbname)s --host=HOS for num in range(1, numMsgs + 1): (header, msges, octets) = pop_server.retr(num) msg = '\n'.join(msges) - res_id = mail_thread.message_process(cr, uid, server.object_id.model, - msg, - save_original=server.original, - strip_attachments=(not server.attach), - context=context) + if server.object_id: + res_id = mail_thread.message_process(cr, uid, server.object_id.model, + msg, + save_original=server.original, + strip_attachments=(not server.attach), + context=context) + else: + res_id = mail_thread.message_catchall(cr, uid, data[0][1]) if res_id and server.action_id: action_pool.run(cr, uid, [server.action_id.id], {'active_id': res_id, 'active_ids':[res_id]}) pop_server.dele(num) diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index a5f0afaeb22..f4cd6f019c9 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -545,33 +545,23 @@ class hr_job(osv.osv): _inherits = {'mail.alias': 'alias_id'} _columns = { 'survey_id': fields.many2one('survey', 'Interview Form', help="Choose an interview form for this job position and you will be able to print/answer this interview from all applicants who apply for this job"), - 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="cascade", required=True), + 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="restrict", required=True, + help="This Unique Mail Box Alias of the Job allows to manage the Seamless email communication between Mail Box and OpenERP," + "This Alias MailBox also create and Manage the new Email applicant for this job and also manage the existing applicant email communication."), } - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(hr_job,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context) - if not domain: - doc = etree.XML(res['arch']) - alias_node = doc.xpath("//field[@name='alias_id']")[0] - parent = alias_node.getparent() - parent.remove(alias_node) - res['arch'] = etree.tostring(doc) - return res - def create(self, cr, uid, vals, context=None): - model_pool = self.pool.get('ir.model.data') alias_pool = self.pool.get('mail.alias') - res_id = model_pool.get_object( cr, uid, "hr_recruitment", "model_hr_applicant") - vals.update({'alias_name': "job", - 'alias_model_id': res_id.id}) - alias_pool.create_unique_alias(cr, uid, vals, context=context) + if not vals.get('alias_id'): + name = vals.get('alias_name') or vals['name'] + alias_id = alias_pool.create_unique_alias(cr, uid, + {'alias_name': "job_"+name, + 'alias_model_id': self._name}, context=context) + alias = alias_pool.read(cr, uid, alias_id, ['alias_name'],context) + vals.update({'alias_id': alias_id, 'alias_name': alias['alias_name']}) res = super( hr_job, self).create(cr, uid, vals, context) - record = self.read(cr, uid, res, context) - alias_pool.write(cr, uid, [record['alias_id']], {"alias_defaults": {'job_id': record['id']}}, context) + alias_pool.write(cr, uid, [vals['alias_id']], {"alias_defaults": {'job_id': res}}, context) return res - def action_print_survey(self, cr, uid, ids, context=None): if context is None: diff --git a/addons/hr_recruitment/hr_recruitment_data.xml b/addons/hr_recruitment/hr_recruitment_data.xml index aed3fe1667e..f073b85ffad 100644 --- a/addons/hr_recruitment/hr_recruitment_data.xml +++ b/addons/hr_recruitment/hr_recruitment_data.xml @@ -451,7 +451,7 @@ - Jobs + jobs {} diff --git a/addons/hr_recruitment/hr_recruitment_demo.yml b/addons/hr_recruitment/hr_recruitment_demo.yml index c616e9e7e95..7ec4efa7df7 100644 --- a/addons/hr_recruitment/hr_recruitment_demo.yml +++ b/addons/hr_recruitment/hr_recruitment_demo.yml @@ -1,6 +1,6 @@ - !record {model: mail.alias, id: alias_job_devloper, view: False}: - alias_name: 'job-developer' + alias_name: 'job_developer' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -12,7 +12,7 @@ alias_id: alias_job_devloper - !record {model: mail.alias, id: alias_job_ceo, view: False}: - alias_name: 'job-ceo' + alias_name: 'job_ceo' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -24,7 +24,7 @@ alias_id: alias_job_ceo - !record {model: mail.alias, id: alias_job_cto, view: False}: - alias_name: 'job-cto' + alias_name: 'job_cto' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -36,7 +36,7 @@ alias_id: alias_job_cto - !record {model: mail.alias, id: alias_job_hr_manager, view: False}: - alias_name: 'job-hr-manager' + alias_name: 'job_hr_manager' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -48,7 +48,7 @@ alias_id: alias_job_hr_manager - !record {model: mail.alias, id: alias_job_consultant, view: False}: - alias_name: 'job-consultant' + alias_name: 'job_consultant' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -60,7 +60,7 @@ alias_id: alias_job_consultant - !record {model: mail.alias, id: alias_job_hrm, view: False}: - alias_name: 'job-hrm' + alias_name: 'job_hrm' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -72,7 +72,7 @@ alias_id: alias_job_hrm - !record {model: mail.alias, id: alias_job_marketing, view: False}: - alias_name: 'job-marketing' + alias_name: 'job_marketing' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' @@ -84,7 +84,7 @@ alias_id: alias_job_marketing - !record {model: mail.alias, id: alias_job_trainee, view: False}: - alias_name: 'job-trainees' + alias_name: 'job_trainees' alias_model_id: model_hr_applicant alias_user_id: base.user_root alias_defaults: '{}' diff --git a/addons/hr_recruitment/hr_recruitment_view.xml b/addons/hr_recruitment/hr_recruitment_view.xml index 92bfec32197..963c26eb1fb 100644 --- a/addons/hr_recruitment/hr_recruitment_view.xml +++ b/addons/hr_recruitment/hr_recruitment_view.xml @@ -382,7 +382,9 @@ - +
+ @ +
diff --git a/addons/mail/mail_alias.py b/addons/mail/mail_alias.py index 292b2f742cd..4ca22132b4a 100644 --- a/addons/mail/mail_alias.py +++ b/addons/mail/mail_alias.py @@ -19,9 +19,11 @@ # ############################################################################## +import re from openerp.osv import fields, osv from tools.translate import _ + class mail_alias(osv.Model): """A Mail Alias is a mapping of an email address with a given OpenERP Document model. It is used by OpenERP's mail gateway when processing incoming emails @@ -39,6 +41,14 @@ class mail_alias(osv.Model): _description = "Mail Alias" _rec_name = 'alias_name' + def _get_alias_domain(self, cr, uid, ids, name, args, context=None): + res = {} + config_parameter_pool = self.pool.get("ir.config_parameter") + domain = config_parameter_pool.get_param(cr, uid, "mail.catchall.domain", context=context) + for alias in self.browse(cr, uid, ids, context=context): + res[alias.id] = domain or "" + return res + _columns = { 'alias_name': fields.char('Mailbox Alias', size=255, required=True, help="The name of the mailbox alias, e.g. 'jobs' " @@ -63,7 +73,8 @@ class mail_alias(osv.Model): 'alias_force_thread_id': fields.integer('Record Thread ID', help="Optional ID of the thread (record) to which all " "messages will be attached, even if they did not reply to it. " - "If set, this will disable the creation of new records completely.") + "If set, this will disable the creation of new records completely."), + 'alias_domain': fields.function(_get_alias_domain, string="Alias Doamin", type='char', size=None), } _defaults = { 'alias_defaults': '{}', @@ -82,9 +93,9 @@ class mail_alias(osv.Model): for record in self.browse(cr, uid, ids, context=context): try: dict(eval(record.alias_defaults)) - return True except: return False + return True _constraints = [ (_check_alias_defaults, "Default Values are in wrong format.\nIt must be in python dictionary format e.g.{'field_name': 'value' or {}}", ['alias_defaults']), @@ -96,25 +107,43 @@ class mail_alias(osv.Model): Email Alias Domain from config. e.g. `jobs@openerp.my.openerp.com` or `sales@openerp.my.openerp.com` """ - if context is None: - context = {} res = [] - config_parameter_pool = self.pool.get("ir.config_parameter") - domain = config_parameter_pool.get_param(cr, uid, "mail.catchall.domain", context=context) - for record in self.read(cr, uid, ids, ['alias_name'], context=context): - domain_alias = "%s@%s"%(record['alias_name'], domain) + for record in self.read(cr, uid, ids, ['alias_name', 'alias_domain'], context=context): + domain_alias = "%s@%s"%(record['alias_name'], record['alias_domain']) res.append((record['id'], domain_alias)) return res - def create_unique_alias(self, cr, uid, values, sequence=1 ,context=None): - if sequence: - prob_alias = "%s%s"%(values['alias_name'], sequence) - search_alias = self.search(cr, uid, [('alias_name', '=', prob_alias)]) - if search_alias: - values = self.create_unique_alias(cr, uid, values, sequence+1, context) - else: - values.update({'alias_name': prob_alias}) - return values + def _generate_alias(self, cr, uid, name, sequence=1 ,context=None): + """ + If alias is existing then this method will create a new unique alias name + by appending n sequence integer number. + """ + new_name = "%s%s"%(name, sequence) + search_alias = self.search(cr, uid, [('alias_name', '=', new_name)]) + if search_alias: + new_name = self._generate_alias(cr, uid, name, sequence+1 ,context=None) + if not self.search(cr, uid, [('alias_name', '=', new_name)]): + return new_name else: - return values.update({'alias_name': "%s"%(values['alias_name'])}) + return new_name + + def create_unique_alias(self, cr, uid, vals, context=None): + """ + Methods accepts the vals param in dict format and create new alias record + @vals : dict accept {alias_name: '', alias_model_id: '',...} + @return int: New alias_id + """ + model_pool = self.pool.get('ir.model') + alias_name = re.sub(r'\W+', '_', vals['alias_name']).lower() + values = {'alias_name': alias_name} + #Find for the mail alias exist or not if exit then get new mail address. + saids = self.search(cr, uid, [('alias_name', '=',alias_name)]) + if saids: + alias_name = self._generate_alias(cr, uid, alias_name, sequence=1, context=context) + values.update({'alias_name': alias_name}) + #Set the model fo rhte mail alias + model_sids = model_pool.search(cr, uid, [('model', '=', vals['alias_model_id'])]) + values.update({'alias_model_id': model_sids[0]}) + return self.create(cr, uid, values, context=context) + diff --git a/addons/mail/mail_alias_view.xml b/addons/mail/mail_alias_view.xml index e72143bdb9a..344a98d74db 100644 --- a/addons/mail/mail_alias_view.xml +++ b/addons/mail/mail_alias_view.xml @@ -11,12 +11,15 @@
+
diff --git a/addons/mail/mail_group.py b/addons/mail/mail_group.py index eef1bc9bda1..13ee1decf35 100644 --- a/addons/mail/mail_group.py +++ b/addons/mail/mail_group.py @@ -130,7 +130,9 @@ class mail_group(osv.osv): 'member_count': fields.function(get_member_ids, type='integer', string='Member count', multi='get_member_ids'), 'is_subscriber': fields.function(get_member_ids, type='boolean', string='Joined', multi='get_member_ids'), 'last_month_msg_nbr': fields.function(get_last_month_msg_nbr, type='integer', string='Messages count for last month'), - 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="cascade", required=True) + 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="restrict", required=True, + help="This Unique Mail Box Alias of the Group allows to manage the Seamless email communication between Mail Box and OpenERP," + "This Alias MailBox manage the Group email communication.") } _defaults = { @@ -139,26 +141,16 @@ class mail_group(osv.osv): 'photo': _get_default_photo, } - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(mail_group,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context) - if not domain: - doc = etree.XML(res['arch']) - alias_node = doc.xpath("//field[@name='alias_id']")[0] - parent = alias_node.getparent() - parent.remove(alias_node) - res['arch'] = etree.tostring(doc) - return res - def create(self, cr, uid, vals, context=None): - model_pool = self.pool.get('ir.model.data') alias_pool = self.pool.get('mail.alias') - model, res_id = model_pool.get_object_reference( cr, uid, "mail", "model_mail_group") - vals.update({'alias_name': "mailing-group", - 'alias_model_id': res_id}) - alias_pool.create_unique_alias(cr, uid, vals, context=context) - res = super( mail_group, self).create(cr, uid, vals, context) - record = self.read(cr, uid, res, context) - alias_pool.write(cr, uid, [record['alias_id']], {"alias_force_thread_id":record['id']}, context) + if not vals.get('alias_id'): + name = vals.get('alias_name') or vals['name'] + alias_id = alias_pool.create_unique_alias(cr, uid, + {'alias_name': "mail_group_"+name, + 'alias_model_id': self._name}, context=context) + alias = alias_pool.read(cr, uid, alias_id, ['alias_name'],context) + vals.update({'alias_id': alias_id, 'alias_name': alias['alias_name']}) + res = super(mail_group, self).create(cr, uid, vals, context) + alias_pool.write(cr, uid, [vals['alias_id']], {"alias_force_thread_id": res}, context) return res + diff --git a/addons/mail/mail_group_view.xml b/addons/mail/mail_group_view.xml index 1db7db12c39..21b88688fbb 100644 --- a/addons/mail/mail_group_view.xml +++ b/addons/mail/mail_group_view.xml @@ -60,13 +60,15 @@
-

+
+

+
+ @ +
+
-
- -
diff --git a/addons/mail/res_config.py b/addons/mail/res_config.py index 55efb2d80ac..3670ddf1f82 100644 --- a/addons/mail/res_config.py +++ b/addons/mail/res_config.py @@ -25,7 +25,7 @@ class project_configuration(osv.TransientModel): _inherit = 'base.config.settings' _columns = { - 'alias_domain' : fields.char('Catch-all Mail Alias Domain', size=None, + 'alias_domain' : fields.char('Alias Domain', size=None, help="If you have setup a catch-all mail domain redirected to " "the OpenERP server, enter the domain name here."), } diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py index e9a9d1222b7..12dde2ebff6 100644 --- a/addons/mail/res_users.py +++ b/addons/mail/res_users.py @@ -40,7 +40,9 @@ class res_users(osv.osv): ('none', 'Never') ], 'Receive Feeds by Email', required=True, help="Choose in which case you want to receive an email when you receive new feeds."), - 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="cascade", required=True), + 'alias_id': fields.many2one('mail.alias', 'Alias', ondelete="restrict", required=True, + help="This Unique Mail Box Alias of the User allows to manage the Seamless email communication between Mail Box and OpenERP," + "This Alias MailBox manage the Users email communication."), } _defaults = { @@ -58,28 +60,14 @@ class res_users(osv.osv): self.SELF_WRITEABLE_FIELDS.append('notification_email_pref') return init_res - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(res_users,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context) - if not domain: - doc = etree.XML(res['arch']) - alias_node = doc.xpath("//field[@name='alias_id']")[0] - parent = alias_node.getparent() - parent.remove(alias_node) - res['arch'] = etree.tostring(doc) - return res - def create(self, cr, uid, data, context=None): # create default alias same as the login - model_pool = self.pool.get('ir.model.data') alias_pool = self.pool.get('mail.alias') - res_id = model_pool.get_object( cr, uid, "mail", "model_res_users") - data.update({'alias_name': data.get('login'), - 'alias_model_id': res_id.id}) + alias_id = alias_pool.create_unique_alias(cr, uid, {'alias_name': data['login'], 'alias_model_id': self._name}, context=context) + data.update({'alias_id': alias_id}) user_id = super(res_users, self).create(cr, uid, data, context=context) + alias_pool.write(cr, uid, [alias_id], {"alias_force_thread_id": user_id}, context) user = self.browse(cr, uid, user_id, context=context) - alias_pool.write(cr, uid, [user.alias_id.id], {"alias_force_thread_id": user.id}, context) # make user follow itself self.message_subscribe(cr, uid, [user_id], [user_id], context=context) # create a welcome message to broadcast @@ -91,7 +79,7 @@ class res_users(osv.osv): def write(self, cr, uid, ids, vals, context=None): # if login of user have been changed then change alias of user also. - if 'login' in vals.keys(): + if vals.get('login'): for user in self.browse(cr, uid, ids, context=context): self.pool.get('mail.alias').write(cr, uid, [user.alias_id.id], {'alias_name': vals['login']}, context=context) return super(res_users, self).write(cr, uid, ids, vals, context=context) diff --git a/addons/mail/res_users_view.xml b/addons/mail/res_users_view.xml index 40084d762f4..06c485851e8 100644 --- a/addons/mail/res_users_view.xml +++ b/addons/mail/res_users_view.xml @@ -32,7 +32,9 @@ - + + + diff --git a/addons/project/project.py b/addons/project/project.py index 0823295f795..1a8d38efb2b 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -165,7 +165,7 @@ class project(osv.osv): res[task.project_id.id] += 1 return res def _get_alias_model(self, cr, uid, context=None): - return [('model_project_task', "Tasks")] + return [('project.task', "Tasks")] def _get_followers(self, cr, uid, ids, name, arg, context=None): ''' @@ -217,8 +217,11 @@ class project(osv.osv): 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), - 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="cascade", required=True), - 'alias_model': fields.selection(_get_alias_model, "Alias Model",select="1", required=True), + 'alias_id': fields.many2one('mail.alias', 'Mail Alias', ondelete="restrict", required=True, + help="This Unique Mail Box Alias of the Project allows to manage the Seamless email communication between Mail Box and OpenERP," + "This Alias MailBox also create and Manage the new Email Tasks/Issues for this Project and also manage the existing Task/Issue email communication."), + 'alias_model': fields.selection(_get_alias_model, "Alias Model",select="1", required=True, + help="Allows to select Model for the Mail alias .Based on selected model Task/issue will created for fetched mails or it will maintain communication for related Task/Issue."), 'privacy_visibility': fields.selection([('public','Public'), ('followers','Followers Only')], 'Privacy / Visibility'), 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,), 'followers': fields.function(_get_followers, method=True, fnct_search=_search_followers, @@ -239,7 +242,7 @@ class project(osv.osv): 'priority': 1, 'sequence': 10, 'type_ids': _get_type_common, - 'alias_model':'model_project_task', + 'alias_model':'project.task', } # TODO: Why not using a SQL contraints ? @@ -254,26 +257,6 @@ class project(osv.osv): (_check_dates, 'Error! project start-date must be lower then project end-date.', ['date_start', 'date']) ] - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(project,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form' or view_type == 'kanban': - domain = self.pool.get("ir.config_parameter").get_param(cr, uid, "mail.catchall.domain", context=context) - if not domain: - doc = etree.XML(res['arch']) - alias_node = doc.xpath("//field[@name='alias_id']")[0] - parent = alias_node.getparent() - parent.remove(alias_node) - if view_type == "form": - model_node = doc.xpath("//field[@name='alias_model']")[0] - parent = model_node.getparent() - parent.remove(model_node) - else: - model_node = doc.xpath("//field[@name='alias_id']")[0] - parent = model_node.getparent() - parent.remove(model_node) - res['arch'] = etree.tostring(doc) - return res - def set_template(self, cr, uid, ids, context=None): res = self.setActive(cr, uid, ids, value=False, context=context) return res @@ -330,10 +313,11 @@ class project(osv.osv): context['active_test'] = False default['state'] = 'open' default['tasks'] = [] + default['alias_id'] = False proj = self.browse(cr, uid, id, context=context) if not default.get('name', False): default['name'] = proj.name + _(' (copy)') - + default['alias_name'] = default['name'] res = super(project, self).copy(cr, uid, id, default, context) self.map_tasks(cr,uid,id,res,context) return res @@ -514,15 +498,16 @@ def Project(): return user_ids def create(self, cr, uid, vals, context=None): - model_pool = self.pool.get('ir.model.data') alias_pool = self.pool.get('mail.alias') - model, res_id = model_pool.get_object_reference( cr, uid, "project", vals.get('alias_model','model_project_task')) - vals.update({'alias_name':"project", - 'alias_model_id': res_id}) - alias_pool.create_unique_alias(cr, uid, vals, context=context) + if not vals.get('alias_id'): + name = vals.get('alias_name') or vals['name'] + alias_id = alias_pool.create_unique_alias(cr, uid, + {'alias_name': "project_"+name, + 'alias_model_id': self._name}, context=context) + alias = alias_pool.read(cr, uid, alias_id, ['alias_name'],context) + vals.update({'alias_id': alias_id, 'alias_name': alias['alias_name']}) res = super( project, self).create(cr, uid, vals, context) - record = self.read(cr, uid, res, context) - alias_pool.write(cr, uid, [record['alias_id']], {'alias_defaults':{'project_id': record['id']}}, context) + alias_pool.write(cr, uid, [vals['alias_id']], {'alias_defaults':{'project_id': res}}, context) self.create_send_note(cr, uid, [res], context=context) return res @@ -546,16 +531,15 @@ def Project(): return self.message_append_note(cr, uid, ids, body=message, context=context) def write(self, cr, uid, ids, vals, context=None): - model_pool = self.pool.get('ir.model.data') + model_pool = self.pool.get('ir.model') alias_pool = self.pool.get('mail.alias') # if alias_model have been changed then change alias_model_id of alias also. if vals.get('alias_model'): - model, res_id = model_pool.get_object_reference( cr, uid, "project", vals.get('alias_model','model_project_task')) + model_ids = model_pool.search(cr, uid, [('model', '=', vals.get('alias_model','project.task'))]) alias_id = self.browse(cr, uid, ids[0], context).alias_id - alias_pool.write(cr, uid, [alias_id.id], {'alias_model_id': res_id}, context=context) + alias_pool.write(cr, uid, [alias_id.id], {'alias_model_id': model_ids[0]}, context=context) return super(project, self).write(cr, uid, ids, vals, context=context) - class task(base_stage, osv.osv): _name = "project.task" _description = "Task" diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml index 889cc285af3..fb394d1bfca 100644 --- a/addons/project/project_demo.xml +++ b/addons/project/project_demo.xml @@ -66,7 +66,7 @@ ref('base.user_vad')])]" name="members"/> Integrate a Sale and Warehouse Management. - model_project_task + project.task @@ -291,7 +291,7 @@ - model_project_task + project.task 10 @@ -300,7 +300,7 @@ - model_project_task + project.task 20 @@ -309,7 +309,7 @@ - model_project_task + project.task 30 @@ -317,7 +317,7 @@ Install, data import, configuration - model_project_task + project.task diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 90fd41a1845..5af82ff526c 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -93,8 +93,6 @@ - - @@ -142,6 +140,14 @@ + +
+
+ +
@@ -238,6 +244,7 @@ +
@@ -262,14 +269,13 @@
Deadline
-
- -
Progress
/
- +
+ +
diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 5d73eda5faa..cb6548889fa 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -563,7 +563,7 @@ class project(osv.osv): _inherit = "project.project" def _get_alias_model(self, cr, uid, context=None): - return [('model_project_task', "Tasks"),("model_project_issue", "Issue")] + return [('project.task', "Tasks"),("project.issue", "Issue")] def _issue_count(self, cr, uid, ids, field_name, arg, context=None): res = dict.fromkeys(ids, 0) @@ -576,7 +576,8 @@ class project(osv.osv): 'project_escalation_id' : fields.many2one('project.project','Project Escalation', help='If any issue is escalated from the current Project, it will be listed under the project selected here.', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'reply_to' : fields.char('Reply-To Email Address', size=256), 'issue_count': fields.function(_issue_count, type='integer'), - 'alias_model': fields.selection(_get_alias_model, "Alias Model"), + 'alias_model': fields.selection(_get_alias_model, "Alias Model",select="1", required=True, + help="Allows to select Model for the Mail alias .Based on selected model Task/issue will created for fetched mails or it will maintain communication for related Task/Issue."), } def _check_escalation(self, cr, uid, ids, context=None): @@ -589,6 +590,7 @@ class project(osv.osv): _constraints = [ (_check_escalation, 'Error! You cannot assign escalation to the same project!', ['project_escalation_id']) ] + project() class account_analytic_account(osv.osv): diff --git a/addons/project_issue/project_issue_view.xml b/addons/project_issue/project_issue_view.xml index c6629f2f9d4..39e883adfe5 100644 --- a/addons/project_issue/project_issue_view.xml +++ b/addons/project_issue/project_issue_view.xml @@ -394,6 +394,9 @@ + + +