provide institution selection for team-based surveys

This commit is contained in:
Helmut Merz 2015-04-19 15:16:49 +02:00
parent 09b75367a7
commit adbdb2840b
4 changed files with 101 additions and 15 deletions

View file

@ -1,5 +1,5 @@
#
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# Copyright (c) 2015 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
@ -30,8 +30,13 @@ from cybertools.typology.interfaces import IType
from loops.browser.action import DialogAction
from loops.browser.common import BaseView
from loops.browser.concept import ConceptView
from loops.common import adapted
from loops.knowledge.interfaces import IPerson, ITask
from loops.organize.party import getPersonForUser
from loops.organize.personal import favorite
from loops.organize.personal.interfaces import IFavorites
from loops.security.common import checkPermission
from loops import util
from loops.util import _
@ -69,6 +74,60 @@ actions.register('createQualification', 'portlet', DialogAction,
)
class InstitutionMixin(object):
knowledge_macros = knowledge_macros
@Lazy
def institutionType(self):
return self.conceptManager['institution']
@Lazy
def institutions(self):
if checkPermission('loops.ManageWorkspaces', self.context):
return self.getAllInstitutions()
result = []
p = getPersonForUser(self.context, self.request)
if p is None:
return result
for parent in p.getParents(
[self.memberPredicate, self.masterPredicate]):
if parent.conceptType == self.institutionType:
result.append(dict(
object=adapted(parent),
title=parent.title,
uid=util.getUidForObject(parent)))
return result
def getAllInstitutions(self):
insts = self.institutionType.getChildren([self.typePredicate])
return [dict(object=adapted(inst),
title=inst.title,
uid=util.getUidForObject(inst)) for inst in insts]
def setInstitution(self, uid):
inst = util.getObjectForUid(uid)
person = getPersonForUser(self.context, self.request)
favorite.setInstitution(person, inst)
self.institution = inst
return True
def getSavedInstitution(self):
person = getPersonForUser(self.context, self.request)
favorites = IFavorites(self.loopsRoot.getRecordManager()['favorites'])
for inst in favorites.list(person, type='institution'):
return adapted(util.getObjectForUid(inst))
@Lazy
def institution(self):
saved = self.getSavedInstitution()
for inst in self.institutions:
if inst['object'] == saved:
return inst['object']
if self.institutions:
return self.institutions[0]['object']
class MyKnowledge(ConceptView):
template = template

View file

@ -32,6 +32,7 @@ from cybertools.util.date import formatTimeStamp
from loops.browser.concept import ConceptView
from loops.browser.node import NodeView
from loops.common import adapted, baseObject
from loops.knowledge.browser import InstitutionMixin
from loops.knowledge.survey.response import Responses
from loops.organize.party import getPersonForUser
from loops.util import getObjectForUid
@ -40,7 +41,7 @@ from loops.util import _
template = ViewPageTemplateFile('view_macros.pt')
class SurveyView(ConceptView):
class SurveyView(InstitutionMixin, ConceptView):
data = None
errors = None
@ -69,6 +70,11 @@ class SurveyView(ConceptView):
if self.editable:
return 'index.html'
def update(self):
instUid = self.request.form.get('select_institution')
if instUid:
return self.setInstitution(instUid)
@Lazy
def groups(self):
result = []
@ -129,11 +135,12 @@ class SurveyView(ConceptView):
pred = self.conceptManager.get('ismember')
if pred is None:
return result
personId = respManager.personId
person = self.getObjectForUid(personId)
inst = person.getParents([pred])
#personId = respManager.personId
#person = self.getObjectForUid(personId)
#inst = person.getParents([pred])
inst = self.institution
if inst:
for c in inst[0].getChildren([pred]):
for c in inst.getChildren([pred]):
uid = self.getUidForObject(c)
data = respManager.load(uid)
if data:

View file

@ -40,6 +40,16 @@ class IQuestionnaire(IConceptSchema, interfaces.IQuestionnaire):
missing_value=u'',
required=False)
questionnaireType = schema.Choice(
title=_(u'Questionnaire Type'),
description=_(u'Select the type of the questionnaire.'),
source=KeywordVocabulary((
('standard', _(u'Standard Questionnaire')),
('pref_selection', _(u'Preference Selection')),
)),
default='standard',
required=True)
defaultAnswerRange = schema.Int(
title=_(u'Answer Range'),
description=_(u'Number of items (answer options) to select from.'),
@ -66,6 +76,12 @@ class IQuestionnaire(IConceptSchema, interfaces.IQuestionnaire):
default=False,
required=False)
teamBasedEvaluation = schema.Bool(
title=_(u'Team-based Evaluation'),
description=_(u'.'),
default=False,
required=False)
feedbackColumns = Records(
title=_(u'Feedback Columns'),
description=_(u'Column definitions for the results table '
@ -109,14 +125,14 @@ class IQuestion(IConceptSchema, interfaces.IQuestion):
"""
questionType = schema.Choice(
title=_(u'Question Type'),
description=_(u'Select the type of the question.'),
source=KeywordVocabulary((
('value_selection', _(u'Value Selection')),
('text', _(u'Text')),
)),
default='value_selection',
required=True)
title=_(u'Question Type'),
description=_(u'Select the type of the question.'),
source=KeywordVocabulary((
('value_selection', _(u'Value Selection')),
('text', _(u'Text')),
)),
default='value_selection',
required=True)
required = schema.Bool(
title=_(u'Required'),

View file

@ -4,7 +4,8 @@
<metal:block define-macro="survey"
tal:define="feedback item/results;
errors item/errors">
errors item/errors;
dummy item/update">
<metal:title use-macro="item/conceptMacros/concepttitle_only" />
<tal:description condition="not:feedback">
<div tal:define="header item/adapted/questionnaireHeader"
@ -60,6 +61,9 @@
<div id="questionnaire"
tal:condition="not:feedback">
<tal:inst condition="item/adapted/teamBasedEvaluation">
<metal:inst use-macro="item/knowledge_macros/select_institution" />
</tal:inst>
<h3 i18n:translate="">Questionnaire</h3>
<div class="error"
tal:condition="errors">