From 8edec76c1dcc9c51903a7752116ee1cd4f681f8c Mon Sep 17 00:00:00 2001 From: helmutm Date: Tue, 16 May 2006 14:51:29 +0000 Subject: [PATCH] more on user management with loops.organize git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@1214 fd906abe-77d9-0310-91a1-e0d9ade77398 --- browser/common.py | 14 ++++++++++ browser/concept.py | 10 +++----- browser/configure.zcml | 52 ++++++++++++++++++-------------------- browser/edit.pt | 2 ++ browser/pageform.pt | 3 +++ browser/resource.py | 10 +++++++- browser/resource_macros.pt | 18 +++++++++++++ organize/interfaces.py | 37 +++++++++++++++++++++++++-- organize/party.py | 17 ++++++++++--- 9 files changed, 122 insertions(+), 41 deletions(-) diff --git a/browser/common.py b/browser/common.py index 9b05eb6..d1d4062 100644 --- a/browser/common.py +++ b/browser/common.py @@ -28,6 +28,8 @@ from zope.app.form.browser.interfaces import ITerms from zope.app.intid.interfaces import IIntIds from zope.cachedescriptors.property import Lazy from zope.dottedname.resolve import resolve +from zope.formlib.form import EditForm as BaseEditForm +from zope.formlib.namedtemplate import NamedTemplate from zope.interface import implements from zope.app.publisher.browser import applySkin from zope.publisher.interfaces.browser import ISkin @@ -39,6 +41,18 @@ from cybertools.typology.interfaces import IType from loops.interfaces import IView from loops import util + +class EditForm(BaseEditForm): + + template = NamedTemplate('pageform') + + def deleteObjectAction(self): + return None # better not to show the edit button at the moment + parent = zapi.getParent(self.context) + parentUrl = zapi.absoluteURL(parent, self.request) + return parentUrl + '/contents.html' + + class BaseView(object): def __init__(self, context, request): diff --git a/browser/concept.py b/browser/concept.py index 6bba2dc..63cb7cc 100644 --- a/browser/concept.py +++ b/browser/concept.py @@ -25,30 +25,29 @@ $Id$ from zope.app import zapi from zope.app.catalog.interfaces import ICatalog from zope.app.event.objectevent import ObjectCreatedEvent, ObjectModifiedEvent +from zope.app.container.contained import ObjectRemovedEvent from zope.app.form.browser.interfaces import ITerms from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy from zope.dottedname.resolve import resolve from zope.event import notify from zope.formlib.form import EditForm, FormFields -from zope.formlib.namedtemplate import NamedTemplate from zope.interface import implements from zope.publisher.interfaces import BadRequest from zope.publisher.interfaces.browser import IBrowserRequest from zope import schema from zope.schema.interfaces import IIterableSource from zope.security.proxy import removeSecurityProxy + from cybertools.typology.interfaces import IType, ITypeManager from loops.interfaces import IConcept from loops.concept import Concept, ConceptTypeSourceList, PredicateSourceList -from loops.browser.common import BaseView, LoopsTerms +from loops.browser.common import EditForm, BaseView, LoopsTerms from loops import util class ConceptEditForm(EditForm): - template = NamedTemplate('pageform') - @Lazy def typeInterface(self): return IType(self.context).typeInterface @@ -59,9 +58,6 @@ class ConceptEditForm(EditForm): typeInterface = self.typeInterface if typeInterface is not None: fields = FormFields(fields, typeInterface) - #typeAdapter = zapi.queryAdapter(self.context, typeInterface) - #if typeAdapter is not None: - #... return fields diff --git a/browser/configure.zcml b/browser/configure.zcml index 637dfa8..20f37e5 100644 --- a/browser/configure.zcml +++ b/browser/configure.zcml @@ -61,6 +61,13 @@ permission="zope.View" /> + + + + - - - - + menu="zmi_views" title="Edit" /> + + + + - + @@ -509,17 +518,6 @@ menu="zmi_views" title="Edit Document" /> - - +
+ diff --git a/browser/pageform.pt b/browser/pageform.pt index fd9f764..5aa70ee 100644 --- a/browser/pageform.pt +++ b/browser/pageform.pt @@ -141,6 +141,9 @@ function toggleFormFieldHelp(ob,state) {
+ +
+ diff --git a/browser/resource.py b/browser/resource.py index 31b5316..266e818 100644 --- a/browser/resource.py +++ b/browser/resource.py @@ -27,12 +27,13 @@ from zope.app import zapi from zope.app.catalog.interfaces import ICatalog from zope.app.dublincore.interfaces import ICMFDublinCore from zope.app.pagetemplate import ViewPageTemplateFile +from zope.formlib.form import FormFields from zope.proxy import removeAllProxies from zope.security import canAccess, canWrite from zope.security.proxy import removeSecurityProxy from loops.interfaces import IDocument, IMediaAsset -from loops.browser.common import BaseView +from loops.browser.common import EditForm, BaseView from loops.browser.concept import ConceptRelationView, ConceptConfigureView from loops.browser.node import NodeView @@ -45,6 +46,13 @@ renderingFactories = { } +class DocumentEditForm(EditForm): + form_fields = FormFields(IDocument) + +class MediaAssetEditForm(EditForm): + form_fields = FormFields(IMediaAsset) + + class ResourceView(BaseView): template = ViewPageTemplateFile('resource_macros.pt') diff --git a/browser/resource_macros.pt b/browser/resource_macros.pt index b106948..e25a6a9 100644 --- a/browser/resource_macros.pt +++ b/browser/resource_macros.pt @@ -25,3 +25,21 @@ + + +
+ + +
+
+ + diff --git a/organize/interfaces.py b/organize/interfaces.py index 184ede5..ed0ce07 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -23,12 +23,45 @@ $Id$ """ from zope.interface import Interface, Attribute -from zope import schema +from zope import component, schema +from zope.app import zapi +from zope.app.principalannotation import annotations +from zope.app.security.interfaces import IAuthentication, PrincipalLookupError from zope.i18nmessageid import MessageFactory from cybertools.organize.interfaces import IPerson as IBasePerson _ = MessageFactory('zope') +ANNOTATION_KEY = 'loops.organize.person' + + +class ValidationError(schema.interfaces.ValidationError): + def doc(self): + return self.info + +def raiseValidationError(info): + error = ValidationError() + error.info = info + raise error + + +class UserId(schema.TextLine): + + def _validate(self, userId): + if not userId: + return + auth = component.getUtility(IAuthentication, context=self.context) + try: + principal = auth.getPrincipal(userId) + except PrincipalLookupError: + raiseValidationError(u'User %s does not exist' % userId) + pa = annotations(principal) + person = pa.get(ANNOTATION_KEY, None) + if person is not None and person != self.context: + raiseValidationError( + u'There is alread a person (%s) assigned to user %s.' + % (zapi.getName(person), userId)) + class IPerson(IBasePerson): """ Resembles a human being with a name (first and last name), @@ -37,7 +70,7 @@ class IPerson(IBasePerson): basic cybertools.organize package. """ - userId = schema.TextLine( + userId = UserId( title=_(u'User ID'), description=_(u'The principal id of a user that should ' 'be associated with this person.'), diff --git a/organize/party.py b/organize/party.py index ab50a1c..bfb4ae7 100644 --- a/organize/party.py +++ b/organize/party.py @@ -29,18 +29,17 @@ from zope.app.security.interfaces import IAuthentication, PrincipalLookupError from zope.component import adapts from zope.interface import implements from zope.cachedescriptors.property import Lazy +from zope.schema.interfaces import ValidationError +from zope.app.form.interfaces import WidgetInputError from zope.security.proxy import removeSecurityProxy from cybertools.organize.party import Person as BasePerson from cybertools.typology.interfaces import IType from loops.interfaces import IConcept -from loops.organize.interfaces import IPerson +from loops.organize.interfaces import IPerson, ANNOTATION_KEY from loops.type import TypeInterfaceSourceList -ANNOTATION_KEY = 'loops.organize.person' - - # register IPerson as a type interface - (TODO: use a function for this) TypeInterfaceSourceList.typeInterfaces += (IPerson,) @@ -118,6 +117,16 @@ class Person(BasePerson): except PrincipalLookupError: return None + def getPrincipalForUserId(self, userId=None): + userId = userId or self.userId + if not userId: + return None + auth = self.authentication + try: + return auth.getPrincipal(userId) + except PrincipalLookupError: + return None + def getAuthenticationUtility(context): return component.getUtility(IAuthentication, context=context)