• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

from Products.CMFCore.utils import getToolByName
from Products.Five import BrowserView
from logging import getLogger
from Products.ViC.utils import ProxyContext
from AccessControl import ClassSecurityInfo, getSecurityManager
import traceback, StringIO
import os, cPickle
from Products.ViC.managers import MockRequest, ProjectAddView, save_featurelets
import Products.ViC.config as config
from Products.ViC.workflows.utils import getManagers
from Products.remember.utils import getAdderUtility
from Products.remember.config import ANNOT_KEY
from Products.remember.config import HASHERS
from Products.remember.interfaces import IHashPW
from AccessControl import ClassSecurityInfo, getSecurityManager
from Products.ViC.utils import ProxyContext
from Products.ViC.workflows.utils import startUserMemberships
from Products.ViC.profile.interfaces import IProfile, IAddresses, \
     IPhoneNumbers, IAbstracts, ICareerData, IKeywords, IEducation, \
     ITrainees
from Products.ViC.profile.address import Address
from Products.ViC.profile.abstract import Abstract
from Products.ViC.profile.career import CareerData
from Products.ViC.profile.keyword import Keyword
from Products.ViC.profile.education import EducationData
from Products.ViC.profile.phone import PhoneNumber as PN
from Products.ViC.profile.trainees import Trainee 
from Products.ViC.managers import member_joined_project_listen
from Acquisition import aq_parent, aq_inner
from zope.component import getAdapter
import mailbox
import traceback
import StringIO
import cPickle
from Products.listen.lib.common import assign_local_role
from Products.listen.interfaces.list_types import PostModeratedListTypeDefinition
from Products.listen.utilities.list_lookup import MailDeliveryView
from AccessControl.interfaces import IRoleManager
import zope
from zope.component import getUtility
from zope.event import notify
from Products.listen.interfaces import IListLookup
from opencore.listen.mailinglist import OpenMailingList
from Products.listen.interfaces import IWriteMembershipList
from Products.listen.content import ListTypeChanged
from Products.ViC.featurelets.interfaces import IResourceCategorized
from zope.component import getAdapter
from Products.ViC.featurelets.interfaces import IResourceContainer, IBloggable, IBlogContainer, IResource
from zope.interface import alsoProvides, directlyProvides
import mimetypes
from Products.Confirmation.interfaces.confirmable import IConfirmation, IConfirmable
from Products.ViC.managers import createAllUsers
import uuid, sets
from email import message_from_string
from DateTime import DateTime
from dateutil.parser import parser as parse_date
from zope.app import zapi
from Products.listen.interfaces import ISearchableArchive
import mimetools, re
class StartConversion(BrowserView):
 
    def processForm(self):
        dataDir = str(self.request.form.get("datadir"))
        mailmanDir = str(self.request.form.get("archives"))
        mysqluser = str(self.request.form.get("user"))
        mysqlpass = str(self.request.form.get("passwd"))
        mysqldb = str(self.request.form.get("mysql_db"))
        mysqlhost = str(self.request.form.get("mysql_host"))
        domain = str(self.request.form.get("domain"))
        l = getLogger("ProcessForm")
        l.info("stage = %s"%self.request.form.get("stage"))
 
        if not "stage" in self.request.form.keys():
 
            l.info("In startConversion.processForm")
            l.info("dataDir = %s"%dataDir)
            if dataDir != "None":
                try:
                    self.createGroups(dataDir)
                    self.createUsers(dataDir)
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc(file=s)
                    l.info(s.getvalue())
                self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?archives=" + mailmanDir + "&datadir=" + dataDir + "&user=" + mysqluser + "&passwd=" + mysqlpass + "&mysql_db=" + mysqldb + "&mysql_host=" + mysqlhost +"&portal_status_message=User and Group Import Complete&stage=mailman&domain="+domain )
            else:
                return 
        elif self.request.form.get("stage")=="fixup":
            po = getToolByName(self.context, "portal_url").getPortalObject()
            pt = getToolByName(self.context, "portal_teams")
            groups = po._getOb("groups")
            for g in groups.objectIds():
                if not g.startswith(".") and not g.startswith("portal"):
                    l.info("looking at %s"%g)
                    group = groups._getOb(g)
                    lists = group._getOb("lists")
                    team = pt.getTeamById(group.getId())
                    memberships = team.getMemberships()
                    for listId in lists.objectIds():
                        l.info("list is %s"%listId)
                        list = lists._getOb(listId)
                        for m in memberships:
                            l.info("adding member %s"%m.getId())
                            member_joined_project_listen(m, None)
                        list.reindexObject()
 
        elif self.request.form.get("stage") == "mailman" and "submitted" not in self.request.form.keys() and "confirmed" not in self.request.form.keys():
            confirmations = getToolByName(self.context, 'portal_confirmations')
            l.info("confirming and making users public")
            for conf in confirmations.objectIds():
                l.info("processing confirmation %s"%conf)
                try:
                    con = confirmations._getOb(conf)
                    if con.portal_type!="Document":
                        icon = getAdapter(con, IConfirmable)
                        icon.confirm( con.getId() )
                        l.info("confirmed, i think")
                        m = con.getTarget()
                        wft = getToolByName(self.context, 'portal_workflow')
                        ids = wft.getWorkflowsFor(m)
                        for wf in ids:    
                            l.info("making pending")
                            action = ("make_pending",)
                            for a in action:
                                try:
                                    setattr(m, "donotredirect", True)
                                    wf.doActionFor(aq_inner(m), a ) 
                                except:
                                    s = StringIO.StringIO()
                                    traceback.print_exc(file = s)
                                    l = getLogger("invite exception")
                                    l.info(s.getvalue())
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc(file = s)
                    l = getLogger("invite exception")
                    l.info(s.getvalue())
            self.addManagement()
            self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?archives=" + mailmanDir + "&datadir=" + dataDir + "&user=" + mysqluser + "&passwd=" + mysqlpass + "&mysql_db=" + mysqldb + "&mysql_host=" + mysqlhost +"&portal_status_message=User and Group Import Complete&stage=mailman&domain="+domain +"&confirmed=True" )
            return
        elif self.request.form.get("stage") == "mailman" and "submitted" not in self.request.form.keys() and "approved" not in self.request.form.keys():
            self.setResetPasswords()
            #confirmations = getToolByName(self.context, 'portal_confirmations')
            memberdata = getToolByName(self.context, "portal_memberdata")
            pm = getToolByName(self.context, 'portal_membership')
            l.info("confirming and making users public")
            for mdata in memberdata.objectIds():
                try:
                    m = pm.getMemberById( mdata)
                except:
                    m = None
                    wft = getToolByName(self.context, 'portal_workflow')
                    ids = wft.getWorkflowsFor(m)
                    for wf in ids:    
                        l.info("activate")
                        action = ("activate",)
                        for a in action:
                            try:
                                setattr(aq_inner(m), "donotredirect", True)
                                wf.doActionFor(m, a ) 
                            except:
                                s = StringIO.StringIO()
                                traceback.print_exc(file = s)
                                l = getLogger("invite exception")
                                l.info(s.getvalue())
 
 
            self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?archives=" + mailmanDir + "&datadir=" + dataDir + "&user=" + mysqluser + "&passwd=" + mysqlpass + "&mysql_db=" + mysqldb + "&mysql_host=" + mysqlhost +"&portal_status_message=User and Group Import Complete&stage=mailman&domain="+domain +"&confirmed=True&approved=True" )
            return
 
        elif  self.request.form.get("stage") == "mailman" and "submitted" not in self.request.form.keys() and "allusers" not in self.request.form.keys():
            pm = getToolByName(self.context, 'portal_membership')
            memberdata = getToolByName(self.context, "portal_memberdata")
            m = pm.getMemberById( memberdata.objectIds()[-1] )
            l.info("passing %s to createAllUsers"%pm.getAuthenticatedMember() )
            createAllUsers(pm.getAuthenticatedMember())
            self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?archives=" + mailmanDir + "&datadir=" + dataDir + "&user=" + mysqluser + "&passwd=" + mysqlpass + "&mysql_db=" + mysqldb + "&mysql_host=" + mysqlhost +"&portal_status_message=User and Group Import Complete&stage=mailman&domain="+domain +"&confirmed=True&approved=True&allusers=True" )
        elif self.request.form.get("stage") == "mailman" and "submitted" in self.request.form.keys():
 
            try:
 
                self.handleLists()
            except:
                s = StringIO.StringIO()
                traceback.print_exc(file=s)
                l.info(s.getvalue())
            self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?archives=" + mailmanDir + "&datadir=" + dataDir + "&user=" + mysqluser + "&passwd=" + mysqlpass + "&mysql_db=" + mysqldb + "&mysql_host=" + mysqlhost +"&portal_status_message=Mailing List Import Complete&stage=resources&domain="+domain )
        elif self.request.form.get("stage") == "resources" and "submitted" in self.request.form.keys():
            try:
                self.handleResources()
            except:
                s = StringIO.StringIO()
                traceback.print_exc(file=s)
                l.info(s.getvalue())
            l.info("redirecting to cleanup")
            self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?stage=cleanup")
        elif self.request.form.get("stage") == "cleanup":
            self.setPasswords()
            self.request.RESPONSE.redirect( self.context.portal_url() + "/convert?stage=complete")
 
 
    def setPasswords(self):
        l = getLogger("setPasswords")
        l.info("setting passwords for new users")
        pm = getToolByName(self.context, "portal_membership")
        prt = getToolByName(self.context, "portal_password_reset")
        ids = pm.listMemberIds()
        l.info("user list is %s"%ids)
        objectIds= prt._requests.keys() #objectIds()
 
        for i in ids:
            request = None
            try:
 
                member = pm.getMemberById(i)
            except:
                member = None
            if member:
                requests = list()
                l.info("looking at %s"%member.getId())
                if not member.password:
                    l.info("resetting password")
                    l.info('objectIds are %s'%str(objectIds))
 
                    for obId in objectIds:
                        obj = prt._requests.get(obId, ())
                        l.info("obj keys are %s"%str(obj))
                        if len(obj)>1 and obj[0] == member.getId():
                            requests.append(obId)
                        #brea
                        else:
                            l.info('no request for %s'%obId)
 
                #obj = prt.requestReset(member.getId() )
                if requests:
                    l.info('requests are %s'%requests)
                    for request in requests:
                        try:
 
                            randomstring = request
                            l.info("randomstring is %s"%randomstring)
                            prt.resetPassword(member.getId(), randomstring, '4U2change')
                            member.setMust_change_password(True)
                        except:
                            try:
                                del prt._requests[request]
                            except:
                                pass
                #member.setPassword("4U2Change")
                    l.info("password is now %s"%member.password)
 
    def setResetPasswords(self):
        l = getLogger("setResetPasswords")
        l.info("setting passwords for new users")
        pm = getToolByName(self.context, "portal_membership")
        prt = getToolByName(self.context, "portal_password_reset")
        ids = pm.listMemberIds()
        l.info("user list is %s"%ids)
        for i in ids:
            l.info("looking for '%s'"%i)
            try:
                member = pm.getMemberById(i)
            except:
                member = None
            if member:
                l.info("looking at %s"%member.getId())
                if not member.password:
                    l.info("resetting password")
                    obj = prt.requestReset(member.getId() )
                    randomstring = obj['randomstring']
                #l.info("randomstring is %s"%randomstring)
                #prt.resetPassword(member.getId(), randomstring, '4U2change')
                #member.setPassword("4U2Change")
                #l.info("password is now %s"%member.password)
    def handleResources(self):
        l = getLogger("resources")
        l.info("handleresources")
        po = getToolByName(self.context, "portal_url").getPortalObject()
        gr = po._getOb("groups")
        group = gr._getOb("all-users")
        resources = group._getOb("resources")
        rc = getToolByName(group, "portal_resource_categories")
        dataDir = str(self.request.form.get("datadir"))
        db_connection =  getToolByName( self.context, "MySQL_database_connection")
        db_connection = db_connection.factory()(db_connection.connection_string)
        faq_dir = os.path.join( dataDir, ".FILES", "FAQS")
        rc_dir = os.path.join(dataDir, ".FILES", "RC")
        faq_categories = {
            "None":"FAQs",
            "GEN":"FAQs/General FAQS",  
            "VMR":"FAQs/Virtual Meeting Rooms",
            "DCX":"FAQs/Document Exchange",
            "OTH":"FAQs/Other"}
        l.info("categories are %s"%str(faq_categories))
        faq_types = { "MAN":"Manuals", "DWN":"Downloads", "FAQ":"Manuals"}
        faq_map = {}
        l.info('types are %s'%str(faq_types))
        for key, cat in faq_categories.items():
            try:
                dictRequest = { "title": cat }
                id = str(uuid.uuid1() )#cat.replace("/", "-").lower()
                l.info("creating %s"%cat)
                l.info('existing ids are %s'%str(list(rc.objectIds())))
                o = rc.invokeFactory("ResourceCategory", id, **dictRequest) 
                for key, t in faq_types.items():
                    ty = os.path.join(cat, t)
                    dictRequest = {"title":ty }
                    cat = str(uuid.uuid1() )#ty.replace("/", "-").lower()
                    l.info("creating %s"%ty)
                    o = rc.invokeFactory("ResourceCategory", id, **dictRequest) 
                    faq_map[ty] = id
            except:
 
                s = StringIO.StringIO()
                traceback.print_exc( file=s)
                l.info(s.getvalue())
        sql = "select area, type, title, description, file, url from faqs;"
        items, res = db_connection.query(sql, 0)
        for faq in res:
            area = faq[0]
            type = faq[1]
            title = faq[2]
            description = faq[3]
            filename = faq[4]
            url = faq[5]
            category = faq_categories.get(area, "")
            type = faq_types.get(type, "")
            category = os.path.join(category, type)
            if not category in faq_map:
                id = str(uuid.uuid1() )
                dictRequest={"title":category}
                l.info("creating %s"%category)
                o = rc.invokeFactory("ResourceCategory", id, **dictRequest)
                faq_map[category] = id
            id =self.context.plone_utils.normalizeString(title)
            if url:
 
                portal_type = "Link"
                dictRequest = { "title":title,
                                "description": description,
                                "remoteUrl": url }
                try:
                    o = resources.invokeFactory(portal_type, id, **dictRequest)
                    obj = resources._getOb(o)
                    obj.remoteUrl = url
                    l.info("remote url should be %s, it is %s"%(url, obj.remoteUrl))
                    obj.setDescription(description)
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc( file=s)
                    l.info(s.getvalue())
                    obj = None            
            else:
                try:
                    id = self.context.plone_utils.normalizeString(filename)
                    portal_type = "File"
                    f = file( os.path.join( faq_dir, filename))
                    type, subtype = mimetypes.guess_type( filename)
                    data = f.read()
                    f.close()
                    dictRequest = { "title":title,
                                "description": description,
                              }
 
                    o = resources.invokeFactory(portal_type, id, **dictRequest)
                    obj = resources._getOb(o)
                    obj.update_data(data, type)
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc( file=s)
                    l.info(s.getvalue())
                    obj = None
            try:
                if obj:
                    directlyProvides(obj, IResource)
                cat = getAdapter(obj, IResourceCategorized)
                category = self.lookupCategory( obj, category )
                l.info('adding to category %s, faq-map is %s'%(category, faq_map.get(category, '')))
                cat.addCategory(category)
 
            except:
                s = StringIO.StringIO()
                traceback.print_exc( file=s)
                l.info(s.getvalue())
        self.createCategories(group = group)
        rc = getToolByName(resources, 'portal_resource_categories')
        oids = rc.objectIds()
        for i in oids:
            o = rc._getOb(i)
            faq_map[ o.Title() ] = o.getId()
        l.info(faq_map.keys() )
        sql = "select url, title, description, file, linkId from links where fTable is null;"
        items, res = db_connection.query(sql, 0)
        for r in res:
            l.info( r )
            url = r[0]
            title = r[1]
            description = r[2]
            filename = r[3]
            linkId = r[4]
            if url:
                id =self.context.plone_utils.normalizeString(title)
                portal_type = "Link"
                dictRequest = { "title":title,
                                "description": description,
                                "remoteUrl": url }
                try:
                    o = resources.invokeFactory(portal_type, id, **dictRequest)
                    obj = resources._getOb(o)
                    obj.remoteUrl = url
                    l.info("remote url should be %s, it is %s"%(url, obj.remoteUrl))
                    obj.setDescription(description)
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc( file=s)
                    l.info(s.getvalue())
                    obj = None
            else:
                try:
 
                    id = self.context.plone_utils.normalizeString(filename)
                    portal_type = "File"
                    l.info( "%s/%s"%(rc_dir, filename))
                    f = file( os.path.join( rc_dir, filename))
                    type, subtype = mimetypes.guess_type( filename)
                    data = f.read()
                    f.close()
                    dictRequest = { "title":title,
                                    "description": description,
                                    }
 
                    o = resources.invokeFactory(portal_type, id, **dictRequest)
                    obj = resources._getOb(o)
                    obj.update_data(data, type)
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc( file=s)
                    l.info(s.getvalue())
                    obj = None
            sql = "select categoryID from linkCats where linkID=%s"%linkId
            categories = list()
            items, catres = db_connection.query(sql, 0)
            for s in catres:
                category = self.rebuildCategory(db_connection, s[0]) 
                #if not category.startswith("First Page"):
                #    category = os.path.join( "First Page" , category)
                if category.endswith("/"):
                    category = category[:-1]
                    l.info("had to truc category it is now %s"%category)
 
                categories.append(category)
            try:
                if obj:
                    directlyProvides(obj, IResource)
                cat = getAdapter(obj, IResourceCategorized)
                for category in categories:
                    l.info("adding category %s"%faq_map.get(category, category))
                    category = self.lookupCategory( obj, category )
                    l.info('adding to category %s, faq-map is %s'%(category, faq_map.get(category, '')))
                    cat.addCategory( category)
 
            except:
                s = StringIO.StringIO()
                traceback.print_exc( file=s)
                l.info(s.getvalue())
        try:
            cat = getAdapter(resources, IResourceCategorized)
            cat.rebuildIndex()
        except:
            s = StringIO.StringIO()
            traceback.print_exc( file=s)
            l.info(s.getvalue())
    def lookupCategory(self, obj, category):
        rc = getToolByName(obj, 'portal_resource_categories')
        objectIds = rc.objectIds()
        catName = ""
        for objectId in objectIds:
            o = rc._getOb(objectId)
            if o.Title() == category:
                catName = o.getId()
                break
        return catName
    def rebuildCategory(self, db_connection, categoryId, curr=""):
        if not db_connection:
            db_connection =  getToolByName( self.context, "MySQL_database_connection")
            db_connection = db_connection.factory()(db_connection.connection_string)
        sql = "select categoryID, name, parentID, shortName from categories where categoryID = %s;"%categoryId
        items, res = db_connection.query(sql, 0)
        for cat in res:
            cate = cat[1]
            if cat[3] == "CURRENT":
                cate = ""
 
            curr = os.path.join( cate, curr)
            curr= self.rebuildCategory(db_connection, cat[2], curr)
 
        return  curr
    def createCategories(self, parentId=0, currCat="", db_connection=None, group = None):
        l = getLogger("createCategories")
        if not group:
            group = self.context
        rc = getToolByName(group, "portal_resource_categories")
        if not db_connection:
            db_connection =  getToolByName( self.context, "MySQL_database_connection")
            db_connection = db_connection.factory()(db_connection.connection_string)
 
        sql = "select categoryID, name, parentID from categories where parentID = %s;"%parentId
 
        items, res = db_connection.query(sql, 0)
        for cat in res:
            l.info(cat)
            name = cat[1]
            catName = os.path.join(currCat, name)
            dictRequest = { "title": catName }
            id =  str(uuid.uuid1() )#catName.replace("/", "-").lower()
            l.info("creating %s with id %s"%(catName, id))
            try:
                l.info('existing ids are %s'%str(list(rc.objectIds())))
                o = rc.invokeFactory("ResourceCategory", id, **dictRequest)
            except:
                s = StringIO.StringIO()
                traceback.print_exc( file=s)
                l.info(s.getvalue())
            parentId = cat[0]
 
            self.createCategories( cat[0], catName , db_connection, group)
 
 
 
    def handleLists(self):
        po = getToolByName(self.context, "portal_url").getPortalObject()
        gr = po._getOb("groups")
        oids = gr.objectIds()
        # set the fully qualified domain name for 
        # this plone instance.
        pp = getToolByName(self.context, "portal_properties")
        oc = pp.opencore_properties
        pm = getToolByName(self.context, "portal_membership")
        pt = getToolByName(self.context, "portal_teams")
        oc.mailing_list_fqdn = self.request.form.get("domain")
        l = getLogger("handleLists")
        OpenMailingList.senderlimit=100000000
        for k in self.request.form.keys():
            if k.startswith("selector-"):
                try:
                    value=self.request.form.get(k)
                    if value:
                        listid = k.replace("selector-", "")
                        if value in oids:
 
                            # need to 1) create mailing list matching the current 
                            # settings as closely as possible
                            l.info("put %s in %s"%(listid, value))
                            t = pt.getTeamById( value )
                            lookup = dict()
                            for m in t.getMemberships():
                                id = m.getId()
                                m = pm.getMemberById(id)
                                if hasattr( m, "getEmail"):
                                    lookup[m.getEmail()] = m.getId()
                            fname = os.path.join( self.request.form.get("archives"),
                                                  "lists",
                                                  listid,
                                                  "config.pck")
                            domain, listname = os.path.split( listid)
                            config = cPickle.load( file(fname))
                            members = config["members"]
                            group = gr._getOb( value )
                            discussions = group._getOb("lists")
                            try:
                                discussions.invokeFactory( 'MailingList', listname)
                            except:
                                # already exists, continue
                                pass
                            list_ob = discussions._getOb(listname)
                            list_ob.mailto = "%s@%s"%(listname, domain)
                            old_list_type = list_ob.list_type.list_marker
                            list_ob.list_type = PostModeratedListTypeDefinition
                            # so now we automatically subscribe all members
                            # this is not so good for our conversion
                            # process since the user will get the old messages
                            # so... we are going to unsubscribe them all
                            # here... and then re-subscribe them
                            # when the messages have been imported.
                            mem_list = IWriteMembershipList(list_ob)
                            sub = []
                            l.info("addingmembers")
                            for k in members:
                                sub.append( lookup.get(k,k) )
                                u = lookup.get(k)
                                if not u:
                                    u = k
                                #l.info("adding sender %s"%str(u))
                                #mem_list.add_allowed_sender(u)
                                #if True:
                                #    l.info("unsubscribing :%s"%u)
                                #    mem_list.unsubscribe(u)
                            managers = []
                            for k in config["moderator"]:
                                u = pm.getMemberById( lookup.get(k) )
                                if not u:
                                    u = None
                                    l.info("adding sender %s"%str(u))
                                if u:
                                    managers.append( u )
                            #list_ob.managers = tuple( managers )
 
                            ll = getUtility(IListLookup, context=self.context)
                            l.info("registering %s as %s"%(list_ob, list_ob.mailto))
                        #ll.registerLisrt(list_ob)
                            try:
                                l.info("registered %s"%ll.getListForAddress(list_ob.mailto))
                                notify(zope.app.event.objectevent.ObjectCreatedEvent(list_ob))
                        #notify(ListTypeChanged(list_ob, old_list_type, list_ob.list_type))
                            except:
                                pass
                            assign_local_role('Owner', managers, IRoleManager(list_ob))
                            list_ob.setTitle( config["real_name"] )
                        #list_ob.setDescription( str(config["info"] ))
                        #list_ob.archived = "The entire message, including attachments"
 
 
 
 
                        # 2) open mailbox and add the content to the mailing list
                            fname = os.path.join( self.request.form.get("archives"),
                                                  "archives",
                                                  "private",
                                                  "%s.mbox"%listid,
                                                  "%s.mbox"%listname)
                            mb = mailbox.UnixMailbox(file(fname))
                            msg = mb.next()
                            count = 1
                            messages = dict()
                            while msg:
                            #for some reason this doesn't work...
                            #fp = StringIO.StringIO()
                            #for h in msg.headers:
                            #    fp.write(h)
                            #fp.write("\r\n")
                            #fp.write(msg.fp.read() )
                                l.info('posting message %s'%count)
                                mailString =  str(msg) + "\r\n" + msg.fp.read()
                                m = message_from_string(mailString)
                                time = DateTime()
                                key = m.get('From') + "/" + m.get('Subject')
                                archive = list_ob._getOb("archive")
                                year = str(time.year())
                                month=str(time.mm())
 
                                title = "%s %s"%(time.Month(), year)
                                if not hasattr(archive, year):
                                    list_ob.addMailBoxerFolder(archive, year, year, btree=False)
                                yearFolder=getattr(archive, year)
                                if not hasattr(archive, month):
                                    try:
                                        list_ob.addMailBoxerFolder(yearFolder, month, month, btree=False)
                                    except:
                                        pass
                                mailFolder = getattr(yearFolder, month)
                                subject = m.get("Subject", "No Subject")
                                sender = m.get("From", "Unknown")
                                l.info(m.get("Date", None))
                                try:
                                    sent = parse_date().parse( m.get("Date", None) ).isoformat()
                                except:
                                    s = StringIO.StringIO()
                                    traceback.print_exc(file=s)
                                    l.info(s.getvalue())
                                    sent = None
 
                                sent = DateTime(sent)
                                l.info("sent is %s"%sent)
                                id = sent.millis()
                                while hasattr(mailFolder, str(id)):
                                    id = id + 1
                                id = str(id)
                                mail = list_ob.addMailBoxerMail(mailFolder, id, sender, subject, sent, mailString)
                                (TextBody, ContentType, HtmlBody, Attachments) = list_ob.unpackMail(mailString)
                                for attach in Attachments:
                                    id = DateTime().millis()
                                    while hasattr(mail, str("%s.%s"%(str(id), attach['subtype']))):
                                        id = id + 1
                                        list_ob.addMailBoxerFile( mail,
                                                                  '%s.%s'%(str(id), attach["subtype"]),
                                                                  attach["filename"],
                                                                  attach["filebody"],
                                                                  attach["maintype"] + "/" + attach['subtype'])
                                if ContentType:
                                    body = TextBody
                                else:
                                    body = list_ob.HtmlToText(body)
                                list_ob.setMailBoxerMailProperty(mail, "mailFrom", sender, 'string')
                                list_ob.setMailBoxerMailProperty(mail, "mailSubject", subject, "string")
                                headers_regexp = list_ob.getValueFor('headers')
                                if headers_regexp:
                                    msg = mimetools.Message(StringIO.StringIO(mailString))
                                    for (key, value) in msg.items():
                                        if re.match(headers_regexp, key, re.IGNORECASE):
                                            headers.append('%s: %s'%(key, value.strip))
                                    self.setMailBoxerProperty(mail, 'mailHeader', headers, 'lines')
 
                                mail.date = sent
                                mail.setCreationDate(sent)
                                mail.setCreationDate(sent)
                                mail.setEffectiveDate(sent)
                                mail.reindexObject()
                                mail.setModificationDate(sent)
                                list_ob.catalogMailBoxerMail(mail)
                                messages[key] = m
                                mockReq = {"Mail": mailString}
 
                            #list_ob.addMail( mailString )
                                count = count + 1
                                msg = mb.next()
 
                            list_ob.reindexObject()
                            search = zapi.getUtility(ISearchableArchive)
                            search._initIndexes()
                            for k in members:
                                u = lookup.get(k)
                                if not u:
                                    u = k
                                    l.info("resubscribing %s"%u)
                                    #mem_list.subscribe(u)
                    else:
                        l.info("Do not import %s"%listid)
                except:
                    s=StringIO.StringIO()
                    traceback.print_exc(file=s)
                    l.info(s.getvalue())
        OpenMailingList.senderlimit=100
 
    def lists(self):
        l = getLogger("lists")
        l.info('getting lists')
        mailmanDir = self.request.form.get("archives")
        domain = self.request.form.get("domain")
        listDir = os.path.join( mailmanDir, "lists", domain)
        l.info('list dir is %s'%listDir)
        gen = os.walk(listDir)
 
        for dirname, dirs, filenames in gen:
            l.info("I'm in dirname = %s"%dirname)
            for d in dirs:
                try:
                    l.info('trying to open %s'%os.path.join(mailmanDir, "archive\\",d))
                    m = mailbox.UnixMailbox( file( os.path.join( mailmanDir, "archives", "private", domain, "%s.mbox"%d, "%s.mbox"%d) ) )
                    count = 0
                    while m.next():
                        count = count + 1
                    list = dict()
                    list["listid"] = "%s/%s"%(domain, d)
                    list["listname"] = d
                    list["listaddress"] = "%s@%s"%(d, domain)
                    list["count"] = count
                    l.info("yielding list")
                    yield list
                except:
                    s= StringIO.StringIO()
                    traceback.print_exc(file=s)
                    l = getLogger("list exception")
                    l.info(s.getvalue())
 
 
    def projects(self):
        po = getToolByName(self.context, "portal_url").getPortalObject()
        gr = po._getOb("groups")
        oids = gr.objectIds()
        return [ (id, gr._getOb(id).Title() ) for id in oids if not id.startswith(".")]
 
 
 
    def addManagement(self):
        l = getLogger("addManagement")
        portal = getToolByName(self.context, "portal_url").getPortalObject()
        groupContainer = portal._getOb("groups")
        managers = getManagers(groupContainer)
        membership = getToolByName(groupContainer, 'portal_membership')
        managers.append( membership.getAuthenticatedMember() )
        managers = list( sets.Set( managers ))
        groups = [ groupContainer._getOb(g) for g in groupContainer.objectIds() if groupContainer._getOb(g).portal_type=='ViCProject' ]
        portal_catalog = getToolByName(groupContainer, 'portal_catalog')
        pt = getToolByName(self.context, 'portal_teams')
        teams = pt.getTeams()
        for group in groups:
            t = None
            for t in teams:
                if t.id == group.id:
                    break
            if not t:
                group._createTeam()
                localTeams = group.getTeams()
                for t in localTeams:
                    if t.id == group.id:
                        break
            l.info('team is %s'%t)
            for mem in managers:
                try:
 
                    ship = t.addMember( mem.getId(), membership_type="ViCAutomatedMembership")
                    l.info("members are %s"%t.getMemberships())
 
                    ships = [ ship for ship in t.getMemberships() if ship.getId() == mem.getId() ]
                    l.info(ships)
                    if len(ships)>0:
                        sm = getSecurityManager()
                        proxy_roles = ['Manager', ]
                        context = ProxyContext(proxy_roles)
                        sm.addContext(context)
                    #ship = t.getMembershipByMemberId(mem.getId())
                        try:
                            ship.editTeamRoles( ["ProjectAdmin",
                                             "ProjectMember" ] )
                            wft = getToolByName(self, "portal_workflow")
                            ids = wft.getWorkflowsFor(ship)
                            for wf in ids:
                                try:
                                    l.info("wf is %s"%wf)
                                    wf.doActionFor(ship, 'start')
                                except:
                                    s = StringIO.StringIO()
                                    traceback.print_exc( file = s )
                                    l.info( s.getvalue() )
                            reference = t.membership_reference_class
                            mem.addReference(ship, relationship=reference.relationship,
                                         referenceClass=reference)
                            portal_catalog= getToolByName( ship, 'portal_catalog')
                            group._updateMember('add', mem.getId(), ship, t)
                            portal_catalog.reindexObject(group)
                            t.reindexTeamSpaceSecurity()
                        finally:
                            sm.removeContext(sm)
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc(file=s)
                    l.info(s.getvalue())
 
 
 
    def createGroups(self, dataDir):
        l = getLogger("createGroups")
        groupDir = os.path.join( dataDir, "DATA/groups")
        files = os.walk( groupDir)
        portal = getToolByName(self.context, "portal_url").getPortalObject()
        groupContainer = portal._getOb("groups")
        managers = getManagers(groupContainer)
        membership = getToolByName(groupContainer, 'portal_membership')
        if len(managers)>0 and hasattr(managers[0], "getId"):
            managerIds = [ m.getId() for m in managers]
        else:
            managerIds = []
        managerIds.append( membership.getAuthenticatedMember() )
        managerIds = [ m for m in managerIds if m is not None ]
        managerIds = list ( sets.Set( managerIds ) )
        l.info("managers are %s"%managerIds)
        putils = getToolByName(self.context, 'plone_utils')
        l.info(1)
        portal_catalog = getToolByName(groupContainer, 'portal_catalog')
        for dirname, dirs, filenames in files:
            l.info(2)
            for fname in filenames:
                l.info(3)
                try:
                    l.info("opening %s"%os.path.join(groupDir, fname))
                    fname = os.path.join(groupDir, fname)
                    f = file(fname, "r")
                    group = cPickle.load(f)
                    f.close()
                    groupName = group["groupName"]
                    l.info("group id = %s"%groupName)
                    groupId = putils.normalizeString(groupName)
                    mr = MockRequest()
                    mr["id"] = groupId
                    mr["title"] = groupName
                    mr["featurelets"] = config.REQUIRED_FEATURELETS
                    mr["team_assignment"] = 1
                    mr["workflow_policy"] =  config.DEFAULT_WORKFLOW_POLICY
                    mr["set_flets"] = True
                    v = ProjectAddView(groupContainer, mr)
                    v.createAndAdd()                
                    project = groupContainer._getOb( groupId )
                    save_featurelets(project, request=mr)
                    pt = getToolByName( self.context, "portal_teams")
                    teams = pt.getTeams()
                #teams = project.getTeams()
 
                    t = None
                    for t in teams:
                        if t.id==project.id: 
                            break
                    if not t:
                        project._createTeam()
                        teams=project.getTeams()
                        for t in teams:
                            if t.id == project.id:
                                break
                    l.info("teams are %s"%teams)
                #l.info("team is %s"%project.getTeam() )
                    for m in managerIds:
                        try:
                            try:
                                mem = membership.getMemberById( m)
                            except:
                                mem = None
                            if mem:
                                ship = t.addMember( m, membership_type="ViCAutomatedMembership")
                                reference = t.membership_reference_class
                                mem.addReference( ship, relationship = reference.relationship,
                                                  referenceClass = reference)
                                portal_catalog( ship, 'portal_catalog')
                                project._updateMember('add', m, ship, t)
                                portal_catalog.reindexObject(project)
                                t.reindexTeamSpaceSecurity()
                        except:
                            s = StringIO.StringIO()
                            traceback.print_exc(file=s)
                            l.info(s.getvalue())
 
                    l.info("team is %s"%t)
                    for m in managerIds:
                        try:
                            l.info("working on %s"%m)
                            mem = membership.getMemberById(m)
                            ship = t.getMembershipByMemberId(m)
                            ship.editTeamRoles( ["ProjectAdmin", 
                                                 "ProjectMember"])
                            wft = getToolByName(self, 'portal_workflow')
                            try:
                                wft.doActionFor(ship, 'start')
                            except:
                                pass
                            l.info('t is %s'%type(t))
 
                            project._updateMember('add', mem, ship, t)
                            refclass = t.membership_reference_class
                            mem.addReference(ship,
                                             relationship=refclass.relationship,
                                             referenceClass=refclass)
                            t.reindexTeamSpaceSecurity()
                            portal_catalog.reindexObject(project)
                        except:
                            s = StringIO.StringIO()
                            traceback.print_exc(file=s)
                            l.info(s.getvalue() )
                except:
                    s = StringIO.StringIO()
                    traceback.print_exc(file=s)
                    l.info(s.getvalue())
 
    def createUsers(self, dataDir):
        l = getLogger("createUsers")
        userDir = os.path.join( dataDir, "DATA/users")
        groupDir = os.path.join(dataDir, "DATA/groups")
        files = os.walk( userDir)
        putils = getToolByName(self.context, 'plone_utils')
        portal_object = getToolByName(self.context, 'portal_url').getPortalObject()
        people = portal_object._getOb("people")
        db_connection =  getToolByName( self.context, "MySQL_database_connection")
        db_connection = db_connection.factory()(db_connection.connection_string)
        prt = getToolByName(self.context, 'portal_password_reset')
        for dirname, dirs, filenames in files:
            for fname in filenames:
                instance, username = fname.split(":")
                l.info("opening user %s"%username)
                fname = os.path.join(userDir, fname)                
                f = file(fname, "r")
                user = cPickle.load(f)
                f.close()
                l.info("there is a user %s"%user)
                if user:
                    sm = getSecurityManager()
                    proxy_roles = ['Manager',]
                    context = ProxyContext(proxy_roles)
                    sm.addContext(context)
                    pmd = getToolByName(self.context, "portal_membership")
                    try:
                        timezone = user.get("tz")
                        adder = getAdderUtility(self.context)
                        password = "4U2change"
                        try:
                            adder.addUser(username, password)
                            l.info("user added")
                            m = pmd.getMemberById(username)
                            l.info('got user %s'%m)
                            l.info('setting password to %s'%password)
                            #m.setPassword(password)
                            m.setMust_change_password(True)
                            l.info("m.password=%s, getMust_change_password=%s"%(m.password, m.getMust_change_password() ))
 
                            m.setEmail( user["email"] )
                            l.info("email is %s"%m.email)
                            m.first_name= user["namef"] 
                            l.info("first name is %s"%m.first_name)
                            m.last_name=  user["namel"] 
                            l.info("last_name is %s"%m.last_name)
                            m.invitation=True
                            m.TimeZone=timezone
                            l.info("timezone is %s"%m.getTimeZone() )
                            if m.getTimeZone() is None:
                                m.TimeZone="US/Eastern"
                            if user.get("gender") == "F":
                                m.Gender="Female" 
                            else:
                                m.Gender ="Male"
                            m.Region = "NAM"
                            l.info("gender is %s"%m.getGender() )
 
                            #confirmations = getToolByName(self.context, 'portal_confirmations')
                            #for conf in confirmations.objectIds():
                            #    con = confirmations._getOb(conf)
                            #    icon = getAdapter(con, IConfirmable)
                            #    icon.confirm( con.getId() )
 
                            #wft = getToolByName(self.context, 'portal_workflow')
                            #ids = wft.getWorkflowsFor(m)
                            #for wf in ids:    
                            #    action = "make_public"
 
                            #    if action:
                            #        try:
                            #            wf.doActionFor(m, action ) 
                            #        except:
                            #            s = StringIO.StringIO()
                            #            traceback.print_exc(file = s)
                            #            l = getLogger("invite exception")
                            #            l.info(s.getvalue())
                            groupId = user["clientID"]
                            l.info("groupId is %s"%groupId)
                            groupfile = os.path.join( groupDir, "%s:%s"%(instance, groupId))
                            f = file(groupfile, "r")
                            group = cPickle.load(f)
                            f.close()
                            groupList = [ putils.normalizeString(group["groupName"]), ]
                            l.info("groupList is %s"%groupList)
                            startUserMemberships(m, 
                                                 groups=groupList,
                                                 membership_type='ViCAutomatedMembership'
                                                 )
                            l.info("done creating %s"%m)
                        except:
                            #just keep going if the user already exists....
                            s= StringIO.StringIO()
                            traceback.print_exc(file=s)
                            l = getLogger("list exception")
                            l.info(s.getvalue())
                            if locals().has_key("m") and m:
                                l.info( str(dir(m)))
                            try:
                                m = pmd.getMemberById(username)
                            except:
                                l.info("Unable to create %s"%username)
                                m = None
                            pass
                        if m:
                            l.info("username is %s"%username)
                            pmd.createMemberarea(member_id=username)
                            l.info("db_connections is %s"%db_connection)
                            sql = "select memberID from members where userID = '%s';"%username
                            l.info("sql is %s"%sql)
                            items, res = db_connection.query(sql, 0)
                            l.info("res is %s"%str(res))
                            if len(res) > 0:
                                memberId = res[0][0]
                                l.info("member id is %s"%memberId)
                            #memberId = memberId["value"]
 
                                try:
                                    sql = "Select title, brief, full from abstract where memberID = %s;"%memberId
                                    items, abstracts = db_connection.query( sql, 0)
                                    d = people._getOb(m.getId())
                                    d = aq_inner(d)
                                    m_abstr = getAdapter(d, IAbstracts)
                                    stracts = list()
                                    l.info('adding abstracts')
                                    for ab in abstracts:
                                        stracts.append( Abstract( ab[0], ab[1], ab[2] ) )
                                        m_abstr.set(stracts)
                                except:
                                    pass
                                try:
                                    sql = "Select address, city, state, postal, country, type, notes from address where fTable = 'members' and fKeyID = '%s';"%memberId
                                    items, addr = db_connection.query( sql, 0)
                                    m_addr = getAdapter( d, IAddresses)
                                    addresses = list()
                                    l.info('adding addresses')
                                    for ad in addr:
                                        type = ad[5]
                                        if type=="H":
                                            type="Home"
                                        elif type=="B":
                                            type="Work"
                                        addresses.append ( Address( type, ad[0], ad[1],
                                                                    ad[2], ad[3], ad[4],
                                                                    ad[6] ) )
                                        m_addr.set(addresses)
                                except:
                                    pass
 
                                try:
 
                                    sql = "Select ccode, acode, number, xtn, type, memberID from phone where memberID = %s;"%memberId
 
                                    items, phone = db_connection.query( sql, 0)                   
                                    numbers = list()
                                    m_phone = getAdapter(d, IPhoneNumbers)
                                    l.info("adding phone numbers")
                                    for p in phone:
                                        type = p[4]
                                        if type=='H':
                                            type = "Home"
                                        elif type=='B':
                                            type = "Work"
                                        elif type=="L":
                                            type="Lab"
                                        elif type=="O":
                                            type="Office"
                                        elif type=="M":
                                            type = "Mobile"
                                        elif type=="F":
                                            type="Fax"
                                        l.info("%s and %s"%(p[2], p[3]))
                                        if p[3]:
                                            number = "%s ext: %s"%(p[2], p[3])
                                        else:
                                            number = p[2]
                                        numbers.append( PN( type, p[0], p[1], number ))
                                        m_phone.set(numbers)
                                except:
                                    pass
 
                                try:
 
                                    sql = "select * from career where memberId = %s;"%memberId
                                    items, career =   db_connection.query( sql, 0)
                                    m_car = getAdapter(d, ICareerData)
                                    cList = list()
                                    l.info("adding career data")
                                    for row in career:
                                        newRow = list()
                                        for i in range(0,len(row)):
                                            if row[i] is None:
                                                newRow.append( "" )
                                            else:
                                                newRow.append( row[i] )
                                        startdate = newRow[13]
                                        enddate = newRow[14]
                                        title = newRow[3]
                                        institution = newRow[4]
                                        dept = newRow[5]
                                        responsibilities = newRow[6]
                                        cList.append( CareerData( startdate, enddate,
                                                                  title, institution,
                                                                  dept, responsibilities) )
                                    m_car.set(cList)
                                except:
                                    s = StringIO.StringIO()
                                    traceback.print_exc(file=s)
                                    l.info(s.getvalue())
 
                                try:
                                    sql = "select * from education where memberId = %s;"%memberId
                                    m_edu = getAdapter(d, IEducation)
                                    items, education = db_connection.query( sql, 0)
                                    eList = list()
                                    l.info("adding education")
                                    for row in education:
                                        type = row[1]
                                        if type == "U":
                                            type="Undergrad"
                                        elif type=="G":
                                            type="Graduate"
                                        elif type=="P":
                                            type="Post-Doc"
                                        elif type=="C":
                                            type="Clinical Study"
                                        inst = row[2]
                                        degree=row[3]
                                        study = row[4]
                                        mentor = row[5]
                                        startdate = row[6]
                                        enddate = row[7]
                                        eList.append( EducationData( type, 
                                                          inst,
                                                          degree,
                                                          study,
                                                          mentor,
                                                          startdate,
                                                          enddate) )
                                    m_edu.set(eList)
                                except:
                                    pass
 
                                try:
 
                                    sql = "select * from keywords where fTable='members' and fKeyId = %s;"%memberId
                                    items, keywords = db_connection.query( sql, 0 )
                                    m_key = getAdapter(d, IKeywords)
                                    kList = list()
                                    l.info("adding keywords")
                                    for row in keywords:
                                        keyword = row[3]
                                        kList.append( Keyword( keyword ) )
                                    m_key.set(kList)
                                except:
                                    pass
                                try:
                                    sql = "select * from training where memberID = %s;"%memberId
                                    items, train = db_connection.query(sql, 0)
                                    m_train = getAdapter(d, ITrainees)
                                    mList = list()
                                    l.info("adding training")
                                    for row in train:
                                        type = row[2]
                                        if type == "U":
                                            type="Undergrad"
                                        elif type=="G":
                                            type="Graduate"
                                        elif type=="P":
                                            type="Post-Doc"
                                        elif type=="C":
                                            type="Clinical Study"
                                        other = row[3]
                                        number = row[4]
                                        mList.append( Trainee( number, type, other) ) 
                                    m_train.set(mList)
                                except:
                                    pass
 
 
 
 
 
 
                    finally:
                        sm.removeContext(context)