def migrate(self): if self.is_updated(): return 'already migrated' # set the appropriate list type based on the previous settings # this may need to mark the appropriate interface on the mailing # list as well if self.context.moderated: self.context.list_type = PostModeratedListTypeDefinition elif self.context.closed: self.context.list_type = MembershipModeratedListTypeDefinition else: self.context.list_type = PublicListTypeDefinition # copy over the membership stuff annot = IAnnotations(self.context) listen_annot = annot.get('listen', {}) old_subscribers = listen_annot.get('subscribers', []) # create the new annotations by using current adapters mem_list = IWriteMembershipList(self.context) for subscriber in old_subscribers: mem_list.subscribe(subscriber) # unsubscribe (but leave as allowed senders) those who don't # receive mail nomail = listen_annot.get('norecvmail', []) for allowed_sender in nomail: mem_list.unsubscribe(allowed_sender) # copy over the moderation messages self.mod_post_pending_list = getAdapter(self.context, IPostPendingList, 'pending_pmod_post') for i in self.context.mqueue.objectIds(): (header, body) = splitMail(self.context.mqueue[i]) post = {'header':header, 'body':body} (user_name, user_email) = parseaddr(header.get('from', '')) self.mod_post_pending_list.add(user_email, user_name=user_name, post=post) # creates list managers from moderators and list owner managers = [] managers.append(self.context.list_owner) for moderator in self.context.moderators: managers.append(moderator) self.context.managers = tuple(managers) convert_manager_emails_to_memberids(self.context) # translate archived vocabulary if self.context.archived == 'not archived': self.context.archived = 2 elif self.context.archived == 'plain text': self.context.archived = 1 elif self.context.archived == 'with attachments': self.context.archived = 0 else: return 'error translating archive option' # annotate the list to say the migration completed self.migration_annot.append('policy_migration') return 'successfully migrated'
def addMail(self, mailString, force_id=False): """ Store mail in date based folder archive. Returns created mail. See IMailingList interface. """ archive = aq_get(self, self.getValueFor('storage'), None) # no archive available? then return immediately if archive is None: return None (header, body) = splitMail(mailString) # if 'keepdate' is set, get date from mail, if self.getValueFor('keepdate'): assert header.get("date") is not None time = DateTime(header.get("date")) # ... take our own date, clients are always lying! else: time = DateTime() # now let's create the date-path (yyyy/mm) year = str(time.year()) # yyyy month = str(time.mm()) # mm title = "%s %s"%(time.Month(), year) # do we have a year folder already? if not base_hasattr(archive, year): self.addMailBoxerFolder(archive, year, year, btree=False) yearFolder=getattr(archive, year) # do we have a month folder already? if not base_hasattr(yearFolder, month): self.addMailBoxerFolder(yearFolder, month, title) mailFolder=getattr(yearFolder, month) subject = header.get('subject', 'No Subject') sender = header.get('from','Unknown') # search a free id for the mailobject id = time.millis() while base_hasattr(mailFolder, str(id)): if force_id: raise AssertionError("ID %s already exists on folder %s" % (id, mailFolder)) id = id + 1 id = str(id) self.addMailBoxerMail(mailFolder, id, sender, subject, time, mailString) mailObject = getattr(mailFolder, id) return mailObject
def addMail(self, mailString, force_id=False): """ Store mail in date based folder archive. Returns created mail. See IMailingList interface. """ archive = aq_get(self, self.getValueFor('storage'), None) # no archive available? then return immediately if archive is None: return None (header, body) = splitMail(mailString) # if 'keepdate' is set, get date from mail, if self.getValueFor('keepdate'): assert header.get("date") is not None time = DateTime(header.get("date")) # ... take our own date, clients are always lying! else: time = DateTime() # now let's create the date-path (yyyy/mm) year = str(time.year()) # yyyy month = str(time.mm()) # mm title = "%s %s"%(time.Month(), year) # do we have a year folder already? if not base_hasattr(archive, year): self.addMailBoxerFolder(archive, year, year, btree=False) yearFolder=getattr(archive, year) # do we have a month folder already? if not base_hasattr(yearFolder, month): self.addMailBoxerFolder(yearFolder, month, title) mailFolder=getattr(yearFolder, month) subject = header.get('subject', _('No Subject')) sender = header.get('from',_('Unknown')) # search a free id for the mailobject id = time.millis() while base_hasattr(mailFolder, str(id)): if force_id: raise AssertionError("ID %s already exists on folder %s" % (id, mailFolder)) id = id + 1 id = str(id) self.addMailBoxerMail(mailFolder, id, sender, subject, time, mailString) mailObject = getattr(mailFolder, id) return mailObject
def adaptMail(self, REQUEST): """Adapts an incoming request to a specialized view for handling mail if requested.""" mailString = self.getMailFromRequest(REQUEST) (header, body) = splitMail(mailString) encoding = getSiteEncoding(self) subject = decode_header(str(Header(header.get('subject',''), encoding, errors='replace'))) command_match = re.search(mail_command_re, subject) if command_match: command_name = command_match.groups()[0] adapter = queryMultiAdapter((self, REQUEST), IMessageHandler, name=command_name) if adapter is not None: adapter.processMail() return True return False
def migrate(self): if self.is_updated(): return _(u'already migrated') # set the appropriate list type based on the previous settings # this may need to mark the appropriate interface on the mailing # list as well if self.context.moderated: self.context.list_type = PostModeratedListTypeDefinition elif self.context.closed: self.context.list_type = MembershipModeratedListTypeDefinition else: self.context.list_type = PublicListTypeDefinition # copy over the membership stuff annot = IAnnotations(self.context) listen_annot = annot.get('listen', {}) old_subscribers = listen_annot.get('subscribers', []) # create the new annotations by using current adapters mem_list = IWriteMembershipList(self.context) for subscriber in old_subscribers: mem_list.subscribe(subscriber) # unsubscribe (but leave as allowed senders) those who don't # receive mail nomail = listen_annot.get('norecvmail', []) for allowed_sender in nomail: mem_list.unsubscribe(allowed_sender) # copy over the moderation messages self.mod_post_pending_list = getAdapter(self.context, IPostPendingList, 'pending_pmod_post') for i in self.context.mqueue.objectIds(): (header, body) = splitMail(self.context.mqueue[i]) post = {'header': header, 'body': body} (user_name, user_email) = parseaddr(header.get('from', '')) self.mod_post_pending_list.add(user_email, user_name=user_name, post=post) # creates list managers from moderators and list owner managers = [] managers.append(self.context.list_owner) for moderator in self.context.moderators: managers.append(moderator) self.context.managers = tuple(managers) convert_manager_emails_to_memberids(self.context) # translate archived vocabulary if self.context.archived == 'not archived': self.context.archived = 2 elif self.context.archived == 'plain text': self.context.archived = 1 elif self.context.archived == 'with attachments': self.context.archived = 0 else: return _(u'error translating archive option') # annotate the list to say the migration completed self.migration_annot.append('policy_migration') return _(u'successfully migrated')