def handle_request(self, target=None, fields=None): # Get the tool used to normalize strings putils = getToolByName(self.context, 'plone_utils') result = self.validate_form(creation=True) if not result: return title, workflow, archive, mailto, managers = result private_archives = "private_list" in self.request.form sync_project_membership = "sync_project_membership" in self.request.form # Try to create a mailing list using the mailto address to see if it's going to be valid lists_folder = self.context try: lists_folder.invokeFactory(OpenMailingList.portal_type, mailto) except BadRequest: self.errors['mailto'] = _(u'list_create_duplicate_error', u'The requested list prefix is already taken.') self.add_status_message(_(u'psm_correct_errors_below', u'Please correct the errors indicated below.')) return list = lists_folder._getOb(mailto) list.managers = tuple(managers) self._assign_local_roles_to_managers(list) list.setDescription(unicode(self.request.form.get('description',''), 'utf-8')) old_workflow_type = list.list_type new_workflow_type = workflow_to_mlist_type(workflow) notify(ListTypeChanged(list, old_workflow_type.list_marker, new_workflow_type.list_marker)) list.archived = archive list.private_archives = private_archives if sync_project_membership: alsoProvides(list, ISyncWithProjectMembership) self.template = None #subscribe user to list sub_list = IWriteMembershipList(list) current_user = unicode(self.loggedinmember.getId()) sub_list.subscribe(current_user) s_message_mapping = {'title': title} s_message = _(u'list_created', u'"${title}" has been created.', mapping=s_message_mapping) self.add_status_message(s_message) list.reindexObject() self.redirect(list.absolute_url())
def handle_request(self, target=None, fields=None): result = self.validate_form() if not result: return title, workflow, archive, mailto, managers = result private_archives = "private_list" in self.request.form sync_project_membership = "sync_project_membership" in self.request.form list = self.context list.setTitle(title) list.setDescription(unicode(self.request.form.get('description',''), 'utf-8')) old_workflow_type = list.list_type new_workflow_type = workflow_to_mlist_type(workflow) notify(ListTypeChanged(list, old_workflow_type.list_marker, new_workflow_type.list_marker)) list.archived = archive list.private_archives = private_archives if sync_project_membership: if not ISyncWithProjectMembership.providedBy(list): alsoProvides(list, ISyncWithProjectMembership) else: if ISyncWithProjectMembership.providedBy(list): noLongerProvides(list, ISyncWithProjectMembership) list.managers = tuple(managers) self._assign_local_roles_to_managers() list.reindexObject() # we need to manually commit the transaction here because we are about # to throw a Redirect exception which would abort the transaction transaction.commit() self.template = None s_message = _(u'list_preferences_updated', u'Your changes have been saved.') self.add_status_message(s_message) # we need to raise a redirect here since permissions may have # been revoked for this view if the logged in user has removed # himself from the managers list raise Redirect('%s/summary' % list.absolute_url())
imported_ids = [] for list in settings: request = project.REQUEST request.set('title', list['info']['title']) lists_folder.invokeFactory(OpenMailingList.portal_type, list['info']['id']) ml = lists_folder[list['info']['id']] ml.mailto = list['info']['mailto'].split("@")[0] ml.managers = tuple(list['managers']) ml.setDescription(list['description']) workflow = list['preferences']['list_type'] from opencore.listen.utils import workflow_to_mlist_type old_workflow_type = ml.list_type new_workflow_type = workflow_to_mlist_type(workflow) from zope.event import notify from Products.listen.content import ListTypeChanged notify(ListTypeChanged(ml, old_workflow_type.list_marker, new_workflow_type.list_marker)) archive = list['preferences']['archive_setting'] archive = ['with_attachments', 'plain_text', 'not_archived'].index(archive) ml.archived = archive try: private_archives = list['preferences']['private_archives'] ml.private_archives = private_archives except: pass
def main(app, zipfile, project): user = app.acl_users.getUser('admin') print "Changing stuff as user", user newSecurityManager(None, user) app = makerequest(app) project = app.openplans.projects[project] proj_id = project.getId() zipfile = open(zipfile, 'rb') zipfile = ZipFile(zipfile) settings = [zipfile.read(i) for i in zipfile.namelist() if i and len(i.split("/")) == 4 and i.split("/")[1] == "lists" and i.split("/")[3] == "settings.ini"] from libopencore.import_utils import parse_listen_settings settings = [parse_listen_settings(i) for i in settings] from opencore.listen.mailinglist import OpenMailingList lists_folder = project.lists.aq_inner imported_ids = [] for list in settings: print "Creating list %s in project %s" % (list['info']['id'], proj_id) request = project.REQUEST request.set('title', list['info']['title']) lists_folder.invokeFactory(OpenMailingList.portal_type, list['info']['id']) ml = lists_folder[list['info']['id']] ml.mailto = list['info']['mailto'].split("@")[0] ml.managers = tuple(list['managers']) ml.setDescription(list['description']) workflow = list['preferences']['list_type'] from opencore.listen.utils import workflow_to_mlist_type old_workflow_type = ml.list_type new_workflow_type = workflow_to_mlist_type(workflow) from zope.event import notify from Products.listen.content import ListTypeChanged notify(ListTypeChanged(ml, old_workflow_type.list_marker, new_workflow_type.list_marker)) archive = list['preferences']['archive_setting'] archive = ['with_attachments', 'plain_text', 'not_archived'].index(archive) ml.archived = archive try: private_archives = list['preferences']['private_archives'] ml.private_archives = private_archives except: pass if list['preferences']['sync_membership']: from zope.interface import alsoProvides from opencore.listen.interfaces import ISyncWithProjectMembership alsoProvides(ml, ISyncWithProjectMembership) ml.creators = (list['info']['created_by'], ) ml.getField("creation_date").set(ml, list['info']['created_on']) ml.getField("modification_date").set(ml, list['info']['modified_on']) # Import pending sub/unsub requests, post and allowed sender and subscription moderation queue. WTF. import simplejson as json from Products.listen.content.subscriptions import create_pending_list_for for annotation in ("pending_a_s_mod_email", "a_s_pending_sub_email", "pending_sub_email", "pending_sub_mod_email", "pending_unsub_email", "pending_mod_post", "pending_pmod_post"): try: data = zipfile.read("%s/lists/%s/%s.json" % (proj_id, ml.getId(), annotation)) except KeyError: data = "{}" data = json.loads(data) ModerationBucket = create_pending_list_for(annotation) moderation_bucket = ModerationBucket(ml) moderation_bucket.trust_caller = True for mem_email in data: moderation_info = data[mem_email] cleaned_moderation_info = {} for mkey in moderation_info: if moderation_info[mkey] is not None: cleaned_moderation_info[str(mkey)] = moderation_info[mkey] posts = None if 'post' in cleaned_moderation_info: posts = cleaned_moderation_info.pop("post").values() # @@TODO moderation_bucket.add(mem_email, **cleaned_moderation_info) while posts: add_post = posts[0] posts = posts[1:] cleaned_moderation_info['post'] = add_post moderation_bucket.add(mem_email, **cleaned_moderation_info) imported_ids.append(ml.getId()) ml.reindexObject() transaction.get().commit(True) from StringIO import StringIO print "Creating archives" archives = [i for i in zipfile.namelist() if i and len(i.split("/")) == 4 and i.split("/")[1] == "lists" and i.split("/")[3] == "archive.mbox"] for ml_id in imported_ids: archive = [i for i in archives if i.split("/", 1)[1] == "lists/%s/archive.mbox" % ml_id] if not archive: continue archive = archive[0] print "Importing archive for list %s" % ml_id archive = zipfile.read(archive) archive = StringIO(archive) from Products.listen.extras.import_export import ( MailingListMessageImporter, MailingListSubscriberImporter) ml = project.lists[ml_id] setSite(ml) importer = MailingListMessageImporter(ml) importer.import_messages(archive) ml.reindexObject() memberlists = [i for i in zipfile.namelist() if i and len(i.split("/")) == 4 and i.split("/")[1] == "lists" and i.split("/")[3] == "subscribers.csv"] print "Importing subscribers" transaction.get().commit(True) setSite(app.openplans) for ml_id in imported_ids: memberlist = [i for i in memberlists if i.split("/", 1)[1] == "lists/%s/subscribers.csv" % ml_id] if not memberlist: continue memberlist = memberlist[0] memberlist = zipfile.read(memberlist) memberlist = StringIO(memberlist) members = [s.strip().split(",")[-2:] for s in memberlist] members = [e for e in members if '@' in e[0] and e[1].strip() in ("subscribed", "allowed")] ml = project.lists[ml_id] from Products.listen.extras.import_export import \ MailingListSubscriberImporter importer = MailingListSubscriberImporter(ml) importer.import_subscribers(members) ml.reindexObject() setSite(app.openplans) from Products.listen.utilities.list_lookup import IListLookup, getUtility list_lookup_utility = getUtility(IListLookup, context=app.openplans) for ml_id in in imported_ids: ml = project.lists[ml_id] list_lookup_utility.registerList(ml) transaction.commit()