[Erp5-report] r14516 - /erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/

nobody at svn.erp5.org nobody at svn.erp5.org
Fri May 18 15:02:00 CEST 2007


Author: ivan
Date: Fri May 18 15:01:59 2007
New Revision: 14516

URL: http://svn.erp5.org?rev=14516&view=rev
Log:
Notify user for succesful or not document email ingestion per email.
Add to DMS preferences preferred email address.

Modified:
    erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_ingestEmail.xml
    erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_notifyByEmail.xml
    erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Preference_viewDocument.xml

Modified: erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_ingestEmail.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_ingestEmail.xml?rev=14516&r1=14515&r2=14516&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_ingestEmail.xml (original)
+++ erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_ingestEmail.xml Fri May 18 15:01:59 2007
@@ -71,63 +71,69 @@
             <value> <string encoding="cdata"><![CDATA[
 
 """\n
-The email ingestion script, called by ZMailIn upon reception of an email.\n
-Finds out who sent the letter, finds the sender, discovers properties that may\n
-be contained in the mail body (using Document_getPropertyListFromMail),\n
-then creates and object from every attachment and sends notifications to the\n
-sender.\n
-\n
-If it returns anything, it is bounced back to the sender as an error message. No return\n
-value means everything was fine.\n
+  The email ingestion script, called by ZMailIn upon reception of an email.\n
+  Finds out who sent the letter, finds the sender, discovers properties that may\n
+  be contained in the mail body (using Document_getPropertyListFromMail),\n
+  then creates and object from every attachment and sends notifications to the \n
+  sender.\n
+\n
+  If it returns anything, it is bounced back to the sender as an error message. No return\n
+  value means everything was fine.\n
 """\n
 \n
-#from Products.ERP5Type.Message import Message\n
-# translating doesn\'t make sense since we have no session, so no preferences\n
-\n
-noSenderInHeaderMsg = "no sender in headers"\n
-noSenderMsg = "you are not in user database"\n
-manySendersMsg = "very serious error: your address has multiple entries"\n
-\n
-# get sender from headers\n
-fromraw = theMail[\'headers\'][\'from\']\n
-\n
-senderemail = context.findAddress(fromraw)\n
-if senderemail is None:\n
-  print noSenderInHeaderMsg\n
+# get sender from email headers\n
+raw_sender_email = theMail[\'headers\'][\'from\']\n
+sender_email = context.findAddress(raw_sender_email)\n
+if sender_email is None:\n
+  print "no sender in headers"\n
   return printed\n
 \n
-# find sender\n
-context.log(senderemail)\n
-r = context.portal_catalog(portal_type=\'Email\', url_string=senderemail)\n
-if len(r) == 0:\n
-  print noSenderMsg\n
-  return printed\n
-if len(r) > 1:\n
-  print manySendersMsg\n
-  return printed\n
-\n
-senderm = r[0]\n
-person = senderm.getParent()\n
-context.log(script.getId(), \'ok, this address belongs to \' + person.getRelativeUrl())\n
-\n
+# find sender in ERP5\n
+found_persons = context.portal_catalog(portal_type=\'Person\', reference=sender_email)\n
+if len(found_persons) == 0:\n
+  msg = \'[DMS] You are not in user database\'\n
+  context.log(msg)\n
+  return msg\n
+if len(found_persons) > 1:\n
+  msg = \'[DMS] Your email address has multiple entries\'\n
+  context.log(msg)\n
+  return msg\n
+\n
+person = found_persons[0]\n
+\n
+# get mail properties out of mail body\n
 mailprops = context.Document_getPropertyDictFromMail(theMail[\'body\'])\n
-context.log(mailprops)\n
-\n
-# create objects from attachments\n
+\n
+# try to ingest document for each attachment\n
 try:\n
-  for fname, data in theMail[\'attachments\'].items():\n
-    obj  = context.portal_contributions.newContent(file_name=fname, \n
-                                                       data=data, \n
-                                                       portal_type=mailprops.get(\'document_type\'), \n
-                                                       user_login=person.getReference(),\n
-                                                       **mailprops)\n
-    gr = person.Person_getPrincipalGroup()\n
-    obj.manage_setLocalRoles(person.getReference(), [\'Owner\',])\n
-    context.Document_notifyByEmail(address=senderemail, event=\'ingest\', object=obj)\n
+  for attachment in theMail[\'attachment_list\']:\n
+    file_name, content_type, data = attachment\n
+    kw = dict(file_name = file_name,\n
+              data = data,\n
+              discover_metadata = 0)\n
+    new_content = context.portal_contributions.newContent(**kw)\n
+    merged_content = new_content.discoverMetadata(file_name = file_name)\n
+    if new_content == merged_content:\n
+      # we have a new document in the system, so set local role owner to email sender\n
+      new_content.manage_setLocalRoles(person.getReference(), [\'Owner\',])\n
+   \n
+    new_content.immediateReindexObject()\n
+    merged_content.immediateReindexObject()\n
+    # notify sender for successful email ingestion\n
+    context.Document_notifyByEmail(sender_email, \'ingestion_success\', merged_content)\n
+    context.log(\'[DMS] Finished email ingestion for %s <%s> (%s)\' \n
+                                                 %(person.getTitle(), sender_email, file_name))\n
+    return \'OK\'\n
 except Exception, e:\n
-  context.log(e)\n
-  raise\n
-return\n
+  # failure during ingestion, inform user to try again later\n
+  context.Document_notifyByEmail(sender_email, \n
+                                 \'ingestion_failure\', \n
+                                 context, \n
+                                 original_email = theMail)\n
+  context.log(\'[DMS] Failure (%s) email ingestion for %s <%s> (%s)\' \n
+                                                 %(e, person.getTitle(), sender_email, file_name))\n
+  raise Exception, e\n
+  return \'ERROR\'\n
 
 
 ]]></string> </value>
@@ -152,8 +158,6 @@
             <key> <string>_proxy_roles</string> </key>
             <value>
               <tuple>
-                <string>Assignor</string>
-                <string>Author</string>
                 <string>Manager</string>
               </tuple>
             </value>
@@ -185,27 +189,27 @@
                             <string>theMail</string>
                             <string>_print_</string>
                             <string>_print</string>
-                            <string>noSenderInHeaderMsg</string>
-                            <string>noSenderMsg</string>
-                            <string>manySendersMsg</string>
                             <string>_getitem_</string>
-                            <string>fromraw</string>
+                            <string>raw_sender_email</string>
                             <string>_getattr_</string>
                             <string>context</string>
-                            <string>senderemail</string>
+                            <string>sender_email</string>
                             <string>None</string>
-                            <string>r</string>
+                            <string>found_persons</string>
                             <string>len</string>
-                            <string>senderm</string>
+                            <string>msg</string>
                             <string>person</string>
-                            <string>script</string>
                             <string>mailprops</string>
                             <string>_getiter_</string>
-                            <string>fname</string>
+                            <string>attachment</string>
+                            <string>file_name</string>
+                            <string>content_type</string>
                             <string>data</string>
+                            <string>dict</string>
+                            <string>kw</string>
                             <string>_apply_</string>
-                            <string>obj</string>
-                            <string>gr</string>
+                            <string>new_content</string>
+                            <string>merged_content</string>
                             <string>Exception</string>
                             <string>e</string>
                           </tuple>

Modified: erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_notifyByEmail.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_notifyByEmail.xml?rev=14516&r1=14515&r2=14516&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_notifyByEmail.xml (original)
+++ erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Document_notifyByEmail.xml Fri May 18 15:01:59 2007
@@ -71,59 +71,96 @@
             <value> <string encoding="cdata"><![CDATA[
 
 """\n
-Used by email ingestor (Document_ingestEmail) to notify the user\n
-about ingestion of a document (can also be used by other ingestion channels).\n
-Checks consistency and lets the user know if everything is ok (this is a bit of a duplication\n
-because consistency is checked also upon an attempt to validate).\n
-\n
-Preferences decide if the notification is sent always, only if something is wrong or never.\n
-\n
-Notifcation contains url of the document, so that one can click and do something.\n
+  Used by email ingestor (Document_ingestEmail) to notify the user\n
+  about ingestion of a document (can also be used by other ingestion channels).\n
+  Checks consistency and lets the user know if everything is ok (this is a bit of a duplication\n
+  because consistency is checked also upon an attempt to validate).\n
+\n
+  Preferences decide if the notification is sent always, only if something is wrong or never.\n
+\n
+  Notifcation contains url of the document, so that one can click and do something.\n
 """\n
 \n
-pref = context.portal_preferences.getPreferredDocumentIngestionEmailNotification()\n
+# check if we send or not email at all\n
+original_email = kw.get(\'original_email\', None)\n
+portal = context.getPortalObject()\n
+portal_preferences = portal.portal_preferences\n
+portal_catalog = portal.portal_catalog\n
+pref = portal_preferences.getPreferredDocumentIngestionEmailNotification()\n
 if pref is not None and len(pref) != 0:\n
   pref=pref[0]\n
-  if pref == \'never\': return\n
-\n
-ob = kw[\'object\']\n
-if ob.getPortalType() == \'Memo\': # we don\'t check constistency for Memo XXX use type groups, or what?\n
-  res = \'\'\n
-else:\n
-  res = ob.checkConsistency()\n
-  res = [c for c in res if c[1] == \'DocumentCoordinatesConstraint inconsistency\']\n
-\n
-# shall we send?\n
-send = (pref == \'always\' or len(res) > 0)\n
-if not send: return\n
-\n
-if len(res) > 0:\n
-  errmsg = \'<br/>\'.join(str(c[3]) for c in res)\n
-  subjecttpl = \'ingested %(name)s - there was a problem\'\n
-  msgtpl = """Your document "%(name)s" was ingested.\n
+  if pref == \'never\':\n
+    # do not send any email notifications at all \n
+    return\n
+  \n
+if event in (\'ingestion_success\',):\n
+  # successful ingestion socheck if ingested document is consistent\n
+  if doc.getPortalType() == \'Memo\': \n
+    # we don\'t check constistency for Memo XXX use type groups, or what?\n
+    isObjectConsistent = True\n
+  else:\n
+    consistency_result = doc.checkConsistency()\n
+    consistency_result = [x for x in consistency_result if x[1] == \'DocumentCoordinatesConstraint inconsistency\']\n
+    isObjectConsistent = len(consistency_result) == 0\n
+  if not isObjectConsistent:\n
+    error_msg = \'<br/>\'.join(str(c[3]) for x in consistency_result)\n
+    subject_template =  \'[DMS] Failure ingestion %(name)s\'\n
+    email_template = """Your document "%(name)s" was not successfuly ingested.\n
   \n
   The following problems were detected:\n
 \n
-  %(errmsg)s\n
+  %(error_msg)s\n
   \n
   click here: %(url)s/view to proceed and fix the problems.\n
   """\n
+  else:\n
+    error_msg = \'\'\n
+    subject_template = \'[DMS] Successful ingestion for %(name)s\'\n
+    email_template = """Your document "%(name)s" was successfully ingested.\n
+\n
+click here: %(url)s/view to proceed with your work."""\n
+elif event in (\'ingestion_failure\',):\n
+  # there was an error during ingestion process, inform user to try again\n
+  error_msg = \'Failure during ingestion.\'\n
+  subject_template =  \'[DMS] Unsuccessful ingestion\'\n
+  email_template = """Your document was not successfuly ingested.\n
+  \n
+The following problems were detected:\n
+\n
+  %(error_msg)s\n
+  \n
+Please try again after some time. \n
+We applogize for inconvinience."""\n
+  \n
+  \n
+# compose email\n
+email_from = portal_preferences.getPreferredDocumentEmailIngestionAddress()\n
+email_kw = dict(error_msg = error_msg)\n
+\n
+# not always we have ingested document passed (i.e when failure happens)\n
+if getattr(doc, \'getSourceReference\', None) is not None:\n
+  subject = subject_template % {\'name\': doc.getSourceReference()}\n
+  email_kw[\'name\'] = doc.getSourceReference()\n
+  email_kw[\'url\'] = doc.absolute_url()\n
 else:\n
-  errmsg = \'\'\n
-  subjecttpl = \'ingested %(name)s\'\n
-  msgtpl = """Your document "%(name)s" was successfully ingested.\n
-\n
-  click here: %(url)s/view to proceed with your work.\n
-  """\n
-\n
-subject = subjecttpl % {\'name\': ob.getSourceReference()}\n
-\n
-msg = msgtpl % {\'url\': ob.absolute_url(), \'name\': ob.getSourceReference(), \'errmsg\': errmsg}\n
-\n
-mto = kw[\'address\']\n
-mfro = \'dms at dms.nexedi.com\' # XXX this should be in preferences\n
-\n
-context.MailHost.send(msg, mto, mfro, subject)\n
+  subject = subject_template\n
+\n
+# get original email text\n
+original_email_text = None\n
+if original_email is not None:\n
+  original_email_text = \'Subject:%s\\n\\nBody:\\n%s\'  %(original_email[\'headers\'][\'subject\'], \n
+                                                     original_email[\'body\'])\n
+email_text = email_template % email_kw\n
+# add part of original email if failure happens\n
+if event in (\'ingestion_failure\',) and original_email_text is not None:\n
+  email_text = \'%s\\n\\n%s\\nOriginal email text (see below):\\n\\n%s\' %(email_text, \n
+                                                                  \'=\'*80, \n
+                                                                  original_email_text)\n
+# send email\n
+context.MailHost.send(email_text, \n
+                      email_to, \n
+                      email_from, \n
+                      subject)\n
 
 
 ]]></string> </value>
@@ -142,7 +179,7 @@
         </item>
         <item>
             <key> <string>_params</string> </key>
-            <value> <string>**kw</string> </value>
+            <value> <string>email_to, event, doc, **kw</string> </value>
         </item>
         <item>
             <key> <string>errors</string> </key>
@@ -162,33 +199,44 @@
                   <dictionary>
                     <item>
                         <key> <string>co_argcount</string> </key>
-                        <value> <int>0</int> </value>
+                        <value> <int>3</int> </value>
                     </item>
                     <item>
                         <key> <string>co_varnames</string> </key>
                         <value>
                           <tuple>
+                            <string>email_to</string>
+                            <string>event</string>
+                            <string>doc</string>
                             <string>kw</string>
                             <string>_getattr_</string>
+                            <string>None</string>
+                            <string>original_email</string>
                             <string>context</string>
+                            <string>portal</string>
+                            <string>portal_preferences</string>
+                            <string>portal_catalog</string>
                             <string>pref</string>
-                            <string>None</string>
                             <string>len</string>
                             <string>_getitem_</string>
-                            <string>ob</string>
-                            <string>res</string>
+                            <string>True</string>
+                            <string>isObjectConsistent</string>
+                            <string>consistency_result</string>
                             <string>append</string>
                             <string>$append0</string>
                             <string>_getiter_</string>
-                            <string>c</string>
-                            <string>send</string>
-                            <string>errmsg</string>
-                            <string>subjecttpl</string>
-                            <string>msgtpl</string>
+                            <string>x</string>
+                            <string>error_msg</string>
+                            <string>subject_template</string>
+                            <string>email_template</string>
+                            <string>email_from</string>
+                            <string>dict</string>
+                            <string>email_kw</string>
+                            <string>getattr</string>
                             <string>subject</string>
-                            <string>msg</string>
-                            <string>mto</string>
-                            <string>mfro</string>
+                            <string>_write_</string>
+                            <string>original_email_text</string>
+                            <string>email_text</string>
                           </tuple>
                         </value>
                     </item>

Modified: erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Preference_viewDocument.xml
URL: http://svn.erp5.org/erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Preference_viewDocument.xml?rev=14516&r1=14515&r2=14516&view=diff
==============================================================================
--- erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Preference_viewDocument.xml (original)
+++ erp5/trunk/bt5/erp5_dms/SkinTemplateItem/portal_skins/erp5_dms/Preference_viewDocument.xml Fri May 18 15:01:59 2007
@@ -76,6 +76,7 @@
                       <list>
                         <string>my_preferred_document_file_name_regular_expression</string>
                         <string>my_preferred_document_reference_regular_expression</string>
+                        <string>my_preferred_document_email_ingestion_address</string>
                         <string>my_preferred_document_ingestion_email_notification</string>
                         <string>my_preferred_document_reference_method_id</string>
                       </list>




More information about the Erp5-report mailing list