From 06ead753dc95ce32a556a70f0e038c54eb4b189d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Norman=20J=C3=A4ckel?= Date: Thu, 25 Jun 2015 20:36:46 +0200 Subject: [PATCH] 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. --- openslides/agenda/projector.py | 43 +++++++++++++++++++++++++---- openslides/assignments/projector.py | 26 +++++++++++++---- openslides/mediafiles/apps.py | 4 +++ openslides/mediafiles/projector.py | 32 +++++++++++++++++++++ openslides/motions/projector.py | 26 +++++++++++++---- 5 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 openslides/mediafiles/projector.py diff --git a/openslides/agenda/projector.py b/openslides/agenda/projector.py index 7e39a1687..dd5d20aa6 100644 --- a/openslides/agenda/projector.py +++ b/openslides/agenda/projector.py @@ -10,11 +10,39 @@ from .views import ItemViewSet class ItemListSlide(ProjectorElement): """ - Slide definitions for the agenda. + 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/agenda' + 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') @@ -24,13 +52,17 @@ class ItemDetailSlide(ProjectorElement): """ Slide definitions for Item model. - To activate this slide as list of speakers slide, set 'list_of_speakers' - true. + 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' + 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)} @@ -38,6 +70,7 @@ class ItemDetailSlide(ProjectorElement): 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: diff --git a/openslides/assignments/projector.py b/openslides/assignments/projector.py index 4035c7975..6687ed11d 100644 --- a/openslides/assignments/projector.py +++ b/openslides/assignments/projector.py @@ -8,21 +8,35 @@ from .models import Assignment from .views import AssignmentViewSet -class AssignmentDetailSlide(ProjectorElement): +class AssignmentSlide(ProjectorElement): """ - Slide definitions for assignment model. + Slide definitions for Assignment model. + + Set 'id' to get a detail slide. Omit it to get a list slide. """ name = 'assignments/assignment' def get_context(self): pk = self.config_entry.get('id') - if not Assignment.objects.filter(pk=pk).exists(): - raise ProjectorException(_('Assignment does not exist.')) - return {'id': pk} + if pk is None: + # List slide. + context = None + else: + # Detail slide. + if not Assignment.objects.filter(pk=pk).exists(): + raise ProjectorException(_('Assignment does not exist.')) + context = {'id': pk} + return context def get_requirements(self, config_entry): pk = config_entry.get('id') - if pk is not None: + if pk is None: + # List slide. Related objects like users and tags are not unlocked. + yield ProjectorRequirement( + view_class=AssignmentViewSet, + view_action='list') + else: + # Detail slide. try: assignment = Assignment.objects.get(pk=pk) except Assignment.DoesNotExist: diff --git a/openslides/mediafiles/apps.py b/openslides/mediafiles/apps.py index 0cdbff423..013eca87a 100644 --- a/openslides/mediafiles/apps.py +++ b/openslides/mediafiles/apps.py @@ -6,6 +6,10 @@ class MediafileAppConfig(AppConfig): verbose_name = 'OpenSlides Mediafiles' def ready(self): + # Load projector elements. + # Do this by just importing all from these files. + from . import projector # noqa + # Import all required stuff. from openslides.utils.rest_api import router from .views import MediafileViewSet diff --git a/openslides/mediafiles/projector.py b/openslides/mediafiles/projector.py new file mode 100644 index 000000000..32ec3bd44 --- /dev/null +++ b/openslides/mediafiles/projector.py @@ -0,0 +1,32 @@ +from django.utils.translation import ugettext as _ + +from openslides.core.exceptions import ProjectorException +from openslides.utils.projector import ProjectorElement, ProjectorRequirement + +from .models import Mediafile +from .views import MediafileViewSet + + +class MediafileSlide(ProjectorElement): + """ + Slide definitions for Mediafile model. + """ + name = 'mediafiles/mediafile' + + def get_context(self): + pk = self.config_entry.get('id') + try: + mediafile = Mediafile.objects.get(pk=pk) + except Mediafile.DoesNotExist: + raise ProjectorException(_('File does not exist.')) + if not (mediafile.is_presentable and mediafile.filetype == 'application/pdf'): + raise ProjectorException(_('File is not presentable.')) + return {'id': pk} + + def get_requirements(self, config_entry): + pk = config_entry.get('id') + if pk is not None: + yield ProjectorRequirement( + view_class=MediafileViewSet, + view_action='retrieve', + pk=str(pk)) diff --git a/openslides/motions/projector.py b/openslides/motions/projector.py index 7b16aeb18..656ecea61 100644 --- a/openslides/motions/projector.py +++ b/openslides/motions/projector.py @@ -8,21 +8,35 @@ from .models import Motion from .views import CategoryViewSet, MotionViewSet, WorkflowViewSet -class MotionDetailSlide(ProjectorElement): +class MotionSlide(ProjectorElement): """ - Slide definitions for motion model. + Slide definitions for Motion model. + + Set 'id' to get a detail slide. Omit it to get a list slide. """ name = 'motions/motion' def get_context(self): pk = self.config_entry.get('id') - if not Motion.objects.filter(pk=pk).exists(): - raise ProjectorException(_('Motion does not exist.')) - return {'id': pk} + if pk is None: + # List slide. + context = None + else: + # Detail slide. + if not Motion.objects.filter(pk=pk).exists(): + raise ProjectorException(_('Motion does not exist.')) + context = {'id': pk} + return context def get_requirements(self, config_entry): pk = config_entry.get('id') - if pk is not None: + if pk is None: + # List slide. Related objects like users and tags are not unlocked. + yield ProjectorRequirement( + view_class=MotionViewSet, + view_action='list') + else: + # Detail slide. try: motion = Motion.objects.get(pk=pk) except Motion.DoesNotExist: