-# -*- coding: utf-8 -*-
-## GroupUserFolder
-## Copyright (C)2006 Ingeniweb
-
-## This program is free software; you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation; either version 2 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program; see the file COPYING. If not, write to the
-## Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-"""
-
-"""
-__version__ = "$Revision: $"
-# $Source: $
-# $Id: GRUFFolder.py 30098 2006-09-08 12:35:01Z encolpe $
-__docformat__ = 'restructuredtext'
-
-
-# fakes a method from a DTML file
-from Globals import MessageDialog, DTMLFile
-
-from AccessControl import ClassSecurityInfo
-from Globals import InitializeClass
-from Acquisition import Implicit
-from Globals import Persistent
-from AccessControl.Role import RoleManager
-from OFS.SimpleItem import Item
-from OFS.PropertyManager import PropertyManager
-from OFS import ObjectManager, SimpleItem
-from DateTime import DateTime
-from App import ImageFile
-
-#XXX PJ DynaList is very hairy - why vs. PerstList?
-# (see C__ac_roles__ class below for an explanation)
-import DynaList
-import AccessControl.Role, webdav.Collection
-import Products
-import os
-import string
-import shutil
-import random
-
-
-
-def manage_addGRUFUsers(self, id="Users", dtself=None,REQUEST=None,**ignored):
- """ """
- f=GRUFUsers(id)
- self=self.this()
- try: self._setObject(id, f)
- except: return MessageDialog(
- title ='Item Exists',
- message='This object already contains a GRUFUsers Folder',
- action ='%s/manage_main' % REQUEST['URL1'])
- if REQUEST is not None:
- REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
-
-def manage_addGRUFGroups(self, id="Groups", dtself=None,REQUEST=None,**ignored):
- """ """
- f=GRUFGroups(id)
- self=self.this()
- try: self._setObject(id, f)
- except: return MessageDialog(
- title ='Item Exists',
- message='This object already contains a GRUFGroups Folder',
- action ='%s/manage_main' % REQUEST['URL1'])
- if REQUEST is not None:
- REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')
-
-class GRUFFolder(ObjectManager.ObjectManager, SimpleItem.Item):
- isAnObjectManager=1
- isPrincipiaFolderish=1
- manage_main=DTMLFile('dtml/GRUFFolder_main', globals())
- manage_options=( {'label':'Contents', 'action':'manage_main'}, ) + \
- SimpleItem.Item.manage_options
-
- security = ClassSecurityInfo()
- def __creatable_by_emergency_user__(self): return 1
-
- def __init__(self, id = None):
- if id:
- self.id = id
- else:
- self.id = self.default_id
-
- def getId(self,):
- if self.id:
- return self.id
- else:
- return self.default_id # Used for b/w compatibility
-
- def getUserSourceId(self,):
- return self.getId()
-
- def isValid(self,):
- """
- isValid(self,) => Return true if an acl_users is inside
- """
- if "acl_users" in self.objectIds():
- return 1
- return None
-
- security.declarePublic('header_text')
- def header_text(self,):
- """
- header_text(self,) => Text that appears in the content's
- view heading zone
- """
- return ""
-
- def getUserFolder(self,):
- """
- getUserFolder(self,) => get the underlying user folder, UNRESTRICTED !
- """
- if not "acl_users" in self.objectIds():
- raise "ValueError", "Please put an acl_users in %s " \
- "before using GRUF" % (self.getId(),)
- return self.restrictedTraverse('acl_users')
-
- def getUserNames(self,):
- """
- getUserNames(self,) => None
-
- We override this to prevent SimpleUserFolder to use GRUF's getUserNames() method.
- It's, of course, still possible to override a getUserNames method with SimpleUserFolder:
- just call it 'new_getUserNames'.
- """
- # Call the "new_getUserNames" method if available
- if "new_getUserNames" in self.objectIds():
- return self.unrestrictedTraverse('new_getUserNames')()
-
- # Return () if nothing is there
- return ()
-
-
-
-
-class GRUFUsers(GRUFFolder):
- """
- GRUFUsers : GRUFFolder that holds users
- """
- meta_type="GRUFUsers"
- default_id = "Users"
-
- manage_options = GRUFFolder.manage_options
-
- class C__ac_roles__(Persistent, Implicit, DynaList.DynaList):
- """
- __ac_roles__ dynastring.
- Do not forget to set _target to class instance.
-
- XXX DynaList is surely not efficient but it's the only way
- I found to do what I wanted easily. Someone should take
- a look to PerstList instead to see if it's possible
- to do the same ? (ie. having a list which elements are
- the results of a method call).
-
- However, even if DynaList is not performant, it's not
- a critical point because this list is meant to be
- looked at only when a User object is looked at INSIDE
- GRUF (especially to set groups a user belongs to).
- So in practice only used within ZMI.
- """
- def data(self,):
- return self.userdefined_roles()
-
-
- # Property setting
- ac_roles = C__ac_roles__()
- __ac_roles__ = ac_roles
-
- enabled = 1 # True if it's enabled, false if not
-
- def enableSource(self,):
- """enableSource(self,) => Set enable status to 1
- """
- self.enabled = 1
-
- def disableSource(self,):
- """disableSource(self,) => explicit ;)
- """
- self.enabled = None
-
- def isEnabled(self,):
- """
- Return true if enabled (surprisingly)
- """
- return not not self.enabled
-
- def header_text(self,):
- """
- header_text(self,) => Text that appears in the content's view
- heading zone
- """
- if not "acl_users" in self.objectIds():
- return "Please put an acl_users here before ever " \
- "starting to use this object."
-
- ret = """In this folder, groups are seen as ROLES from user's
- view. To put a user into a group, affect him a role
- that matches his group.<br />"""
-
- return ret
-
-
- def listGroups(self,):
- """
- listGroups(self,) => return a list of groups defined as roles
- """
- return self.Groups.restrictedTraverse('listGroups')()
-
-
- def userdefined_roles(self):
- "Return list of user-defined roles"
- return self.listGroups()
-
-
-class GRUFGroups(GRUFFolder):
- """
- GRUFGroups : GRUFFolder that holds groups
- """
- meta_type="GRUFGroups"
- default_id = "Groups"
-
- _group_prefix = "group_"
-
-
- class C__ac_roles__(Persistent, Implicit, DynaList.DynaList):
- """
- __ac_roles__ dynastring.
- Do not forget to set _target to class instance.
-
- XXX DynaList is surely not efficient but it's the only way
- I found to do what I wanted easily. Someone should take
- a look to PerstList instead to see if it's possible
- to do the same ? (ie. having a list which elements are
- the results of a method call).
-
- However, even if DynaList is not performant, it's not
- a critical point because this list is meant to be
- looked at only when a User object is looked at INSIDE
- GRUF (especially to set groups a user belongs to).
- So in practice only used within ZMI.
- """
- def data(self,):
- return self.userdefined_roles()
-
-
- ac_roles = C__ac_roles__()
- __ac_roles__ = ac_roles
-
-
- def header_text(self,):
- """
- header_text(self,) => Text that appears in the content's
- view heading zone
- """
- ret = ""
- if not "acl_users" in self.objectIds():
- return "Please put an acl_users here before ever " \
- "starting to use this object."
- return ret
-
- def _getGroup(self, id):
- """
- _getGroup(self, id) => same as getUser() but... with a group :-)
- This method will return an UNWRAPPED object
- """
- return self.acl_users.getUser(id)
-
-
- def listGroups(self, prefixed = 1):
- """
- Return a list of available groups.
- Group names are prefixed !
- """
- if not prefixed:
- return self.acl_users.getUserNames()
- else:
- ret = []
- for grp in self.acl_users.getUserNames():
- ret.append("%s%s" % (self._group_prefix, grp))
- return ret
-
-
- def userdefined_roles(self):
- "Return list of user-defined roles"
- return self.listGroups()
-
-
-InitializeClass(GRUFUsers)
-InitializeClass(GRUFGroups)