from pyramid.decorator import reify from pyramid.security import Allow, ALL_PERMISSIONS, Everyone, Deny, authenticated_userid class Root(object): def __init__(self, request): self.request = request self.__name__ = '' self.__parent__ = None def __getitem__(self, key): return UsersCollection(key, self) class UserCollection(object): def __init__(self, name, parent): self.__name__ = name self.__parent__ = parent def __getitem__(self, key): return User(key, self) class User(object): def __init__(self, name, parent): self.__name__ = name self.__parent__ = parent def __getitem__(self, key): return NoteCollection(key, self) # /users/123/notes/ class NoteCollection(object): __acl__ = [ (Allow, Everyone, 'show'), (Allow, 'group:owner', ALL_PERMISSIONS), ] def __init__(self, name, parent): self.__name__ = name self.__parent__ = parent def __getitem__(self, key): return Note(key, self) # /users/123/notes/456 class Note(object): def __init__(self, name, parent): self.__name__ = name self.__parent__ = parent @property def user(self): # could be done via find_interface return self.parent.parent @property def userid(self): # /users/123/notes/456 will return 123 return self.user.__name__ def group_finder(self, request): principals = [] if authenticated_userid(request) == self.user.__name__: principals.append('group:owner') return principals