OpenSlides/openslides/agenda/projector.py
Norman Jäckel 06ead753dc Added and updated several projector elements (slides).
Added list slides for motions and assignments.
Added detail slide for presentable files.
Updated list and detail slides for agenda items including slides for list of speakers.
2015-06-28 19:22:57 +02:00

94 lines
3.3 KiB
Python

from django.utils.translation import ugettext as _
from openslides.core.exceptions import ProjectorException
from openslides.core.views import TagViewSet
from openslides.utils.projector import ProjectorElement, ProjectorRequirement
from .models import Item
from .views import ItemViewSet
class ItemListSlide(ProjectorElement):
"""
Slide definitions for Item model.
This is only for list slides.
Set 'id' to None to get a list slide of all root items. Set 'id' to an
integer to get a list slide of the children of the metioned item.
Additionally set 'tree' to True to get also children of children.
"""
name = 'agenda/item-list'
def get_context(self):
pk = self.config_entry.get('id')
if pk is None:
# Root list slide.
context = {'tree': self.config_entry.get('tree', False)}
else:
# Children slide.
if not Item.objects.filter(pk=pk).exists():
raise ProjectorException(_('Item does not exist.'))
context = {'id': pk, 'tree': self.config_entry.get('tree', False)}
return context
def get_requirements(self, config_entry):
pk = config_entry.get('id', 'tree')
if pk is None or self.config_entry.get('tree', False):
# Root list slide or slide with tree.
yield ProjectorRequirement(
view_class=ItemViewSet,
view_action='tree')
# Root list slide and children list slide.
# Related objects like users and tags are not unlocked.
yield ProjectorRequirement(
view_class=ItemViewSet,
view_action='list')
class ItemDetailSlide(ProjectorElement):
"""
Slide definitions for Item model.
This is only for detail slides. You have to set 'id'.
To activate a detail slide as list of speakers slide, set 'id' and set
'list_of_speakers' true.
"""
name = 'agenda/item-detail'
def get_context(self):
pk = self.config_entry.get('id')
if pk is None:
raise ProjectorException(_('Id must not be None.'))
if not Item.objects.filter(pk=pk).exists():
raise ProjectorException(_('Item does not exist.'))
return {'id': pk, 'list_of_speakers': self.config_entry.get('list_of_speakers', False)}
def get_requirements(self, config_entry):
pk = config_entry.get('id')
if pk is not None:
# Detail slide.
try:
item = Item.objects.get(pk=pk)
except Item.DoesNotExist:
# Item does not exist. Just do nothing.
pass
else:
yield ProjectorRequirement(
view_class=ItemViewSet,
view_action='retrieve',
pk=str(item.pk))
for speaker in item.speaker_set.all():
yield ProjectorRequirement(
view_class=speaker.user.get_view_class(),
view_action='retrieve',
pk=str(speaker.user_id))
for tag in item.tags.all():
yield ProjectorRequirement(
view_class=TagViewSet,
view_action='retrieve',
pk=str(tag.pk))