File:  [Repository] / basket / groups.py
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Wed Apr 12 19:37:34 2006 UTC (18 years, 2 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
user must be email first version

    1: """gruppenverwaltung fuer baskets, benutzer koennen verschiedenen gruppen zugeordnet werden"""
    2: 
    3: from OFS.Folder import Folder
    4: from OFS.SimpleItem import SimpleItem
    5: from Products.PageTemplates.PageTemplateFile import PageTemplateFile
    6: from Globals import package_home
    7: import os.path
    8: from types import *
    9: 
   10: from AccessControl import SecurityManagement
   11: 
   12: import smtplib
   13: 
   14: def sendForm(self,fromaddr,subject,content,nextPage="index_html",RESPONSE=None):
   15:                 """sendform"""
   16:                 fromaddr=fromaddr.strip("\r\n\t") # sicherstellen dass keine zusaetzlichen headerzeilen eingefuegt werden
   17:                 subject=subject.strip("\r\n\t") # sicherstellen dass keine zusaetzlichen headerzeilen eingefuegt werden
   18:                 toaddrs=self.toAddrs
   19: 
   20:                 subject="%s %s"%(self.subjectAdd,subject)
   21:                 
   22:                 msg = ("From: %s\r\nSubject: %s\r\nTo: %s\r\n\r\n"
   23:                        % (fromaddr, subject, ", ".join(toaddrs)))
   24:                 server = smtplib.SMTP("mail.mpiwg-berlin.mpg.de")
   25:                 #server.set_debuglevel(1)
   26:                 msg=msg+content
   27:                 server.sendmail(fromaddr, toaddrs, msg)
   28:                 server.quit()
   29: 
   30:                 if RESPONSE:
   31:                         RESPONSE.redirect(nextPage)
   32: class GroupFolder(Folder):
   33:     """Folder which contains groups"""
   34:     
   35:     meta_type="GroupFolder"
   36: 
   37:     def registerNewUser(self,user,password,email='',forward_to=None,RESPONSE=None):
   38:         """register a new user to the system, username and password, will be stored in the acl_users folder,
   39:         additional information are added here."""
   40:         
   41:         #TODO: check if user already exists in LDAP
   42:         #TODO: email is not registered yet, because MPIWGUserfolder is not working with CookieCrumbler
   43:         #print [x for x in repr(self.acl_users.getUserNames())]
   44:         
   45:         if not (len(user.split("@")) ==2):
   46:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddUserErrorInvalidEmail.zpt')).__of__(self)
   47:             return pt(user=user)
   48:             
   49:             
   50:         if user in repr(self.acl_users.getUserNames()):
   51:             
   52:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddUserErrorAlreadyExists.zpt')).__of__(self)
   53:             return pt(user=user)
   54:         
   55:         if user and password:
   56:             #self.acl_users.addUser(user,password,email)
   57:             self.aq_parent.acl_users._doAddUser(user, password, '', '')
   58:             
   59:         add="user=%s"%user
   60:         if forward_to.find("?")>-1:
   61:             #already parameters
   62:             add="&"+add
   63:         else:
   64:             add="?"+add
   65:         
   66:         if RESPONSE and forward_to:
   67:             RESPONSE.redirect(forward_to+add)
   68:             
   69:     def isMemberOf(self,group):
   70:         user=SecurityManagement.getSecurityManager().getUser()
   71:         
   72:         if user and not (str(user)=='Anonymous User'):
   73:             return self.checkMembership(str(user), group)
   74:         return False
   75:     
   76:     def addKommaListOfUsersToGroup(self,users,group,remove=None,REQUEST=None,RESPONSE=None):
   77:         """add users to a group, users in komma separeted list"""
   78:         usersList=[x.lstrip().rstrip() for x in users.split(",")]
   79:         
   80:         self.addUsersToGroups(usersList,group,remove)
   81: 
   82:         if RESPONSE:
   83:             RESPONSE.redirect(REQUEST['HTTP_REFERER'])
   84:     
   85:     def addUsersToGroups(self,users,groups,remove=None):
   86:         """add users to groups
   87:         @param users: list of usernames
   88:         @param groups: list of groupnames
   89:         @param remove: default None, if remove is set the actual
   90:          user list of the groups will be replaced by users otherwise users will be added. 
   91:          if remove= protected then the actualuser can not be deleted.
   92:         """
   93:       
   94:         if type(groups) is not ListType:
   95:             groups=[groups]
   96:         
   97:         for user in users:
   98:             self.addUserToGroups(user,groups)
   99:         
  100:         if remove:
  101:             for group in groups:
  102:                 for user in self.getGroupsAndUsers().get(group,None):
  103:                     if (user not in users):
  104:                         if not ((remove=="protected") and (user==self.getActualUserName())):
  105:                             self.removeUserFromGroups(user,group)
  106:         
  107:     def removeUserFromGroups(self,user,groups):
  108:         '''
  109:         remove a user from a group
  110:         @param user: username
  111:         @param groups: list of groupnames
  112:         '''
  113:           
  114:         #make sure that list of groups
  115:         print "remove",user,repr(groups)
  116:         
  117:         if type(groups) is not ListType:
  118:             groups=[groups]
  119:             
  120:         groupObjects=self.ZopeFind(self,obj_ids=groups)
  121:         #group doesn't exist, return with false
  122:         if len(groupObjects)<1:
  123:             return False
  124:         
  125:         #otherwise add user to group
  126:         for groupObject in groupObjects:
  127:             groupObject[1].removeUser(user)
  128:             
  129:     def addUserToGroups(self,user,groups):
  130:         '''
  131:         Add a user to a group
  132:         @param user: username
  133:         @param groups: list of groupnames
  134:         '''
  135:         
  136:         #make sure that list of groups
  137:         
  138:         if type(groups) is not ListType:
  139:             groups=[groups]
  140:             
  141:         groupObjects=self.ZopeFind(self,obj_ids=groups)
  142:         #group doesn't exist, return with false
  143:         if len(groupObjects)<1:
  144:             return False
  145:         
  146:         #otherwise add user to group
  147:         for groupObject in groupObjects:
  148:             groupObject[1].addUser(user)
  149:         
  150:         return True
  151:     
  152:     def addGroupsToGroups(self,newGroups,groups):
  153:         """
  154:         add Groups to groups
  155:         @param unewGroups: list of groups to be added
  156:         @param groups: list of groupnames
  157:         """
  158:         
  159:         for group in newGroups:
  160:             self.addGroupToGroups(group,groups)
  161:         
  162:         
  163:     def addGroupToGroups(self,group,groups):
  164:         '''
  165:         Add a user to a group
  166:         @param user: username
  167:         @param groups: list of groupnames
  168:         '''
  169:         
  170:         #make sure that list of groups
  171:         
  172:         if type(groups) is not ListType:
  173:             groups=[groups]
  174:             
  175:         groupObjects=self.ZopeFind(self,obj_ids=groups)
  176:         #group doesn't exist, return with false
  177:         if len(groupObjects)<1:
  178:             return False
  179:         
  180:         #otherwise add user to group
  181:         for groupObject in groupObjects:
  182:             groupObject[1].addGroup(group)
  183:         
  184:         return True
  185:     
  186:     def checkMembership(self,user,group):
  187:         '''Check if user is member of group
  188:         
  189:         @param user:
  190:         @param group:
  191:         '''
  192:         print "checking publish for user:",user,group,self.aq_parent.getId()
  193:         ret=False
  194:         
  195:         groups=self.ZopeFind(self,obj_metatypes=['Group'],obj_ids=[group])
  196:         #group doesn't exist
  197:         
  198:         if group=="publish":
  199:             #special group, member is allowed to publish basket, at the moment all members of the admin group at root level
  200:             #member of publish
  201:             
  202:             return  self.users.groupFolder.checkMembership(user,'admin')
  203:             
  204:         if len(groups)<1:
  205:             ret=False
  206:         else:
  207:             ret=groups[0][1].isInGroup(user)
  208:         
  209:         if (not ret) and (self.aq_parent.getId()!='users'):
  210:             #teste ob mitglied in super group
  211:             return self.users.groupFolder.checkMembership(user,'admin')
  212:         else:
  213:             return ret
  214:             
  215:     def returnUsers(self):
  216:         """return all users of groups"""
  217:         
  218:         users={}
  219:         for group in self.ZopeFind(self,obj_metatypes=['Group']):
  220:             for user in group[1].getUsers():
  221:                 if users.has_key(user):
  222:                     users[user].append(group[0])
  223:                 else:
  224:                     users[user]=[group[0]]
  225:         
  226:         return users
  227:     
  228:     def getGroupsAndUsers(self):
  229:         """return all groups and their users as dict"""
  230:         
  231:         users={}
  232:         for group in self.ZopeFind(self,obj_metatypes=['Group']):
  233:             for user in group[1].getUsers():
  234:                 if users.has_key(group[0]):
  235:                     if not (user in users[group[0]]):
  236:                         users[group[0]].append(user)
  237:                 else:
  238:                     users[group[0]]=[user]
  239:         return users
  240:                     
  241: def manage_addGroupFolderForm(self):
  242:     """form for adding a groupFolder"""
  243:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addGroupFolder.zpt')).__of__(self)
  244:     return pt()
  245: 
  246: def manage_addGroupFolder(self,id,RESPONSE=None):
  247:     """add a group folder object"""
  248: 
  249:   
  250:     newObj=GroupFolder(id)
  251:     
  252:     self._setObject(id,newObj)
  253:     ob=self._getOb(id)
  254:     
  255:     
  256:     #group folder always contains admin,editor,user
  257:      
  258:     manage_addGroup(ob,'admin') 
  259:     manage_addGroup(ob,'editor') 
  260:     manage_addGroup(ob,'user') 
  261:     
  262:     #actual user is always editor and admin
  263:     user=str(self.REQUEST['AUTHENTICATED_USER'])
  264:     
  265:     ob.addUsersToGroups([user],['admin','editor'])
  266:     
  267:     #admin of supergrous are always admins of subgroups
  268:     
  269:     ob.addGroupsToGroups(['admin'],['admin'])
  270:     
  271:     if RESPONSE is not None:
  272:         RESPONSE.redirect('manage_main')
  273:      
  274: 
  275: class Group(SimpleItem):
  276:     """Group"""
  277: 
  278:     meta_type="Group"
  279:     
  280:     
  281:     manage_options=SimpleItem.manage_options+(
  282:         {'label':'change group members','action':'changeUsersInGroupForm'},
  283:         )
  284:     
  285:     def __init__(self,id,description):
  286:         """init group"""
  287:         self.id=id
  288:         self.description=description
  289:         self.userList=[]
  290:         self.groupList=[]
  291:         
  292:     def addUser(self,username):
  293:         '''
  294:         add an username to the group        
  295:         @param username:username
  296:         '''
  297:         #make sure that entry is persistent
  298:         list=self.userList
  299:         list.append(username)
  300:         self.userList=list[0:]
  301:         
  302:     def removeUser(self,username):
  303:         """
  304:         remove an user from group
  305:         """
  306:         list=self.userList
  307:         list.remove(username)
  308:         self.userList=list[0:]
  309:         
  310:         
  311:     def addGroup(self,group):
  312:         '''
  313:         add a group to the group
  314:         @param group: group to be added
  315:         '''
  316:         #make sure that entry is persistent
  317:         list=self.groupList
  318:         list.append(group)
  319:         self.groupList=list[0:]
  320:         
  321:         
  322:     def getGroups(self):
  323:         """get groups, whose members are automatically members of this group"""
  324:         return self.groupList
  325:     
  326:     def getUsers(self):
  327:         """ get Userlist """
  328:         return self.userList
  329:     
  330:     def changeUsersInGroupForm(self):
  331:         """html form for changing the users"""
  332:         pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','changeUsersInGroup.zpt')).__of__(self)
  333:         return pt()
  334:     
  335:     def changeUsersInGroup(self,userList,RESPONSE=None):
  336:         """change group"""
  337:         self.userList=userList.split(",")[0:]
  338:     
  339:         if RESPONSE is not None:
  340:             RESPONSE.redirect('manage_main')
  341:             
  342:     def isInGroup(self,username):
  343:         '''
  344:         check if username is in group
  345:         @param username: username
  346:         '''
  347:         
  348:         #special handling of group 'user' all users are in user
  349:         
  350:         #TODO: only user which can log in are in 'user'
  351:         if self.id=="user":
  352:             return True
  353:         
  354:         #check first if user is in userList of this group
  355:         
  356:         if username in self.userList:
  357:             return True
  358:         
  359:         #check now if user is member of one of the groups in grouplist
  360:         
  361:         groupFolders=self.ZopeFind(self.aq_parent,obj_metatypes=['GroupFolder'])
  362:         #no groupFolder im parent
  363:         
  364:         if len(groupFolders)<1:
  365:             return False
  366:         
  367:         #checke all groups in grouplist
  368:         for group in self.ZopeFind(groupFolders[0][1],obj_metatype=['Group'],obj_ids=[self.groupList]):
  369:             if group[1].isInGroup(username):
  370:                 return True
  371:         
  372:         return False
  373:         
  374: 
  375:         
  376: def manage_addGroupForm(self):
  377:     """form for adding a groupFolder"""
  378:     pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','addGroup.zpt')).__of__(self)
  379:     return pt()
  380: 
  381: def manage_addGroup(self,id,description='',RESPONSE=None):
  382:     """add a group folder object"""
  383: 
  384:     
  385:     newObj=Group(id,description)
  386:     
  387:     self._setObject(id,newObj)
  388:     ob=self._getOb(id)
  389:     
  390:     if RESPONSE is not None:
  391:         RESPONSE.redirect('manage_main')
  392:   

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>