merge branch master

This commit is contained in:
Helmut Merz 2012-07-21 08:20:06 +02:00
commit 27720799f8
10 changed files with 134 additions and 24 deletions

View file

@ -263,6 +263,9 @@ class EditConceptPage(EditConceptForm):
super(EditConceptPage, self).setupController() super(EditConceptPage, self).setupController()
self.registerDojoFormAll() self.registerDojoFormAll()
def getActions(self, category='object', page=None, target=None):
return []
class CreateObjectForm(ObjectForm): class CreateObjectForm(ObjectForm):
@ -449,6 +452,9 @@ class CreateConceptPage(CreateConceptForm):
super(CreateConceptPage, self).setupController() super(CreateConceptPage, self).setupController()
self.registerDojoFormAll() self.registerDojoFormAll()
def getActions(self, category='object', page=None, target=None):
return []
@Lazy @Lazy
def nextUrl(self): def nextUrl(self):
return self.getUrlForTarget(self.virtualTargetObject) return self.getUrlForTarget(self.virtualTargetObject)

Binary file not shown.

View file

@ -296,6 +296,30 @@ msgstr "Besprechungsprotokoll für dieses Objekt anzeigen."
msgid "Download Meeting Minutes" msgid "Download Meeting Minutes"
msgstr "Besprechungsprotokoll generieren" 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" msgid "Task/Action"
msgstr "Aufgabe" msgstr "Aufgabe"

View file

@ -281,6 +281,7 @@ class CreateFollowUpEventForm(CreateConceptPage, MeetingMinutes):
data = self.getData() data = self.getData()
data['title'] = self.baseEvent.title data['title'] = self.baseEvent.title
data['description'] = self.baseEvent.description data['description'] = self.baseEvent.description
data['participants'] = self.baseEvent.participants
return data return data
def results(self): def results(self):
@ -316,7 +317,6 @@ class CreateFollowUpEvent(CreateConcept, BaseFollowUpController):
result = super(CreateFollowUpEvent, self).update() result = super(CreateFollowUpEvent, self).update()
form = self.request.form form = self.request.form
toBeAssigned = form.get('cb_select_tasks') or [] toBeAssigned = form.get('cb_select_tasks') or []
print '***', toBeAssigned
for uid in toBeAssigned: for uid in toBeAssigned:
task = util.getObjectForUid(uid) task = util.getObjectForUid(uid)
self.createFollowUpTask(adapted(task)) self.createFollowUpTask(adapted(task))
@ -333,8 +333,9 @@ class CreateFollowUpEvent(CreateConcept, BaseFollowUpController):
conceptType=taskType, conceptType=taskType,
title=source.title, title=source.title,
description=source.description, description=source.description,
start=source.start, responsible=source.start,
end=source.end) discussion=source.discussion,
consequences=source.consequences)
stask.assignChild(newTask, self.followsPredicate) stask.assignChild(newTask, self.followsPredicate)
for rel in stask.getParentRelations(): for rel in stask.getParentRelations():
if rel.predicate != self.view.typePredicate: if rel.predicate != self.view.typePredicate:

View file

@ -39,6 +39,26 @@
set_schema="loops.organize.interfaces.ITask" /> set_schema="loops.organize.interfaces.ITask" />
</zope:class> </zope:class>
<zope:adapter factory="loops.organize.task.Event"
provides="loops.organize.interfaces.IEvent"
trusted="True" />
<zope:class class="loops.organize.task.Event">
<require permission="zope.View"
interface="loops.organize.interfaces.IEvent" />
<require permission="zope.ManageContent"
set_schema="loops.organize.interfaces.IEvent" />
</zope:class>
<zope:adapter factory="loops.organize.task.AgendaItem"
provides="loops.organize.interfaces.IAgendaItem"
trusted="True" />
<zope:class class="loops.organize.task.AgendaItem">
<require permission="zope.View"
interface="loops.organize.interfaces.IAgendaItem" />
<require permission="zope.ManageContent"
set_schema="loops.organize.interfaces.IAgendaItem" />
</zope:class>
<zope:adapter factory="loops.organize.party.HasRole" <zope:adapter factory="loops.organize.party.HasRole"
provides="loops.organize.interfaces.IHasRole" provides="loops.organize.interfaces.IHasRole"
trusted="True" /> trusted="True" />

View file

@ -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 # 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 # 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. Interfaces for organizational stuff like persons and addresses.
$Id$
""" """
from zope.interface import Interface, Attribute from zope.interface import Interface, Attribute
@ -156,13 +154,46 @@ class IMemberRegistrationManager(Interface):
current password. current password.
""" """
# task # task management, meeting minutes: task, event, agenda item
class ITask(IConceptSchema, ITask, ILoopsAdapter): class ITask(IConceptSchema, ITask, ILoopsAdapter):
pass 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 # 'hasrole' predicate
class IHasRole(IRelationAdapter): class IHasRole(IRelationAdapter):

View file

@ -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 # 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 # 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. Adapters for IConcept providing interfaces from the
cybertools.organize package.
$Id$
""" """
from time import mktime from time import mktime
from zope.component import adapts from zope.component import adapts
from zope.interface import implements 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 IConcept
from loops.interfaces import IIndexAttributes from loops.interfaces import IIndexAttributes
from loops.common import AdapterBase from loops.common import AdapterBase
from loops.type import TypeInterfaceSourceList from loops.type import TypeInterfaceSourceList
TypeInterfaceSourceList.typeInterfaces += (ITask,) TypeInterfaceSourceList.typeInterfaces += (ITask, IEvent, IAgendaItem)
class Task(AdapterBase): class Task(AdapterBase):
@ -42,10 +41,29 @@ class Task(AdapterBase):
implements(ITask) implements(ITask)
_adapterAttributes = ('context', '__parent__',) _adapterAttributes = AdapterBase._adapterAttributes
_contextAttributes = list(ITask) _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): class IndexAttributes(object):
implements(IIndexAttributes) implements(IIndexAttributes)

View file

@ -24,8 +24,9 @@ from cybertools.util.jeep import Jeep
from loops.common import adapted from loops.common import adapted
from loops.concept import Concept from loops.concept import Concept
from loops.organize.interfaces import IPerson, IHasRole from loops.organize.interfaces import IPerson, IHasRole
from loops.organize.interfaces import IEvent, IAgendaItem
from loops.organize.party import Person, HasRole 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.setup import addAndConfigureObject
from loops.tests.auth import login from loops.tests.auth import login
@ -37,6 +38,8 @@ def setupUtilitiesAndAdapters(loopsRoot):
component.provideUtility(principalAnnotations, IPrincipalAnnotationUtility) component.provideUtility(principalAnnotations, IPrincipalAnnotationUtility)
component.provideAdapter(Person, provides=IPerson) component.provideAdapter(Person, provides=IPerson)
component.provideAdapter(Task) component.provideAdapter(Task)
component.provideAdapter(Event, provides=IEvent)
component.provideAdapter(AgendaItem, provides=IAgendaItem)
component.provideAdapter(FoundPrincipalFactory) component.provideAdapter(FoundPrincipalFactory)
component.provideAdapter(HasRole, provides=IHasRole) component.provideAdapter(HasRole, provides=IHasRole)
return Jeep(( return Jeep((

View file

@ -242,14 +242,19 @@ and recording information about the tasks.
Let's start with creating an a event and assigning it a task. 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', >>> tEvent = addAndConfigureObject(concepts, Concept, 'event',
... title=u'Event', conceptType=concepts.getTypeConcept(), ... title=u'Event', conceptType=concepts.getTypeConcept(),
... typeInterface=ITask) ... typeInterface=IEvent)
>>> tAgendaItem = addAndConfigureObject(concepts, Concept, 'agendaitem',
... title=u'AgendaItem', conceptType=concepts.getTypeConcept(),
... typeInterface=IEvent)
>>> ev01 = addAndConfigureObject(concepts, Concept, 'ev01', >>> ev01 = addAndConfigureObject(concepts, Concept, 'ev01',
... title=u'loops Meeting', conceptType=tEvent) ... title=u'loops Meeting', conceptType=tEvent)
>>> ev01.assignChild(task01) >>> 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 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 child in order to provide the information for which types of objects the
@ -259,8 +264,8 @@ report is available.
>>> component.provideAdapter(MeetingMinutes, provides=IReportInstance, >>> component.provideAdapter(MeetingMinutes, provides=IReportInstance,
... name='meeting_minutes') ... name='meeting_minutes')
>>> meetingMinutes = addAndConfigureObject(concepts, Concept, 'meeting_minutes', >>> meetingMinutes = addAndConfigureObject(concepts, Concept,
... title=u'Meeting Minutes', conceptType=tReport, ... 'meeting_minutes', title=u'Meeting Minutes', conceptType=tReport,
... reportType='meeting_minutes') ... reportType='meeting_minutes')
>>> meetingMinutes.assignChild(tEvent, hasReport) >>> meetingMinutes.assignChild(tEvent, hasReport)
@ -277,7 +282,8 @@ We can now access the report using a corresponding report-based view.
... for col in reportView.displayedColumns: ... for col in reportView.displayedColumns:
... print col.getDisplayValue(row), ... print col.getDisplayValue(row),
... print ... 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'}
<cybertools.composer.report.result.ResultSet object ...> <cybertools.composer.report.result.ResultSet object ...>

View file

@ -371,6 +371,7 @@ class MeetingMinutes(WorkReportInstance):
tasks, taskTitle, taskDescription, workItems)) tasks, taskTitle, taskDescription, workItems))
defaultOutputFields = fields defaultOutputFields = fields
states = ('planned', 'accepted', 'done', 'done_x', 'finished') states = ('planned', 'accepted', 'done', 'done_x', 'finished')
taskTypeNames = ('agendaitem',)
def selectObjects(self, parts): def selectObjects(self, parts):
return [adapted(t) for t in self.getTasks(parts)[1:]] return [adapted(t) for t in self.getTasks(parts)[1:]]