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)