[IMP] marketing campaign
authorFabien Pinckaers <fp@tinyerp.com>
Fri, 11 Jun 2010 07:44:19 +0000 (09:44 +0200)
committerFabien Pinckaers <fp@tinyerp.com>
Fri, 11 Jun 2010 07:44:19 +0000 (09:44 +0200)
bzr revid: fp@tinyerp.com-20100611074419-93biwenk8q1r68em

16 files changed:
addons/email_template/__init__.py [changed mode: 0755->0644]
addons/email_template/__openerp__.py [changed mode: 0755->0644]
addons/email_template/email_template.py [changed mode: 0755->0644]
addons/email_template/email_template_account.py [changed mode: 0755->0644]
addons/email_template/email_template_account_view.xml [changed mode: 0755->0644]
addons/email_template/email_template_engines.py [changed mode: 0755->0644]
addons/email_template/email_template_mailbox.py [changed mode: 0755->0644]
addons/email_template/email_template_mailbox_view.xml [changed mode: 0755->0644]
addons/email_template/email_template_scheduler_data.xml [changed mode: 0755->0644]
addons/email_template/email_template_view.xml [changed mode: 0755->0644]
addons/email_template/email_template_workflow.xml [changed mode: 0755->0644]
addons/email_template/html2text.py [changed mode: 0755->0644]
addons/marketing_campaign/__init__.py [changed mode: 0755->0644]
addons/marketing_campaign/__openerp__.py [changed mode: 0755->0644]
addons/marketing_campaign/marketing_campaign.py [changed mode: 0755->0644]
addons/marketing_campaign/marketing_campaign_view.xml [changed mode: 0755->0644]

old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 1cef7aa..2d34a09
@@ -17,10 +17,10 @@ try:
     TEMPLATE_ENGINES.append(('mako', 'Mako Templates'))
 except:
     LOGGER.notifyChannel(
-                         _("Email Template"),
-                         netsvc.LOG_ERROR,
-                         _("Mako templates not installed")
-                         )
+         _("Email Template"),
+         netsvc.LOG_WARNING,
+         _("Mako templates not installed")
+    )
 try:
     from django.template import Context, Template as DjangoTemplate
     #Workaround for bug:
@@ -31,10 +31,10 @@ try:
     TEMPLATE_ENGINES.append(('django', 'Django Template'))
 except:
     LOGGER.notifyChannel(
-                         _("Email Template"),
-                         netsvc.LOG_ERROR,
-                         _("Django templates not installed")
-                         )
+         _("Email Template"),
+         netsvc.LOG_WARNING,
+         _("Django templates not installed")
+    )
 
 import email_template_engines
 import tools
@@ -468,7 +468,7 @@ class email_template(osv.osv):
                                context)
         return True
     
-    def generate_mailbox_item_from_template(self,
+    def _generate_mailbox_item_from_template(self,
                                       cursor,
                                       user,
                                       template,
@@ -559,6 +559,8 @@ class email_template(osv.osv):
             'folder':'drafts',
             'mail_type':'multipart/alternative' 
         }
+        if not mailbox_values['account_id']:
+            raise Exception("Unable to send the mail. No account linked to the template.")
         #Use signatures if allowed
         if template.use_sign:
             sign = self.pool.get('res.users').read(cursor,
@@ -570,13 +572,17 @@ class email_template(osv.osv):
                 mailbox_values['body_text'] += sign
             if mailbox_values['body_html']:
                 mailbox_values['body_html'] += sign
+        print 'Creating', mailbox_values
         mailbox_id = self.pool.get('email_template.mailbox').create(
                                                              cursor,
                                                              user,
                                                              mailbox_values,
                                                              context)
+
+        print 'Sending', mailbox_id
+        self.pool.get('email_template.mailbox').send_this_mail(cursor, user, [mailbox_id], context)
         return mailbox_id
-        
+
     def generate_mail(self,
                       cursor,
                       user,
@@ -588,6 +594,7 @@ class email_template(osv.osv):
         template = self.browse(cursor, user, template_id, context=context)
         if not template:
             raise Exception("The requested template could not be loaded")
+        print 'loaded', record_ids
         for record_id in record_ids:
             mailbox_id = self._generate_mailbox_item_from_template(
                                                                 cursor,
@@ -595,6 +602,7 @@ class email_template(osv.osv):
                                                                 template,
                                                                 record_id,
                                                                 context)
+            print 'loaded'
             mail = self.pool.get('email_template.mailbox').browse(
                                                         cursor,
                                                         user,
@@ -616,7 +624,7 @@ class email_template(osv.osv):
                                                 mailbox_id,
                                                 {'folder':'outbox'},
                                                 context=context
-                                                      )
+            )
         return True
 
 email_template()
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 45eef77..fe9ca33
@@ -41,9 +41,7 @@ class email_template_mailbox(osv.osv):
         return True
     
     def send_this_mail(self, cr, uid, ids=None, context=None):
-        if ids is None:
-            ids = []
-        for id in ids:
+        for id in (ids or []):
             try:
                 account_obj = self.pool.get('email_template.account')
                 values = self.read(cr, uid, id, [], context) 
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
index 4773a19..70cd541
@@ -242,7 +242,7 @@ class marketing_campaign_activity(osv.osv):
         self._actions = {'paper' : self.process_wi_report,
                     'email' : self.process_wi_email,
                     'server_action' : self.process_wi_action,
-            }        
+        }
         return super(marketing_campaign_activity, self).__init__(*args)
 
     def search(self, cr, uid, args, offset=0, limit=None, order=None,
@@ -259,7 +259,7 @@ class marketing_campaign_activity(osv.osv):
         return super(marketing_campaign_activity, self).search(cr, uid, args,
                                            offset, limit, order, context, count)
 
-    def process_wi_report(self, cr, uid, activity, workitem):
+    def process_wi_report(self, cr, uid, activity, workitem, context={}):
         service = netsvc.LocalService('report.%s'%activity.report_id.report_name)
         (report_data, format) = service.create(cr, uid, [], {}, {})
         attach_vals = {
@@ -274,46 +274,58 @@ class marketing_campaign_activity(osv.osv):
         self.pool.get('ir.attachment').create(cr, uid, attach_vals)
         return True
 
-    def process_wi_email(self, cr, uid, activity, workitem):
-        template = activity.email_template_id
-        accounts = template.enforce_from_account
-        if not template.enforce_from_account:
-            return {'error_msg'  : "There is no account defined for the email"}
-        if not workitem.partner_id.email:
-            return {'error_msg'  : "There is no email defined for the partner"}
-        vals = {
-            'email_from': tools.ustr(accounts.name) + "<" + tools.ustr(accounts.email_id) + ">",
-            'email_to': workitem.partner_id.email,
-            'subject': template.def_subject,
-            'body_text': template.def_body_text,
-            'body_html': template.def_body_html,
-            'account_id':accounts.id,
-            'state':'na',
-            'mail_type':'multipart/alternative' #Options:'multipart/mixed','multipart/alternative','text/plain','text/html'
-        }
-#            if accounts.use_sign:
-#                signature = self.pool.get('res.users').read(cr, uid, uid, ['signature'], context)['signature']
-#                if signature:
-#                    vals['pem_body_text'] = tools.ustr(vals['pem_body_text'] or '') + signature
-#                    vals['pem_body_html'] = tools.ustr(vals['pem_body_html'] or '') + signature
-
-        #Create partly the mail and later update attachments
-        mail_id = self.pool.get('email_template.mailbox').create(cr, uid, vals, context)
+    def process_wi_email(self, cr, uid, activity, workitem, context=None):
+        print 'Sending Email Init', activity.name
+        return self.pool.get('email.template').generate_mail(cr, uid, activity.email_template_id.id, [workitem.res_id], context=context)
+
+        #if not template.enforce_from_account:
+        #    self.pool.get('marketing.campaign.workitem').write(cr, uid, [workitem.id], {
+        #        'error_msg': 'There is no account defined for the email',
+        #        'state': 'exception'
+        #    })
+        #    return False
+        #if not workitem.partner_id.email:
+        #    self.pool.get('marketing.campaign.workitem').write(cr, uid, [workitem.id], {
+        #        'error_msg': "There is no email defined for the partner",
+        #        'state': 'exception'
+        #    })
+        #    return False
+        #vals = {
+        #    'email_from': tools.ustr(accounts.name) + "<" + tools.ustr(accounts.email_id) + ">",
+        #    'email_to': template.email_to,
+        #    'email_cc': template.email_cc,
+        #    'email_bcc': template.email_bcc,
+        #    'subject': template.def_subject,
+        #    'body_text': template.def_body_text,
+        #    'body_html': template.def_body_html,
+        #    'account_id': accounts.id,
+        #    'state':'na',
+        #    'mail_type':'multipart/alternative' #Options:'multipart/mixed','multipart/alternative','text/plain','text/html'
+        #}
+#       #     if accounts.use_sign:
+#       #         signature = self.pool.get('res.users').read(cr, uid, uid, ['signature'], context)['signature']
+#       #         if signature:
+#       #             vals['pem_body_text'] = tools.ustr(vals['pem_body_text'] or '') + signature
+#       #             vals['pem_body_html'] = tools.ustr(vals['pem_body_html'] or '') + signature
+
+        ##Create partly the mail and later update attachments
+        #print 'Sending Email', vals
+        #mail_id = self.pool.get('email_template.mailbox').create(cr, uid, vals, context)
         return True
-        
-    def process_wi_action(self, cr, uid, activity, workitem):
+
+    def process_wi_action(self, cr, uid, activity, workitem, context={}):
         context = {}
         server_obj = self.pool.get('ir.actions.server')
-        server_obj.run(cr, uid, [activity.server_action_id.id], context)    
+        server_obj.run(cr, uid, [activity.server_action_id.id], context)
         return True
-                
 
     def process(self, cr, uid, act_id, wi_id, context={}):
         activity = self.browse(cr, uid, act_id)
+        print 'Process', activity.name
         workitem_obj = self.pool.get('marketing.campaign.workitem')
-        workitem = workitem_obj.browse(cr, uid, wi_id)
-        self._actions[activity.type](cr, uid, activity, workitem)
-        return True
+        workitem = workitem_obj.browse(cr, uid, wi_id, context=context)
+        print 'WI', workitem, activity.type
+        return self._actions[activity.type](cr, uid, activity, workitem, context)
 
 marketing_campaign_activity()
 
@@ -419,14 +431,18 @@ class marketing_campaign_workitem(osv.osv):
                 }
                 expr = eval(str(wi.activity_id.condition), eval_context)
                 if expr:
-                    try :
+                    try:
+                        result = True
                         if wi.campaign_id.mode in ('manual','active'):
-                            self.pool.get('marketing.campaign.activity').process(
+                            result = self.pool.get('marketing.campaign.activity').process(
                                 cr, uid, wi.activity_id.id, wi.id, context)
-                        self.write(cr, uid, wi.id, {'state': 'done'})
-                        self.process_chain(cr, uid, wi.id, context)
+                        if result:
+                            self.write(cr, uid, wi.id, {'state': 'done'})
+                            self.process_chain(cr, uid, wi.id, context)
+                        else:
+                            self.write(cr, uid, wi.id, {'state': 'exception'})
                     except Exception,e:
-                        self.write(cr, uid, wi.id, {'state': 'exception'})
+                        self.write(cr, uid, wi.id, {'state': 'exception', 'error_msg': str(e)})
                 else :
                     self.write(cr, uid, wi.id, {'state': 'cancelled'})
 
@@ -444,7 +460,7 @@ class marketing_campaign_workitem(osv.osv):
                 workitem_ids = self.search(cr, uid, [('state', '=', 'todo')])
             else:
                 # manual states are not processed automatically
-                pass
+                workitem_ids = []
         if workitem_ids:
             self.process(cr, uid, workitem_ids, context)
 
old mode 100755 (executable)
new mode 100644 (file)
index ea25e0d..c606f75
                 </group>
                 <group colspan="2" col="2">
                    <separator string="Synchronization" colspan="2"/>
-                   <field name="sync_last_date"/>
                    <field name="sync_mode" required="True"/>
+                   <field name="sync_last_date"/>
                    <label string="" colspan="1"/>
                    <button string="Synchronize" states="running" name="synchroniz" icon="gtk-apply" type="object"/>
                 </group>
                 <group colspan="2" col="2">
                     <separator string="Dates" colspan="2"/>
-                    <field name="date_run" attrs="{'readonly':[('date_run','!=',False),('state','=','running')]}"/>
-                    <field name="date_done"/>
+                    <field name="date_run" readonly="1"/>
+                    <field name="date_done" readonly="1"/>
                 </group>
                 <separator string="Status" colspan="4"/>
                 <group col="10" colspan="4">
                         <button string="Preview" states="todo" name="preview" icon="gtk-apply" type="object"/>
                     </group>
                 </group>
+                <group colspan="4" col="4" attrs="{'invisible':[('state','!=','exception')]}">
+                    <separator string="Error Message" colspan="4"/>
+                    <field name="error_msg" nolabel="1" colspan="4"/>
+                </group>
                 <separator string="Status" colspan="4"/>
                 <group colspan="4" col="11">
                     <field name="state" nolabel="1" readonly="True" select="1"/>