Annotation of basket/groups.py, revision 1.5

1.1       dwinter     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: 
1.5     ! dwinter    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)
1.1       dwinter    32: class GroupFolder(Folder):
                     33:     """Folder which contains groups"""
                     34:     
                     35:     meta_type="GroupFolder"
                     36: 
1.2       dwinter    37:     def registerNewUser(self,user,password,email='',forward_to=None,RESPONSE=None):
1.1       dwinter    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
1.2       dwinter    42:         #TODO: email is not registered yet, because MPIWGUserfolder is not working with CookieCrumbler
1.1       dwinter    43:         #print [x for x in repr(self.acl_users.getUserNames())]
1.5     ! dwinter    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:             
1.1       dwinter    50:         if user in repr(self.acl_users.getUserNames()):
1.5     ! dwinter    51:             
        !            52:             pt=PageTemplateFile(os.path.join(package_home(globals()),'zpt','AddUserErrorAlreadyExists.zpt')).__of__(self)
        !            53:             return pt(user=user)
1.2       dwinter    54:         
                     55:         if user and password:
                     56:             #self.acl_users.addUser(user,password,email)
                     57:             self.aq_parent.acl_users._doAddUser(user, password, '', '')
                     58:             
1.1       dwinter    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:     
1.4       dwinter    76:     def addKommaListOfUsersToGroup(self,users,group,remove=None,REQUEST=None,RESPONSE=None):
1.2       dwinter    77:         """add users to a group, users in komma separeted list"""
1.4       dwinter    78:         usersList=[x.lstrip().rstrip() for x in users.split(",")]
                     79:         
                     80:         self.addUsersToGroups(usersList,group,remove)
1.2       dwinter    81: 
                     82:         if RESPONSE:
                     83:             RESPONSE.redirect(REQUEST['HTTP_REFERER'])
                     84:     
1.4       dwinter    85:     def addUsersToGroups(self,users,groups,remove=None):
1.1       dwinter    86:         """add users to groups
                     87:         @param users: list of usernames
                     88:         @param groups: list of groupnames
1.4       dwinter    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.
1.1       dwinter    92:         """
1.4       dwinter    93:       
                     94:         if type(groups) is not ListType:
                     95:             groups=[groups]
                     96:         
1.1       dwinter    97:         for user in users:
                     98:             self.addUserToGroups(user,groups)
                     99:         
1.4       dwinter   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)
1.1       dwinter   106:         
1.4       dwinter   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:             
1.1       dwinter   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:         '''
1.2       dwinter   192:         print "checking publish for user:",user,group,self.aq_parent.getId()
                    193:         ret=False
1.1       dwinter   194:         
                    195:         groups=self.ZopeFind(self,obj_metatypes=['Group'],obj_ids=[group])
                    196:         #group doesn't exist
                    197:         
1.2       dwinter   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:             
1.1       dwinter   204:         if len(groups)<1:
1.2       dwinter   205:             ret=False
1.1       dwinter   206:         else:
1.2       dwinter   207:             ret=groups[0][1].isInGroup(user)
1.1       dwinter   208:         
1.2       dwinter   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:             
1.1       dwinter   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:     
1.2       dwinter   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:                     
1.1       dwinter   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:     
1.3       dwinter   280:     
                    281:     manage_options=SimpleItem.manage_options+(
                    282:         {'label':'change group members','action':'changeUsersInGroupForm'},
                    283:         )
                    284:     
1.1       dwinter   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:         
1.2       dwinter   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:         
1.1       dwinter   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:     
1.3       dwinter   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:             
1.1       dwinter   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
1.2       dwinter   355:         
1.1       dwinter   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>