diff --git a/openslides/participant/views.py b/openslides/participant/views.py index 4255806e8..82058ee63 100644 --- a/openslides/participant/views.py +++ b/openslides/participant/views.py @@ -241,7 +241,7 @@ class ParticipantsPasswordsPDF(PDFView): img_stream = StringIO() qrcode_img.save(img_stream, 'PNG') img_stream.seek(0) - size = 2*cm + size = 2 * cm I = Image(img_stream, width=size, height=size) for user in User.objects.all().order_by(sort): cell = [] diff --git a/openslides/projector/api.py b/openslides/projector/api.py index 13035d916..9e634a076 100644 --- a/openslides/projector/api.py +++ b/openslides/projector/api.py @@ -120,28 +120,6 @@ def register_slidefunc(key, func, control_template=None, weight=0, name=''): name=name,) -def projector_message_set(message, sid=None): - """ - Set the overlay-message. - if sid is set, only show the message on the sid-slide. - """ - from models import ProjectorOverlay - config['projector_message'] = message - try: - overlay = ProjectorOverlay.objects.get(def_name='Message') - except ProjectorOverlay.DoesNotExist: - overlay = ProjectorOverlay(def_name='Message', active=False) - overlay.sid = sid - overlay.save() - - -def projector_message_delete(): - """ - Delete the overlay-message. - """ - config['projector_message'] = '' - - def get_all_widgets(request, session=False): widgets = SortedDict() session_widgets = request.session.get('widgets', {}) diff --git a/openslides/projector/models.py b/openslides/projector/models.py index e2260cf2a..8705181c3 100644 --- a/openslides/projector/models.py +++ b/openslides/projector/models.py @@ -54,17 +54,3 @@ class ProjectorSlide(models.Model, SlideMixin): register_slidemodel(ProjectorSlide, control_template='projector/control_customslide.html') - - -class ProjectorOverlay(models.Model): - """ - Save information for a overlay. - """ - active = models.BooleanField(verbose_name=_('Active')) - def_name = models.CharField(max_length=64) - sid = models.CharField(max_length=64, null=True, blank=True) - - def __unicode__(self): - if self.sid: - return "%s on %s" % (self.def_name, self.sid) - return self.def_name diff --git a/openslides/projector/projector.py b/openslides/projector/projector.py index ba6b930ea..537bfc40d 100644 --- a/openslides/projector/projector.py +++ b/openslides/projector/projector.py @@ -16,7 +16,6 @@ from django.dispatch import receiver from django.template.loader import render_to_string from openslides.config.api import config -from openslides.projector.signals import projector_overlays SLIDE = {} @@ -146,35 +145,26 @@ class Widget(object): return unicode(self.display_name) -@receiver(projector_overlays, dispatch_uid="projector_countdown") -def countdown(sender, **kwargs): - name = 'Countdown' - if kwargs['register']: - return name - if name in kwargs['call']: - if config['countdown_state'] == 'active': - seconds = max(0, int(config['countdown_start_stamp'] + config['countdown_time'] - time())) - elif config['countdown_state'] == 'paused': - seconds = max(0, int(config['countdown_start_stamp'] + config['countdown_time'] - config['countdown_pause_stamp'])) - elif config['countdown_state'] == 'inactive': - seconds = max(0, int(config['countdown_time'])) - else: - seconds = 0 +class Overlay(object): + """ + Represents an overlay which can be seen on the projector. + """ - if seconds == 0: - config['countdown_state'] = 'expired' + def __init__(self, name, get_widget_html, get_projector_html): + self.name = name + self.widget_html_callback = get_widget_html + self.projector_html_callback = get_projector_html - return (name, '%02d:%02d' % (seconds / 60, seconds % 60)) - return None + def get_widget_html(self): + return self.widget_html_callback() + def get_projector_html(self): + try: + return self._projector_html + except AttributeError: + self._projector_html = self.projector_html_callback() + return self.get_projector_html() -@receiver(projector_overlays, dispatch_uid="projector_message") -def projector_message(sender, **kwargs): - name = 'Message' - if kwargs['register']: - return name - if name in kwargs['call']: - message = config['projector_message'] - if message != '': - return (name, message) - return None + def is_active(self): + return (self.name in config['projector_active_overlays'] and + self.get_projector_html() is not None) diff --git a/openslides/projector/signals.py b/openslides/projector/signals.py index af38e4596..b8136e797 100644 --- a/openslides/projector/signals.py +++ b/openslides/projector/signals.py @@ -9,16 +9,22 @@ :copyright: 2011–2013 by OpenSlides team, see AUTHORS. :license: GNU GPL, see LICENSE for more details. """ +from time import time from django.dispatch import Signal, receiver from django import forms from django.utils.translation import ugettext_lazy, ugettext as _ +from django.template.loader import render_to_string +from django.core.context_processors import csrf +from openslides.config.api import config from openslides.config.signals import config_signal from openslides.config.api import ConfigVariable, ConfigPage +from .projector import Overlay -projector_overlays = Signal(providing_args=['register', 'call']) + +projector_overlays = Signal(providing_args=['request']) @receiver(config_signal, dispatch_uid='setup_projector_config_variables') @@ -64,8 +70,80 @@ def setup_projector_config_variables(sender, **kwargs): name='up', default_value=0) - return ConfigPage(title='No title here', - url='bar', - required_permission=None, - variables=(presentation, presentation_argument, projector_message, countdown_time, - countdown_start_stamp, countdown_pause_stamp, countdown_state, bigger, up)) + projector_active_overlays = ConfigVariable( + name='projector_active_overlays', + default_value=[]) + + return ConfigPage( + title='No title here', url='bar', required_permission=None, variables=( + presentation, presentation_argument, projector_message, + countdown_time, countdown_start_stamp, countdown_pause_stamp, + countdown_state, bigger, up, projector_active_overlays)) + + +@receiver(projector_overlays, dispatch_uid="projector_countdown") +def countdown(sender, **kwargs): + """ + Reveiver for the countdown. + """ + name = 'projector_countdown' + request = kwargs.get('request', None) + + def get_widget_html(): + """ + Returns the the html-code to show in the overly-widget. + """ + context = { + 'countdown_time': config['countdown_time'], + 'countdown_state': config['countdown_state']} + context.update(csrf(request)) + return render_to_string('projector/overlay_countdown_widget.html', context) + + def get_projector_html(): + """ + Returns an html-code to show on the projector. + """ + start = config['countdown_start_stamp'] + duration = config['countdown_time'] + pause = config['countdown_pause_stamp'] + if config['countdown_state'] == 'active': + seconds = max(0, int(start + duration - time())) + elif config['countdown_state'] == 'paused': + seconds = max(0, int(start + duration - pause)) + elif config['countdown_state'] == 'inactive': + seconds = max(0, int(duration)) + else: + seconds = 0 + if seconds == 0: + config['countdown_state'] = 'expired' + return render_to_string('projector/overlay_countdown_projector.html', + {'seconds': '%02d:%02d' % (seconds / 60, seconds % 60)}) + + return Overlay(name, get_widget_html, get_projector_html) + + +@receiver(projector_overlays, dispatch_uid="projector_message") +def projector_message(sender, **kwargs): + """ + Receiver to show the overlay_message on the projector or the form in the + overlay-widget on the dashboard. + """ + name = 'projector_message' + request = kwargs.get('request', None) + + def get_widget_html(): + """ + Returns the the html-code to show in the overly-widget. + """ + return render_to_string('projector/overlay_message_widget.html', csrf(request)) + + def get_projector_html(): + """ + Returns an html-code to show on the projector. + """ + if config['projector_message']: + return render_to_string('projector/overlay_message_projector.html', + {'message': config['projector_message']}) + return None + + return Overlay(name, get_widget_html, get_projector_html) diff --git a/openslides/projector/static/javascript/dashboard.js b/openslides/projector/static/javascript/dashboard.js index 454accbff..c1aed73be 100644 --- a/openslides/projector/static/javascript/dashboard.js +++ b/openslides/projector/static/javascript/dashboard.js @@ -88,11 +88,11 @@ $(function() { dataType: 'json', success: function(data) { if (data['active']) { - $('#' + data['def_name'] + '_active').show(); - $('#' + data['def_name'] + '_inactive').hide(); + $('#' + data['name'] + '_active').show(); + $('#' + data['name'] + '_inactive').hide(); } else { - $('#' + data['def_name'] + '_active').hide(); - $('#' + data['def_name'] + '_inactive').show(); + $('#' + data['name'] + '_active').hide(); + $('#' + data['name'] + '_inactive').show(); } } }); diff --git a/openslides/projector/static/javascript/projector.js b/openslides/projector/static/javascript/projector.js index 4e0ee8714..9078dd148 100644 --- a/openslides/projector/static/javascript/projector.js +++ b/openslides/projector/static/javascript/projector.js @@ -8,7 +8,6 @@ content_hash = null; function presentation_reload() { - if ($('#config > #ajax').html() == 'on') { $.ajax({ type: 'GET', @@ -33,11 +32,8 @@ function presentation_reload() { $('#scrollcontent').animate({'margin-top': data.up + 'em'}, 200); // overlays $('#overlays div').remove(); - $('#overlays span').remove(); - $.each(data['overlays'], function (index, value){ - if (value[0] != "Countdown") - $('#overlays').append('') - $('#overlays').append('