Jigar Amin  (OpenERP) has proposed merging 
lp:~openerp-dev/openobject-addons/trunk-mail-alias-jam into 
lp:~openerp-dev/openobject-addons/trunk-mail-alias.

Requested reviews:
  Olivier Dony (OpenERP) (odo-openerp)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-mail-alias-jam/+merge/113519

Mail Alias Improvements:
- Improved Views, Demo record, Unique alias method.
- Integrated the Mail Alias with fetch mail.
- Improved Views. Improved the relation field constrains. 
Thank You
-- 
https://code.launchpad.net/~openerp-dev/openobject-addons/trunk-mail-alias-jam/+merge/113519
Your team OpenERP R&D Team is subscribed to branch 
lp:~openerp-dev/openobject-addons/trunk-mail-alias.
=== modified file 'crm/crm.py'
--- crm/crm.py	2012-06-28 08:39:51 +0000
+++ crm/crm.py	2012-07-05 08:39:19 +0000
@@ -122,7 +122,9 @@
         '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):
@@ -165,26 +167,20 @@
             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]
+                alias_node = doc.xpath("//div[@name='alias_box']")[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)
-
+            alias_id = alias_pool.create_unique_alias(cr, uid, {'alias_name': "sales_team."+vals['name'], 'alias_model_id': self._name}, context=context)
+            vals.update({'alias_id': alias_id})
+        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 """

=== modified file 'crm/crm_view.xml'
--- crm/crm_view.xml	2012-06-29 09:01:13 +0000
+++ crm/crm_view.xml	2012-07-05 08:39:19 +0000
@@ -71,8 +71,8 @@
                             <field name="name" colspan="2"/>
                             <field name="parent_id"/>
                             <field name="code"/>
-                            <field name="alias_id" required="0" domain="[('alias_model_id', '=','crm.lead')]"/>
                         </group>
+                        
                         <group>
                             <field name="user_id"/>
                             <field name="resource_calendar_id"/>
@@ -87,6 +87,12 @@
                                 <field name="change_responsible"/>
                                 <field name="member_ids"/>
                             </group>
+                            <group>
+                                <div name="alias_box">
+                                    <label for="alias_name"/>
+                                    <field name="alias_name" class="oe_inline" required="0"/>@<field name="alias_domain" class="oe_inline"/>
+                                </div>
+                            </group>
                         </page>
                         <page string="Stages">
                             <separator string="Select Stages for this Sales Team"/>

=== modified file 'fetchmail/fetchmail.py'
--- fetchmail/fetchmail.py	2012-06-29 11:52:33 +0000
+++ fetchmail/fetchmail.py	2012-07-05 08:39:19 +0000
@@ -71,7 +71,7 @@
         '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 @@
                     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 @@
                     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)

=== modified file 'hr_recruitment/hr_recruitment.py'
--- hr_recruitment/hr_recruitment.py	2012-06-29 12:50:52 +0000
+++ hr_recruitment/hr_recruitment.py	2012-07-05 08:39:19 +0000
@@ -552,7 +552,9 @@
     _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):
@@ -561,24 +563,24 @@
             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]
+                alias_node = doc.xpath("//div[@name='alias_box']")[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:

=== modified file 'hr_recruitment/hr_recruitment_data.xml'
--- hr_recruitment/hr_recruitment_data.xml	2012-06-29 08:46:21 +0000
+++ hr_recruitment/hr_recruitment_data.xml	2012-07-05 08:39:19 +0000
@@ -451,7 +451,7 @@
     </record>
    
     <record id="mail_alias_jobs" model="mail.alias">
-        <field name="alias_name">Jobs</field>
+        <field name="alias_name">jobs</field>
         <field name="alias_model_id" ref="model_hr_applicant"/>
         <field name="alias_user_id" ref="base.user_root"/>
         <field name="alias_defaults">{}</field>

=== modified file 'hr_recruitment/hr_recruitment_demo.yml'
--- hr_recruitment/hr_recruitment_demo.yml	2012-06-29 08:46:21 +0000
+++ hr_recruitment/hr_recruitment_demo.yml	2012-07-05 08:39:19 +0000
@@ -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: '{}'

=== modified file 'hr_recruitment/hr_recruitment_view.xml'
--- hr_recruitment/hr_recruitment_view.xml	2012-06-29 06:30:37 +0000
+++ hr_recruitment/hr_recruitment_view.xml	2012-07-05 08:39:19 +0000
@@ -349,7 +349,13 @@
                 </div>
             </field>
             <field name="company_id" version="7.0" position="after">
-                <field name="alias_id" required="0" domain="[('alias_model_id','=','hr.applicant')]"/>
+                <group colspan="4">
+                    <div name="alias_box">
+                        <label for="alias_name"/>
+                        <field name="alias_name" required="0" class="oe_inline"/>@
+                        <field name="alias_domain" class="oe_inline"/>
+                    </div>
+                </group>
             </field>
         </field>
     </record>

=== modified file 'mail/mail_alias.py'
--- mail/mail_alias.py	2012-06-29 11:52:33 +0000
+++ mail/mail_alias.py	2012-07-05 08:39:19 +0000
@@ -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 @@
     _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 @@
         '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 @@
         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 @@
         Email Alias Domain from config.
         e.g. `[email protected]` or `[email protected]`
         """
-        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)
+
 

=== modified file 'mail/mail_alias_view.xml'
--- mail/mail_alias_view.xml	2012-06-29 10:05:16 +0000
+++ mail/mail_alias_view.xml	2012-07-05 08:39:19 +0000
@@ -11,12 +11,15 @@
             <field name="arch" type="xml">
                 <form string="Alias" version="7.0">
                     <sheet>
+                        <label for="alias_name" class="oe_edit_only"/>
+                        <h2><field name="alias_name"  class="oe_inline"/>@<field name="alias_domain" class="oe_inline"/></h2>
                         <group colspan="4" col="4">
-                            <field name="alias_name"/>
                             <field name="alias_model_id" readonly="1"/>
-                            <field name="alias_user_id"/>
-                            <field name="alias_force_thread_id"/>
-                            <field name="alias_defaults"/>
+                            <field name="alias_user_id" readonly="1"/>
+                            <field name="alias_force_thread_id" readonly="1"/>
+                            <newline/>
+                            <separator string="Alias Mailbox Default Values" colspan="4"/>
+                            <field name="alias_defaults" colspan="4" nolabel="1" readonly="1"/>
                         </group>
                     </sheet>
                 </form>

=== modified file 'mail/mail_group.py'
--- mail/mail_group.py	2012-06-28 05:09:49 +0000
+++ mail/mail_group.py	2012-07-05 08:39:19 +0000
@@ -130,7 +130,9 @@
         '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 = {
@@ -145,20 +147,22 @@
             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]
+                alias_node = doc.xpath("//div[@name='alias_box']")[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
+

=== modified file 'mail/mail_group_view.xml'
--- mail/mail_group_view.xml	2012-06-29 07:15:53 +0000
+++ mail/mail_group_view.xml	2012-07-05 08:39:19 +0000
@@ -69,8 +69,9 @@
                                 <field name="public" class="oe_inline"/>
                             </div>
                             <field name="description" colspan="4" nolabel="1"/>
-                            <div class="oe_edit_only">
-                                <field name="alias_id" required="0" domain="[('alias_model_id','=','mail.group')]" />
+                            <div name="alias_box">
+                                <label for="alias_name"/>
+                                <field name="alias_name" required="0" class="oe_inline"/>@<field name="alias_domain" class="oe_inline"/>
                             </div>
                         </div>
                     </div>

=== modified file 'mail/res_users.py'
--- mail/res_users.py	2012-06-29 10:05:16 +0000
+++ mail/res_users.py	2012-07-05 08:39:19 +0000
@@ -40,7 +40,9 @@
                         ('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', 'Mail 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 = {
@@ -64,7 +66,7 @@
             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]
+                alias_node = doc.xpath("//div[@name='alias_box']")[0]
                 parent = alias_node.getparent()
                 parent.remove(alias_node)
                 res['arch'] = etree.tostring(doc)
@@ -72,14 +74,12 @@
     
     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 +91,7 @@
     
     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)

=== modified file 'mail/res_users_view.xml'
--- mail/res_users_view.xml	2012-06-26 06:09:06 +0000
+++ mail/res_users_view.xml	2012-07-05 08:39:19 +0000
@@ -32,7 +32,12 @@
                     </div>
                 </xpath>
                 <field name="active" position="after">
-                    <field name="alias_id" readonly="1" required="0"/>
+                    <group colspan="2">
+                        <div name="alias_box">
+                            <label for="alias_name"/>
+                            <field name="alias_name" readonly="1" required="0" class="oe_inline"/>@<field name="alias_domain" class="oe_inline"/>
+                        </div>
+                    </group>
                 </field>
             </data>
             </field>

=== modified file 'project/project.py'
--- project/project.py	2012-06-28 12:10:40 +0000
+++ project/project.py	2012-07-05 08:39:19 +0000
@@ -165,7 +165,7 @@
             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 @@
         '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 @@
         '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 ?
@@ -260,15 +263,12 @@
             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]
+                    model_node = doc.xpath("//group[@string='Mailbox Alias']")[0]
                     parent = model_node.getparent()
                     parent.remove(model_node)
                 else:
-                    model_node = doc.xpath("//field[@name='alias_id']")[0]
+                    model_node = doc.xpath("//div[@name='alias_box']")[0]
                     parent = model_node.getparent()
                     parent.remove(model_node)
                 res['arch'] = etree.tostring(doc)
@@ -330,10 +330,11 @@
         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
@@ -521,15 +522,16 @@
         return self.pool.get('res.users').read(cr, uid, sub_ids, context=context)
 
     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
 
@@ -553,16 +555,15 @@
         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"

=== modified file 'project/project_demo.xml'
--- project/project_demo.xml	2012-06-27 04:57:35 +0000
+++ project/project_demo.xml	2012-07-05 08:39:19 +0000
@@ -66,7 +66,7 @@
                     ref('base.user_vad')])]" name="members"/>
             <field name="user_id" ref="base.user_al"/>
             <field name="name">Integrate a Sale and Warehouse Management.</field>
-            <field name="alias_model">model_project_task</field>
+            <field name="alias_model">project.task</field>
         </record>
 
         <!-- Tasks -->
@@ -291,7 +291,7 @@
             <field name="parent_id" ref="all_projects_account"/>
             <field name="user_id" ref="base.user_root"/>
             <field eval="[(6, 0, [ref('project_tt_specification'),ref('project_tt_development'),ref('project_tt_testing'),ref('project_tt_merge')])]" name="type_ids"/>
-            <field name="alias_model">model_project_task</field>
+            <field name="alias_model">project.task</field>
         </record>
         <record id="project_project_21" model="project.project">
             <field name="priority">10</field>
@@ -300,7 +300,7 @@
             <field name="user_id" ref="base.user_root"/>
             <field eval="[(6, 0, [ref('project_tt_specification'),ref('project_tt_development')])]" name="type_ids"/>
             <field eval="[(6, 0, [ref('base.user_root'),ref('base.user_demo')])]" name="members"/>
-            <field name="alias_model">model_project_task</field>
+            <field name="alias_model">project.task</field>
         </record>
         <record id="project_project_22" model="project.project">
             <field name="priority">20</field>
@@ -309,7 +309,7 @@
             <field name="user_id" ref="base.user_root"/>
             <field eval="[(6, 0, [ref('project_tt_specification'), ref('project_tt_development')])]" name="type_ids"/>
             <field eval="[(6, 0, [ref('base.user_root'),ref('base.user_demo')])]" name="members"/>
-            <field name="alias_model">model_project_task</field>
+            <field name="alias_model">project.task</field>
         </record>
         <record id="project_project_23" model="project.project">
             <field name="priority">30</field>
@@ -317,7 +317,7 @@
             <field name="name">Install, data import, configuration</field>
             <field eval="[(6, 0, [ref('project_tt_development')])]" name="type_ids"/>
             <field eval="[(6, 0, [ref('base.user_root'),ref('base.user_demo')])]" name="members"/>
-            <field name="alias_model">model_project_task</field>
+            <field name="alias_model">project.task</field>
         </record>
 
         <!-- Tasks -->

=== modified file 'project/project_view.xml'
--- project/project_view.xml	2012-06-29 07:15:53 +0000
+++ project/project_view.xml	2012-07-05 08:39:19 +0000
@@ -55,8 +55,6 @@
                             <field name="analytic_account_id" invisible="1" required="0"/>
                             <field name="parent_id" invisible="1" string="Parent" domain="[('id','!=',analytic_account_id)]" context="{'current_model': 'project.project'}"/>
                             <field name="privacy_visibility"/>
-                            <field name="alias_id" required="0" domain="[('alias_model_id','in',('project.task','project.issue'))]"/>
-                            <field name="alias_model"/>
                         </group>
                         <group>
                             <table>
@@ -104,6 +102,14 @@
                                     <field name="active" attrs="{'invisible':[('state','in',['open', 'pending', 'template'])]}"/>
                                     <field name="currency_id" select="1" groups="base.group_multi_company" required="1"/>
                                 </group>
+                                <group string="Mailbox Alias" colspan="4">
+                                   <div>
+                                        <label for="alias_name"/>
+                                        <field name="alias_name" required="0" class="oe_inline"/>@
+                                        <field name="alias_domain" class="oe_inline"/>
+                                    </div>
+                                    <field name="alias_model" invisible="1"/>
+                                </group>
                             </group>
                         </page>
                         <page string="Tasks Stages">
@@ -219,14 +225,14 @@
                                         <div>Deadline</div>
                                         <div><field name="date"/></div>
                                     </div>
-                                    <div  t-if="record.alias_id.raw_value">
-                                        <a  t-attf-href="mailto:#{record.alias_id.raw_value}"><field name="alias_id"/></a>
-                                    </div>
                                     <div class="oe_kanban_project_fields oe_kanban_project_progress">
                                         <div>Progress</div>
                                         <div><t t-esc="Math.round(record.effective_hours.raw_value)"/> / <t t-esc="Math.round(record.planned_hours.raw_value)"/> <field name="company_uom_id"/></div>
                                     </div>
-
+                                    <div name="alias_box" t-if="record.alias_id.raw_value" class="oe_kanban_ellipsis">
+                                        Mailbox Alias :
+                                        <a t-attf-href="mailto:#{record.alias_id.raw_value}"><field name="alias_id"/></a>
+                                    </div>
                                     <div class="oe_kanban_project_avatars">
                                         <t t-foreach="record.members.raw_value" t-as="member">
                                             <img t-att-src="kanban_image('res.users', 'avatar', member)" t-att-data-member_id="member"/>

=== modified file 'project_issue/project_issue.py'
--- project_issue/project_issue.py	2012-06-29 04:31:14 +0000
+++ project_issue/project_issue.py	2012-07-05 08:39:19 +0000
@@ -582,7 +582,7 @@
     _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)
@@ -595,7 +595,8 @@
         '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):
@@ -608,6 +609,7 @@
     _constraints = [
         (_check_escalation, 'Error! You cannot assign escalation to the same project!', ['project_escalation_id'])
     ]
+    
 project()
 
 class account_analytic_account(osv.osv):

=== modified file 'project_issue/project_issue_view.xml'
--- project_issue/project_issue_view.xml	2012-06-27 15:02:56 +0000
+++ project_issue/project_issue_view.xml	2012-07-05 08:39:19 +0000
@@ -352,6 +352,9 @@
                     <field name="project_escalation_id"/>
                     <field name="reply_to"/>
                 </field>
+                <field name="alias_model" position="replace">
+                    <field name="alias_model"/>
+                </field>
             </field>
        </record>
         

_______________________________________________
Mailing list: https://launchpad.net/~openerp-dev-gtk
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~openerp-dev-gtk
More help   : https://help.launchpad.net/ListHelp

Reply via email to