diff --git a/browser/form.py b/browser/form.py index 0547c17..1ebe424 100644 --- a/browser/form.py +++ b/browser/form.py @@ -263,6 +263,9 @@ class EditConceptPage(EditConceptForm): super(EditConceptPage, self).setupController() self.registerDojoFormAll() + def getActions(self, category='object', page=None, target=None): + return [] + class CreateObjectForm(ObjectForm): @@ -449,6 +452,9 @@ class CreateConceptPage(CreateConceptForm): super(CreateConceptPage, self).setupController() self.registerDojoFormAll() + def getActions(self, category='object', page=None, target=None): + return [] + @Lazy def nextUrl(self): return self.getUrlForTarget(self.virtualTargetObject) diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 766b0e6..088068b 100644 Binary files a/locales/de/LC_MESSAGES/loops.mo and b/locales/de/LC_MESSAGES/loops.mo differ diff --git a/locales/de/LC_MESSAGES/loops.po b/locales/de/LC_MESSAGES/loops.po index 9c87152..bd2aae2 100644 --- a/locales/de/LC_MESSAGES/loops.po +++ b/locales/de/LC_MESSAGES/loops.po @@ -296,6 +296,30 @@ msgstr "Besprechungsprotokoll für dieses Objekt anzeigen." msgid "Download Meeting Minutes" msgstr "Besprechungsprotokoll generieren" +msgid "Participants" +msgstr "Teilnehmer" + +msgid "The names of the persons taking part in the event." +msgstr "Die Namen der Personen, die an der Besprechung teilnehmen." + +msgid "label_responsible" +msgstr "Vortragender" + +msgid "desc_responsible" +msgstr "Person, die diesen Tagesordnungpunkt vertritt." + +msgid "label_discussion" +msgstr "Diskussion" + +msgid "desc_discussion" +msgstr "Diskussion" + +msgid "label_consequences" +msgstr "Schlussfolgerungen" + +msgid "desc_consequences" +msgstr "Schlussfolgerungen" + msgid "Task/Action" msgstr "Aufgabe" diff --git a/organize/browser/event.py b/organize/browser/event.py index 560abad..ad9ff99 100644 --- a/organize/browser/event.py +++ b/organize/browser/event.py @@ -281,6 +281,7 @@ class CreateFollowUpEventForm(CreateConceptPage, MeetingMinutes): data = self.getData() data['title'] = self.baseEvent.title data['description'] = self.baseEvent.description + data['participants'] = self.baseEvent.participants return data def results(self): @@ -316,7 +317,6 @@ class CreateFollowUpEvent(CreateConcept, BaseFollowUpController): result = super(CreateFollowUpEvent, self).update() form = self.request.form toBeAssigned = form.get('cb_select_tasks') or [] - print '***', toBeAssigned for uid in toBeAssigned: task = util.getObjectForUid(uid) self.createFollowUpTask(adapted(task)) @@ -333,8 +333,9 @@ class CreateFollowUpEvent(CreateConcept, BaseFollowUpController): conceptType=taskType, title=source.title, description=source.description, - start=source.start, - end=source.end) + responsible=source.start, + discussion=source.discussion, + consequences=source.consequences) stask.assignChild(newTask, self.followsPredicate) for rel in stask.getParentRelations(): if rel.predicate != self.view.typePredicate: diff --git a/organize/configure.zcml b/organize/configure.zcml index c746607..352850d 100644 --- a/organize/configure.zcml +++ b/organize/configure.zcml @@ -39,6 +39,26 @@ set_schema="loops.organize.interfaces.ITask" /> + + + + + + + + + + + + diff --git a/organize/interfaces.py b/organize/interfaces.py index 01a580b..a7a8a57 100644 --- a/organize/interfaces.py +++ b/organize/interfaces.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2011 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 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 @@ -18,8 +18,6 @@ """ Interfaces for organizational stuff like persons and addresses. - -$Id$ """ from zope.interface import Interface, Attribute @@ -156,13 +154,46 @@ class IMemberRegistrationManager(Interface): current password. """ -# task +# task management, meeting minutes: task, event, agenda item class ITask(IConceptSchema, ITask, ILoopsAdapter): pass +class IEvent(ITask): + + participants = schema.Text( + title=_(u'Participants'), + description=_(u'The names of the persons taking part in the event.'), + default=u'', + missing_value=u'', + required=False) + + +class IAgendaItem(ILoopsAdapter): + + responsible = schema.TextLine( + title=_(u'label_responsible'), + description=_(u'desc_responsible.'), + default=u'', + required=False) + + discussion = schema.Text( + title=_(u'label_discussion'), + description=_(u'desc_discussion.'), + default=u'', + missing_value=u'', + required=False) + + concequences = schema.Text( + title=_(u'label_consequences'), + description=_(u'desc_consequences.'), + default=u'', + missing_value=u'', + required=False) + + # 'hasrole' predicate class IHasRole(IRelationAdapter): diff --git a/organize/task.py b/organize/task.py index b069497..cdbd172 100644 --- a/organize/task.py +++ b/organize/task.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2009 Helmut Merz helmutm@cy55.de +# Copyright (c) 2012 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,23 +17,22 @@ # """ -Adapters for IConcept providing interfaces from the cybertools.organize package. - -$Id$ +Adapters for IConcept providing interfaces from the +cybertools.organize package. """ from time import mktime from zope.component import adapts from zope.interface import implements -from loops.organize.interfaces import ITask +from loops.organize.interfaces import ITask, IEvent, IAgendaItem from loops.interfaces import IConcept from loops.interfaces import IIndexAttributes from loops.common import AdapterBase from loops.type import TypeInterfaceSourceList -TypeInterfaceSourceList.typeInterfaces += (ITask,) +TypeInterfaceSourceList.typeInterfaces += (ITask, IEvent, IAgendaItem) class Task(AdapterBase): @@ -42,10 +41,29 @@ class Task(AdapterBase): implements(ITask) - _adapterAttributes = ('context', '__parent__',) + _adapterAttributes = AdapterBase._adapterAttributes _contextAttributes = list(ITask) +class Event(Task): + """ A scheduled event or appointment. + """ + + implements(IEvent) + + _contextAttributes = list(IEvent) + + +class AgendaItem(AdapterBase): + """ Some topic (a sort of task) that is discussed during an event. + """ + + implements(IAgendaItem) + + _adapterAttributes = AdapterBase._adapterAttributes + _contextAttributes = list(IAgendaItem) + + class IndexAttributes(object): implements(IIndexAttributes) diff --git a/organize/tests.py b/organize/tests.py index 4e9e339..6c9e22e 100755 --- a/organize/tests.py +++ b/organize/tests.py @@ -24,8 +24,9 @@ from cybertools.util.jeep import Jeep from loops.common import adapted from loops.concept import Concept from loops.organize.interfaces import IPerson, IHasRole +from loops.organize.interfaces import IEvent, IAgendaItem from loops.organize.party import Person, HasRole -from loops.organize.task import Task +from loops.organize.task import Task, Event, AgendaItem from loops.setup import addAndConfigureObject from loops.tests.auth import login @@ -37,6 +38,8 @@ def setupUtilitiesAndAdapters(loopsRoot): component.provideUtility(principalAnnotations, IPrincipalAnnotationUtility) component.provideAdapter(Person, provides=IPerson) component.provideAdapter(Task) + component.provideAdapter(Event, provides=IEvent) + component.provideAdapter(AgendaItem, provides=IAgendaItem) component.provideAdapter(FoundPrincipalFactory) component.provideAdapter(HasRole, provides=IHasRole) return Jeep(( diff --git a/organize/work/README.txt b/organize/work/README.txt index 1e3f88f..1cce6d4 100644 --- a/organize/work/README.txt +++ b/organize/work/README.txt @@ -242,14 +242,19 @@ and recording information about the tasks. Let's start with creating an a event and assigning it a task. - >>> from loops.organize.interfaces import ITask + >>> from loops.organize.interfaces import IEvent, IAgendaItem >>> tEvent = addAndConfigureObject(concepts, Concept, 'event', - ... title=u'Event', conceptType=concepts.getTypeConcept(), - ... typeInterface=ITask) + ... title=u'Event', conceptType=concepts.getTypeConcept(), + ... typeInterface=IEvent) + >>> tAgendaItem = addAndConfigureObject(concepts, Concept, 'agendaitem', + ... title=u'AgendaItem', conceptType=concepts.getTypeConcept(), + ... typeInterface=IEvent) >>> ev01 = addAndConfigureObject(concepts, Concept, 'ev01', - ... title=u'loops Meeting', conceptType=tEvent) - >>> ev01.assignChild(task01) + ... title=u'loops Meeting', conceptType=tEvent) + >>> aitem01 = addAndConfigureObject(concepts, Concept, 'aitem01', + ... title=u'Documentation of Features', conceptType=tAgendaItem) + >>> ev01.assignChild(aitem01) Now we create the meeting minutes report. We assign the event type as a child in order to provide the information for which types of objects the @@ -259,9 +264,9 @@ report is available. >>> component.provideAdapter(MeetingMinutes, provides=IReportInstance, ... name='meeting_minutes') - >>> meetingMinutes = addAndConfigureObject(concepts, Concept, 'meeting_minutes', - ... title=u'Meeting Minutes', conceptType=tReport, - ... reportType='meeting_minutes') + >>> meetingMinutes = addAndConfigureObject(concepts, Concept, + ... 'meeting_minutes', title=u'Meeting Minutes', conceptType=tReport, + ... reportType='meeting_minutes') >>> meetingMinutes.assignChild(tEvent, hasReport) We can now access the report using a corresponding report-based view. @@ -277,7 +282,8 @@ We can now access the report using a corresponding report-based view. ... for col in reportView.displayedColumns: ... print col.getDisplayValue(row), ... print - {'url': 'http://127.0.0.1/loops/views/home/.36', 'title': u'loops Development'} + {'url': 'http://127.0.0.1/loops/views/home/.58', + 'title': u'Documentation of Features'} diff --git a/organize/work/report.py b/organize/work/report.py index 86dc356..2cd9628 100644 --- a/organize/work/report.py +++ b/organize/work/report.py @@ -371,6 +371,7 @@ class MeetingMinutes(WorkReportInstance): tasks, taskTitle, taskDescription, workItems)) defaultOutputFields = fields states = ('planned', 'accepted', 'done', 'done_x', 'finished') + taskTypeNames = ('agendaitem',) def selectObjects(self, parts): return [adapted(t) for t in self.getTasks(parts)[1:]]