diff --git a/organize/README.txt b/organize/README.txt index 55bc758..0fc6988 100644 --- a/organize/README.txt +++ b/organize/README.txt @@ -390,6 +390,11 @@ Events listing >>> list(listing.events()) [] +Creation of follow-up event +--------------------------- + + >>> from loops.organize.browser.event import CreateFollowUpEvent + Send Email to Members ===================== diff --git a/organize/browser/event.py b/organize/browser/event.py index 004daeb..560abad 100644 --- a/organize/browser/event.py +++ b/organize/browser/event.py @@ -23,9 +23,11 @@ Definition of view classes and other browser related stuff for tasks. import calendar from datetime import date, datetime, timedelta from urllib import urlencode -from zope import interface, component +from zope.app.container.interfaces import INameChooser from zope.app.pagetemplate import ViewPageTemplateFile from zope.cachedescriptors.property import Lazy +from zope import interface, component +from zope.traversing.api import getName from cybertools.browser.action import actions from cybertools.meta.interfaces import IOptions @@ -34,8 +36,10 @@ from loops.browser.concept import ConceptView from loops.browser.form import CreateConceptPage, CreateConcept from loops.browser.form import EditConceptPage, EditConcept from loops.browser.node import NodeView -from loops.common import adapted +from loops.common import adapted, baseObject +from loops.concept import Concept from loops.organize.work.meeting import MeetingMinutes +from loops.setup import addAndConfigureObject from loops.util import _ from loops import util @@ -300,6 +304,55 @@ class CreateFollowUpEvent(CreateConcept, BaseFollowUpController): defaultTypeToken = '.loops/concepts/event' + @Lazy + def followsPredicate(self): + return self.view.conceptManager['follows'] + + @Lazy + def baseEvent(self): + return adapted(self.view.virtualTargetObject) + + def update(self): + 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)) + return result + + def createFollowUpTask(self, source): + cm = self.view.conceptManager + stask = baseObject(source) + bevt = baseObject(self.baseEvent) + taskType = stask.conceptType + taskName = getName(stask) + name = INameChooser(cm).chooseName(taskName, stask) + newTask = addAndConfigureObject(cm, Concept, name, + conceptType=taskType, + title=source.title, + description=source.description, + start=source.start, + end=source.end) + stask.assignChild(newTask, self.followsPredicate) + for rel in stask.getParentRelations(): + if rel.predicate != self.view.typePredicate: + if rel.first == bevt: + parent = self.object + else: + parent = rel.first + newTask.assignParent(parent, rel.predicate, + order=rel.order, relevance=rel.relevance) + return newTask + + def assignConcepts(self, obj): + bevt = baseObject(self.baseEvent) + bevt.assignChild(obj, self.followsPredicate) + for rel in bevt.getParentRelations(): + if rel.predicate != self.view.typePredicate: + obj.assignParent(rel.first, rel.predicate) + class EditFollowUpEvent(EditConcept, BaseFollowUpController): diff --git a/organize/work/meeting.pt b/organize/work/meeting.pt index 036ccc4..8361644 100644 --- a/organize/work/meeting.pt +++ b/organize/work/meeting.pt @@ -70,7 +70,8 @@ style="border: 1px solid grey"> + tal:attributes="name string:$cb_name:list; + value row/context/uid" /> diff --git a/organize/work/report.py b/organize/work/report.py index 9690dfd..deb8865 100644 --- a/organize/work/report.py +++ b/organize/work/report.py @@ -330,8 +330,6 @@ class TaskRow(BaseRow): ) - - class MeetingMinutes(WorkReportInstance): type = "meeting_minutes" @@ -345,6 +343,6 @@ class MeetingMinutes(WorkReportInstance): states = ('planned', 'accepted', 'done', 'done_x', 'finished') def selectObjects(self, parts): - return self.getTasks(parts)[1:] + return [adapted(t) for t in self.getTasks(parts)[1:]]