rewrote message api and countdown

This commit is contained in:
Oskar Hahn 2012-04-14 09:47:34 +02:00
parent d870b988e9
commit 0de8228537
9 changed files with 104 additions and 17 deletions

View File

@ -23,5 +23,14 @@ class ProjectorSlide(models.Model, SlideMixin):
('can_see_projector', "Can see projector"), ('can_see_projector', "Can see projector"),
) )
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')) register_slidemodel(ProjectorSlide, category=_('Projector'), model_name=_('Projector Slide'))

View File

@ -1,6 +1,7 @@
from datetime import datetime from time import time
from django.dispatch import receiver from django.dispatch import receiver
from django.utils.translation import ugettext as _
from system import config from system import config
@ -69,11 +70,11 @@ class Slide(object):
@receiver(projector_messages, dispatch_uid="projector_countdown") @receiver(projector_messages, dispatch_uid="projector_countdown")
def countdown(sender, **kwargs): 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'] starttime = config['countdown_start']
if type(starttime) != type(datetime.now()): seconds = max(0, int(starttime + config['agenda_countdown_time'] - time()))
config['countdown_start'] = datetime.now() return (name, seconds)
starttime = config['countdown_start']
#todo: return the time passt sinth starttime
return datetime.now() - starttime
return None return None

View File

@ -12,4 +12,4 @@
from django.dispatch import Signal from django.dispatch import Signal
projector_messages = Signal() projector_messages = Signal(providing_args=['register', 'call'])

View File

@ -32,7 +32,7 @@
<div id="messages"> <div id="messages">
<ul> <ul>
{% for message in messages %} {% for message in messages %}
<li>{{ message }}</li> <li id="message_{{ message.0 }}">{{ message.1 }}</li>
{% endfor %} {% endfor %}
</ul> </ul>
</div> </div>

View File

@ -12,12 +12,19 @@
<ul> <ul>
{% if perms.projector.can_manage_projector %} {% if perms.projector.can_manage_projector %}
<li class="{% if request.path == url_projectoroverview %}selected{% endif %}"> <li class="{% if request.path == url_projectoroverview %}selected{% endif %}">
<a href="{% url projector_control %}">{% trans 'Overview' %}</a></li> <a href="{% url projector_control %}">{% trans 'Overview' %}</a>
</li>
<li class="{% if request.path == projector_messages %}selected{% endif %}">
<a href="{% url projector_messages %}">{% trans 'Messages' %}</a>
</li>
{% endif %} {% endif %}
{% if perms.projector.can_see_projector %} {% if perms.projector.can_see_projector %}
<li class="{% if request.path == url_projectornew %}selected{% endif %}"> <li class="{% if request.path == url_projectornew %}selected{% endif %}">
<a href="{% url projector_new %}">{% trans 'New Slide' %}</a></li> <a href="{% url projector_new %}">{% trans 'New Slide' %}</a>
<li><a href="{% url projector_show %}"><img src="/static/images/icons/video-projector.png"> {% trans 'Projector view' %}</a></li> </li>
<li>
<a href="{% url projector_show %}"><img src="/static/images/icons/video-projector.png"> {% trans 'Projector view' %}</a>
</li>
{% endif %} {% endif %}
</ul> </ul>
{% endblock %} {% endblock %}

View File

@ -0,0 +1,24 @@
{% extends "projector/base_projector.html" %}
{% load tags %}
{% load i18n %}
{% block content %}
<h1>{% trans 'Messages' %}</h1>
<form action="" method="post">{% csrf_token %}
<ul>
{% for message in projector_messages %}
<li><input type="checkbox" name="{{ message }}"{% if message.active %} checked="checked"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
<button class="button" type="submit">
<span class="icon ok">{%trans 'Save' %}</span>
</button>
<button class="button" type="submit" name="apply">
<span class="icon apply">{%trans 'Apply' %}</span>
</button>
<button class="button" type="button" onclick="window.location='{% url projector_messages %}'">
<span class="icon cancel">{%trans 'Cancel' %}</span>
</button>
</form>
{% endblock %}

View File

@ -14,7 +14,7 @@ from django.conf.urls.defaults import *
from utils.views import CreateView from utils.views import CreateView
from views import ControlView, ActivateView from views import ControlView, ActivateView, MessagesView
from agenda.views import ItemUpdate from agenda.views import ItemUpdate
from models import ProjectorSlide from models import ProjectorSlide
@ -54,6 +54,11 @@ urlpatterns = patterns('projector.views',
name='projector_new', name='projector_new',
), ),
url(r'^messages/$',
MessagesView.as_view(),
name='projector_messages',
),
url(r'^bigger/$', 'projector_edit', {'direction': 'bigger'}, url(r'^bigger/$', 'projector_edit', {'direction': 'bigger'},
name='projector_bigger'), name='projector_bigger'),

View File

@ -10,6 +10,7 @@
:license: GNU GPL, see LICENSE for more details. :license: GNU GPL, see LICENSE for more details.
""" """
from datetime import datetime from datetime import datetime
from time import time
from django.shortcuts import render_to_response, redirect from django.shortcuts import render_to_response, redirect
from django.template import RequestContext from django.template import RequestContext
@ -28,6 +29,7 @@ from system import config
from api import get_active_slide, set_active_slide from api import get_active_slide, set_active_slide
from projector import SLIDE from projector import SLIDE
from models import ProjectorMessage
from openslides.projector.signals import projector_messages from openslides.projector.signals import projector_messages
@ -80,7 +82,8 @@ def active_slide(request):
data['ajax'] = 'on' data['ajax'] = 'on'
data['messages'] = [] 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: if response is not None:
data['messages'].append(response) data['messages'].append(response)
@ -89,6 +92,7 @@ def active_slide(request):
content = render_block_to_string(data['template'], 'content', data) content = render_block_to_string(data['template'], 'content', data)
jsondata = { jsondata = {
'content': content, 'content': content,
'messages': data['messages'],
'title': data['title'], 'title': data['title'],
'time': datetime.now().strftime('%H:%M'), 'time': datetime.now().strftime('%H:%M'),
'bigger': config['bigger'], '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') @permission_required('agenda.can_manage_agenda')
def projector_edit(request, direction): def projector_edit(request, direction):
if direction == 'bigger': if direction == 'bigger':
@ -126,14 +163,14 @@ def projector_edit(request, direction):
@permission_required('projector.can_manage_projector') @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? #todo: why is there the time argument?
if command == 'show': if command == 'show':
config['countdown_visible'] = True config['countdown_visible'] = True
elif command == 'hide': elif command == 'hide':
config['countdown_visible'] = False config['countdown_visible'] = False
elif command == 'reset': elif command == 'reset':
config['countdown_start'] = datetime.now() config['countdown_start'] = time()
elif command == 'start': elif command == 'start':
config['countdown_run'] = True config['countdown_run'] = True
elif command == 'stop': elif command == 'stop':

View File

@ -73,6 +73,10 @@ class Config(object):
c = ConfigStore(pk=key) c = ConfigStore(pk=key)
c.value = base64.encodestring(dumps(value)) c.value = base64.encodestring(dumps(value))
c.save() c.save()
try:
self.config[key] = value
except AttributeError:
self.load_config()
self.config[key] = value self.config[key] = value
from django.dispatch import receiver from django.dispatch import receiver