diff --git a/openslides/projector/models.py b/openslides/projector/models.py index 1d99ce504..150d3f3ba 100644 --- a/openslides/projector/models.py +++ b/openslides/projector/models.py @@ -22,5 +22,14 @@ class ProjectorSlide(models.Model, SlideMixin): ('can_see_projector', _("Can see projector", fixstr=True)), ) + +class ProjectorMessage(models.Model): + active = models.BooleanField(verbose_name=_('Active')) + def_name = models.CharField(max_length=64) + + def __unicode__(self): + return self.def_name + + register_slidemodel(ProjectorSlide, category=_('Projector'), model_name=_('Projector Slide')) diff --git a/openslides/projector/projector.py b/openslides/projector/projector.py index a009c894d..2d7d9b3b8 100644 --- a/openslides/projector/projector.py +++ b/openslides/projector/projector.py @@ -1,6 +1,7 @@ -from datetime import datetime +from time import time from django.dispatch import receiver +from django.utils.translation import ugettext as _ from system import config @@ -69,11 +70,11 @@ class Slide(object): @receiver(projector_messages, dispatch_uid="projector_countdown") def countdown(sender, **kwargs): - if config['countdown_visible']: + name = _('Projector Countdown') + if kwargs['register']: + return name + if name in kwargs['call']: starttime = config['countdown_start'] - if type(starttime) != type(datetime.now()): - config['countdown_start'] = datetime.now() - starttime = config['countdown_start'] - #todo: return the time passt sinth starttime - return datetime.now() - starttime + seconds = max(0, int(starttime + config['agenda_countdown_time'] - time())) + return (name, seconds) return None diff --git a/openslides/projector/signals.py b/openslides/projector/signals.py index 5dbd32ef8..1bd2cd60b 100644 --- a/openslides/projector/signals.py +++ b/openslides/projector/signals.py @@ -12,4 +12,4 @@ from django.dispatch import Signal -projector_messages = Signal() +projector_messages = Signal(providing_args=['register', 'call']) diff --git a/openslides/projector/templates/base-projector.html b/openslides/projector/templates/base-projector.html index f2d909b9e..d263bc119 100644 --- a/openslides/projector/templates/base-projector.html +++ b/openslides/projector/templates/base-projector.html @@ -32,7 +32,7 @@
diff --git a/openslides/projector/templates/projector/base_projector.html b/openslides/projector/templates/projector/base_projector.html index b8169ef54..0cc9ff028 100644 --- a/openslides/projector/templates/projector/base_projector.html +++ b/openslides/projector/templates/projector/base_projector.html @@ -12,12 +12,19 @@ {% endblock %} diff --git a/openslides/projector/templates/projector/messages.html b/openslides/projector/templates/projector/messages.html new file mode 100644 index 000000000..bb02e0102 --- /dev/null +++ b/openslides/projector/templates/projector/messages.html @@ -0,0 +1,24 @@ +{% extends "projector/base_projector.html" %} + +{% load tags %} +{% load i18n %} + +{% block content %} +

{% trans 'Messages' %}

+
{% csrf_token %} + + + + +
+{% endblock %} diff --git a/openslides/projector/urls.py b/openslides/projector/urls.py index 0138ede2a..d08962745 100644 --- a/openslides/projector/urls.py +++ b/openslides/projector/urls.py @@ -14,7 +14,7 @@ from django.conf.urls.defaults import * from utils.views import CreateView -from views import ControlView, ActivateView +from views import ControlView, ActivateView, MessagesView from agenda.views import ItemUpdate from models import ProjectorSlide @@ -54,6 +54,11 @@ urlpatterns = patterns('projector.views', name='projector_new', ), + url(r'^messages/$', + MessagesView.as_view(), + name='projector_messages', + ), + url(r'^bigger/$', 'projector_edit', {'direction': 'bigger'}, name='projector_bigger'), diff --git a/openslides/projector/views.py b/openslides/projector/views.py index 065bc9a8e..e9bdd48d2 100644 --- a/openslides/projector/views.py +++ b/openslides/projector/views.py @@ -10,6 +10,7 @@ :license: GNU GPL, see LICENSE for more details. """ from datetime import datetime +from time import time from django.shortcuts import render_to_response, redirect from django.template import RequestContext @@ -28,6 +29,7 @@ from system import config from api import get_active_slide, set_active_slide from projector import SLIDE +from models import ProjectorMessage from openslides.projector.signals import projector_messages @@ -80,7 +82,8 @@ def active_slide(request): data['ajax'] = 'on' data['messages'] = [] - for receiver, response in projector_messages.send(sender='active_slide'): + active_defs = ProjectorMessage.objects.filter(active=True).values_list('def_name', flat=True) + for receiver, response in projector_messages.send(sender='active_slide', register=False, call=active_defs): if response is not None: data['messages'].append(response) @@ -89,6 +92,7 @@ def active_slide(request): content = render_block_to_string(data['template'], 'content', data) jsondata = { 'content': content, + 'messages': data['messages'], 'title': data['title'], 'time': datetime.now().strftime('%H:%M'), 'bigger': config['bigger'], @@ -106,6 +110,39 @@ def active_slide(request): ) +class MessagesView(TemplateView): + permission_required = 'projector.can_manage_projector' + template_name = 'projector/messages.html' + + def get_projector_messages(self): + messages = [] + for receiver, name in projector_messages.send(sender='registerer', register=True): + if name is not None: + try: + projector_message = ProjectorMessage.objects.get(def_name=name) + except ProjectorMessage.DoesNotExist: + projector_message = ProjectorMessage(def_name=name, active=False) + projector_message.save() + messages.append(projector_message) + return messages + + def post(self, request, *args, **kwargs): + for message in self.get_projector_messages(): + if message.def_name in request.POST: + message.active = True + else: + message.active = False + message.save() + + return self.get(request, *args, **kwargs) + + + def get_context_data(self, **kwargs): + context = super(MessagesView, self).get_context_data(**kwargs) + context['projector_messages'] = self.get_projector_messages() + return context + + @permission_required('agenda.can_manage_agenda') def projector_edit(request, direction): if direction == 'bigger': @@ -126,14 +163,14 @@ def projector_edit(request, direction): @permission_required('projector.can_manage_projector') -def projector_countdown(request, command, time=60): +def projector_countdown(request, command): #todo: why is there the time argument? if command == 'show': config['countdown_visible'] = True elif command == 'hide': config['countdown_visible'] = False elif command == 'reset': - config['countdown_start'] = datetime.now() + config['countdown_start'] = time() elif command == 'start': config['countdown_run'] = True elif command == 'stop': diff --git a/openslides/static/javascript/projector.js b/openslides/static/javascript/projector.js index 2692baadd..e8a23f6c6 100644 --- a/openslides/static/javascript/projector.js +++ b/openslides/static/javascript/projector.js @@ -6,6 +6,7 @@ function presentation_reload() { dataType: 'json', data: '', success: function(data) { + $('#currentTime').removeClass('ajax_error'); $('#content').html(data.content); document.title = data.title; $('#currentTime').html(data.time); @@ -14,24 +15,27 @@ function presentation_reload() { $('#content li').css({'font-size': data.bigger + '%'}, 200); $('#content #sidebar').css({'font-size': '16px'}, 0); $('#content').animate({'margin-top': data.up + 'em'}, 200); - /*TODO: messages neu schreiben*/ + /* + * Gehe durch alle messages li durch. Wenn der Wert in der data steht, lasse es, + * ansonsten füge ein neues li ein und lösche es aus der data weg. + * Alles was jetzt noch in der data ist, muss als neues li eingefügt werden. + */ - if (data.countdown_visible == true) - $('#countdown').slideDown(); - if (data.countdown_visible == false) - $('#countdown').slideUp(); - if (data.countdown_control == "reset") - resetTimer(data.countdown_time); - if (data.countdown_control == 'start') { - if (!timer_is_running) - startTimer(); - } - if (data.countdown_control == 'stop') - stopTimer(); + //# $.each($('#messages li'), function (index, value) { + //# message_id = value.attr('id').split('_')[1]; + //# if (message_id in data) { + //# this.html(data[message_id]); + //# } + //# }); + $('#messages li').remove(); + $.each(data['messages'], function (index, value){ + $('#messages ul').append('
  • ' + value[1] + '
  • '); + }); setTimeout("presentation_reload()", 500); }, error: function () { $('#currentTime').addClass('ajax_error'); + setTimeout("presentation_reload()", 1000); } }); } diff --git a/openslides/system/models.py b/openslides/system/models.py index a2daec439..346a72c64 100644 --- a/openslides/system/models.py +++ b/openslides/system/models.py @@ -73,7 +73,11 @@ class Config(object): c = ConfigStore(pk=key) c.value = base64.encodestring(dumps(value)) c.save() - self.config[key] = value + try: + self.config[key] = value + except AttributeError: + self.load_config() + self.config[key] = value from django.dispatch import receiver from django.core.urlresolvers import reverse