示例#1
0
    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())
示例#2
0
    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()