add feature: configurable subject prefixing for mailing lists
[eoc.git] / eoc.py
diff --git a/eoc.py b/eoc.py
index ac899233bf4bb3e92906688383665c37725608bf..e328a4a8b58063454f33cb0dca128d9fd2852e3d 100644 (file)
--- a/eoc.py
+++ b/eoc.py
@@ -469,6 +469,7 @@ class MailingList:
         self.cp.set("list", "ignore-bounce", "no")
         self.cp.set("list", "language", "")
         self.cp.set("list", "pristine-headers", "")
+        self.cp.set("list", "subject-prefix", "")
 
         self.dirname = os.path.join(self.mlm.dotdir, name)
         self.make_listdir()
@@ -587,6 +588,7 @@ class MailingList:
             return
         if self.cp.get("list", "pristine-headers") != "yes":
             text = self.mime_encode_headers(text)
+        text = self.add_subject_prefix(text)
         self.mlm.send_mail(envelope_sender, recipients, text)
 
     def send_info_message(self, recipients, template_name, dict):
@@ -730,6 +732,7 @@ class MailingList:
     def obey_owner(self, text):
         sender = get_from_environ("SENDER")
         recipients = self.cp.get("list", "owners").split()
+        text = self.add_subject_prefix(text)
         self.mlm.send_mail(sender, recipients, text)
 
     def obey_subscribe_or_unsubscribe(self, dict, template_name, command, 
@@ -877,7 +880,7 @@ class MailingList:
         else:
             return ""
 
-    def remove_some_headers(self, mail, headers_to_remove):
+    def headers_and_body(self, mail):
         endpos = mail.find("\n\n")
         if endpos == -1:
             endpos = mail.find("\n\r\n")
@@ -885,7 +888,11 @@ class MailingList:
                 return mail
         headers = mail[:endpos].split("\n")
         body = mail[endpos:]
-        
+        return (headers, body)
+
+    def remove_some_headers(self, mail, headers_to_remove):
+        headers, body = self.headers_and_body(mail)
+
         headers_to_remove = [x.lower() for x in headers_to_remove]
     
         remaining = []
@@ -933,6 +940,7 @@ class MailingList:
                                                "list-owner", "precedence"])
         text = self.headers_to_add() + self.list_headers() + \
                self.headers_to_remove(text)
+        text = self.add_subject_prefix(text)
         text = self.append_footer(text)
         text, = self.mlm.call_plugins("send_mail_to_subscribers_hook",
                                      self, text)
@@ -945,6 +953,33 @@ class MailingList:
             addresses = self.subscribers.in_group(group)
             self.mlm.send_mail(bounce, addresses, text)
 
+    def add_subject_prefix(self, text):
+        """Given a full-text mail, munge its subject header with the configured
+           subject prefix (if any) and return the updated mail text.
+        """
+        headers, body = self.headers_and_body(text)
+
+        prefix = self.cp.get("list", "subject-prefix")
+
+        # We don't need to do anything special to deal with multi-line
+        # subjects since adding the prefix to the first line of the subject
+        # and leaving the later lines untouched is sufficient.
+        if prefix:
+            has_subject = False
+            for header in headers:
+                if header.startswith('Subject:'):
+                    has_subject = True
+                    if prefix not in header:
+                        text = text.replace(header,
+                          header[:9] + prefix + " " + header[9:], 1)
+                        break
+            # deal with the case where there was no Subject in the original
+            # mail (broken mailer?)
+            if not has_subject:
+                text = text.replace("\n\n", "Subject: " + prefix + "\n\n", 1)
+
+        return text
+
     def post_into_moderate(self, poster, dict, text):
         id = self.moderation_box.add(poster, text)
         recipients = self.moderators()