File:  [Repository] / basket / groups.py
Revision 1.4: download - view: text, annotated - select for diffs - revision graph
Thu Apr 6 16:49:14 2006 UTC (18 years, 2 months ago) by dwinter
Branches: MAIN
CVS tags: HEAD
new navigation

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

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