From 3b5132b0f61e594170ed122e2d6acdb99c556c46 Mon Sep 17 00:00:00 2001 From: helmutm Date: Mon, 25 Feb 2008 14:11:03 +0000 Subject: [PATCH] added simple task and event handling git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@2419 fd906abe-77d9-0310-91a1-e0d9ade77398 --- compound/blog/view_macros.pt | 2 +- knowledge/browser.py | 4 +- knowledge/interfaces.py | 4 +- organize/README.txt | 44 ++++++++++++++- organize/browser/__init__.py | 3 + organize/browser/configure.zcml | 58 +++++++++++++++++++ organize/browser/event.py | 65 ++++++++++++++++++++++ organize/{browser.py => browser/member.py} | 6 +- organize/browser/task.py | 48 ++++++++++++++++ organize/browser/view_macros.pt | 36 ++++++++++++ organize/configure.zcml | 53 ++---------------- organize/interfaces.py | 8 +++ organize/task.py | 2 +- organize/view_macros.pt | 9 --- view.py | 8 +-- 15 files changed, 279 insertions(+), 71 deletions(-) create mode 100644 organize/browser/__init__.py create mode 100644 organize/browser/configure.zcml create mode 100644 organize/browser/event.py rename organize/{browser.py => browser/member.py} (97%) create mode 100644 organize/browser/task.py create mode 100644 organize/browser/view_macros.pt delete mode 100644 organize/view_macros.pt diff --git a/compound/blog/view_macros.pt b/compound/blog/view_macros.pt index 032e363..476316d 100755 --- a/compound/blog/view_macros.pt +++ b/compound/blog/view_macros.pt @@ -1,4 +1,4 @@ - diff --git a/knowledge/browser.py b/knowledge/browser.py index e00a951..2d6fa15 100644 --- a/knowledge/browser.py +++ b/knowledge/browser.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2004 Helmut Merz helmutm@cy55.de +# Copyright (c) 2008 Helmut Merz helmutm@cy55.de # # 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 @@ -33,7 +33,7 @@ from zope.i18nmessageid import MessageFactory from cybertools.typology.interfaces import IType from loops.browser.common import BaseView from loops.knowledge.interfaces import IPerson, ITask -from loops.organize.browser import getPersonForUser +from loops.organize.party import getPersonForUser _ = MessageFactory('zope') diff --git a/knowledge/interfaces.py b/knowledge/interfaces.py index 0a214fa..51ba0e4 100644 --- a/knowledge/interfaces.py +++ b/knowledge/interfaces.py @@ -29,9 +29,9 @@ from zope.security.proxy import removeSecurityProxy from cybertools.knowledge.interfaces import IKnowing, IRequirementProfile from cybertools.knowledge.interfaces import IKnowledgeElement -from cybertools.organize.interfaces import ITask as IBaseTask from loops.interfaces import IConceptSchema from loops.organize.interfaces import IPerson as IBasePerson +from loops.organize.interfaces import ITask as IBaseTask _ = MessageFactory('zope') @@ -43,7 +43,7 @@ class IPerson(IBasePerson, IKnowing): """ -class ITask(IConceptSchema, IBaseTask, IRequirementProfile): +class ITask(IBaseTask, IRequirementProfile): """ A task, also acting as a knowledge requirement profile. """ diff --git a/organize/README.txt b/organize/README.txt index fa8cd18..b6a789e 100644 --- a/organize/README.txt +++ b/organize/README.txt @@ -191,7 +191,7 @@ and register it. >>> from zope.publisher.browser import TestRequest >>> request = TestRequest(form=data) - >>> from loops.organize.browser import MemberRegistration + >>> from loops.organize.browser.member import MemberRegistration >>> regView = MemberRegistration(menu, request) >>> regView.update() False @@ -223,7 +223,7 @@ We need a principal for testing the login stuff: >>> principal = InternalPrincipal('scott', 'tiger', 'Scotty') >>> request.setPrincipal(principal) - >>> from loops.organize.browser import PasswordChange + >>> from loops.organize.browser.member import PasswordChange >>> pwcView = PasswordChange(menu, request) >>> pwcView.update() False @@ -316,6 +316,46 @@ again to edit it... False +Tasks and Events +================ + +Task view with edit action +-------------------------- + + >>> from loops.setup import addAndConfigureObject + >>> from loops.organize.interfaces import ITask + >>> task = addAndConfigureObject(concepts, Concept, 'task', title=u'Task', + ... conceptType=type, typeInterface=ITask) + + >>> from loops.organize.task import Task + >>> component.provideAdapter(Task) + + >>> task01 = addAndConfigureObject(concepts, Concept, 'task01', + ... title=u'Task #1', conceptType=task) + + >>> from loops.organize.browser.task import TaskView + >>> view = TaskView(task01, TestRequest()) + >>> view.getActions('portlet') + [] + +Events listing +-------------- + + >>> event = addAndConfigureObject(concepts, Concept, 'event', title=u'Event', + ... conceptType=type, typeInterface=ITask) + >>> event01 = addAndConfigureObject(concepts, Concept, 'event01', + ... title=u'Event #1', conceptType=event, + ... ) + + >>> from loops.organize.browser.event import Events + >>> listing = Events(johnC, TestRequest()) + >>> listing.getActions('portlet') + [] + + >>> list(listing.events()) + [] + + Fin de partie ============= diff --git a/organize/browser/__init__.py b/organize/browser/__init__.py new file mode 100644 index 0000000..38314f3 --- /dev/null +++ b/organize/browser/__init__.py @@ -0,0 +1,3 @@ +""" +$Id$ +""" diff --git a/organize/browser/configure.zcml b/organize/browser/configure.zcml new file mode 100644 index 0000000..7cbe637 --- /dev/null +++ b/organize/browser/configure.zcml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + diff --git a/organize/browser/event.py b/organize/browser/event.py new file mode 100644 index 0000000..192af9b --- /dev/null +++ b/organize/browser/event.py @@ -0,0 +1,65 @@ +# +# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# +# 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; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +Definition of view classes and other browser related stuff for tasks. + +$Id$ +""" + +from zope import interface, component +from zope.app.pagetemplate import ViewPageTemplateFile +from zope.cachedescriptors.property import Lazy + +from loops.browser.action import DialogAction +from loops.browser.concept import ConceptView +from loops.common import adapted +from loops.util import _ + + +organize_macros = ViewPageTemplateFile('view_macros.pt') + + +class Events(ConceptView): + + @Lazy + def macro(self): + return organize_macros.macros['events'] + + def getActions(self, category='object', page=None): + actions = [] + if category == 'portlet': + actions.append(DialogAction(self, title=_(u'Create Event...'), + description=_(u'Create a new event.'), + viewName='create_concept.html', + dialogName='createEvent', + typeToken='.loops/concepts/event', + fixedType=True, + innerForm='inner_concept_form.html', + page=page)) + self.registerDojoDateWidget() + return actions + + def events(self): + cm = self.loopsRoot.getConceptManager() + tEvent = cm['event'] + hasType = cm.getTypePredicate() + sort = lambda x: adapted(x.second).start + for r in tEvent.getChildRelations([hasType], sort=sort): + yield self.childViewFactory(r, self.request, contextIsSecond=True) + diff --git a/organize/browser.py b/organize/browser/member.py similarity index 97% rename from organize/browser.py rename to organize/browser/member.py index 9ae3c3f..5c74730 100644 --- a/organize/browser.py +++ b/organize/browser/member.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2004 Helmut Merz helmutm@cy55.de +# Copyright (c) 2008 Helmut Merz helmutm@cy55.de # # 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 @@ -17,8 +17,8 @@ # """ -Definition of view classes and other browser related stuff for the -loops.organize package. +Definition of view classes and other browser related stuff for +members (persons). $Id$ """ diff --git a/organize/browser/task.py b/organize/browser/task.py new file mode 100644 index 0000000..ce7d81c --- /dev/null +++ b/organize/browser/task.py @@ -0,0 +1,48 @@ +# +# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# +# 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; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +Definition of view classes and other browser related stuff for tasks. + +$Id$ +""" + +from zope import interface, component +from zope.app.pagetemplate import ViewPageTemplateFile +from zope.cachedescriptors.property import Lazy + +from loops.browser.action import DialogAction +from loops.browser.concept import ConceptView +from loops.util import _ + + +organize_macros = ViewPageTemplateFile('view_macros.pt') + + +class TaskView(ConceptView): + + def getActions(self, category='object', page=None): + actions = [] + if category == 'portlet': + actions.append(DialogAction(self, title=_(u'Edit Task...'), + description=_(u'Modify task.'), + viewName='edit_concept.html', + dialogName='editTask', + page=page)) + self.registerDojoDateWidget() + return actions diff --git a/organize/browser/view_macros.pt b/organize/browser/view_macros.pt new file mode 100644 index 0000000..e8b338c --- /dev/null +++ b/organize/browser/view_macros.pt @@ -0,0 +1,36 @@ + + + + + + + + +
+
No Person object associated with your user account.
+
+
+ + + + +
+ +

+ Event +

+
+ Description +
+
+ 2008-02-28 - + 2008-02-29 +
+
+
+
diff --git a/organize/configure.zcml b/organize/configure.zcml index 77be6e7..8a68ee2 100644 --- a/organize/configure.zcml +++ b/organize/configure.zcml @@ -3,15 +3,13 @@ + i18n_domain="loops"> - @@ -25,9 +23,7 @@ handler="loops.organize.party.removePersonReferenceFromPrincipal" /> - - + @@ -35,38 +31,14 @@ set_schema="cybertools.organize.interfaces.IAddress" /> - - + + interface="loops.organize.interfaces.ITask" /> + set_schema="loops.organize.interfaces.ITask" /> - - - - - - - - - - - - @@ -110,6 +68,7 @@ + diff --git a/organize/interfaces.py b/organize/interfaces.py index 5c1347f..204d798 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -30,6 +30,7 @@ from zope.app.security.interfaces import IAuthentication, PrincipalLookupError from zope.security.proxy import removeSecurityProxy from cybertools.organize.interfaces import IPerson as IBasePerson +from cybertools.organize.interfaces import ITask from loops.interfaces import IConceptSchema from loops.organize.util import getPrincipalFolder from loops.util import _ @@ -147,3 +148,10 @@ class IMemberRegistrationManager(Interface): Raise a Validation Error (?) if the oldPw does not match the current password. """ + +# task + +class ITask(IConceptSchema, ITask): + + pass + diff --git a/organize/task.py b/organize/task.py index 3203bfd..bfa9464 100644 --- a/organize/task.py +++ b/organize/task.py @@ -24,7 +24,7 @@ $Id$ from zope.interface import implements -from cybertools.organize.interfaces import ITask +from loops.organize.interfaces import ITask from loops.interfaces import IConcept from loops.common import AdapterBase from loops.type import TypeInterfaceSourceList diff --git a/organize/view_macros.pt b/organize/view_macros.pt deleted file mode 100644 index 619cfe3..0000000 --- a/organize/view_macros.pt +++ /dev/null @@ -1,9 +0,0 @@ - - - - - -
-
No Person object associated with your user account.
-
-
diff --git a/view.py b/view.py index e005a55..b9139c5 100644 --- a/view.py +++ b/view.py @@ -66,12 +66,12 @@ class View(object): description = property(getDescription, setDescription) _viewName = u'' - def getViewName(self): return self._viewName or getattr(self, '_viewer', u'') - def setViewName(self, viewName): self._viewName = viewName + def getViewName(self): return self._viewName #or getattr(self, '_viewer', u'') + def setViewName(self, viewName): + self._viewName = viewName + #self._viewer = u'' # BBB viewName = property(getViewName, setViewName) - viewer = property(getViewName, setViewName) # BBB - def getTarget(self): rels = getRelations(first=self, relationships=[TargetRelation]) if len(rels) == 0: