Automated merge with ssh://openslides.de/openslides

This commit is contained in:
Oskar Hahn 2012-04-14 09:47:41 +02:00
commit e8337278a1
10 changed files with 121 additions and 30 deletions

View File

@ -22,5 +22,14 @@ class ProjectorSlide(models.Model, SlideMixin):
('can_see_projector', _("Can see projector", fixstr=True)), ('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')) 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

@ -6,6 +6,7 @@ function presentation_reload() {
dataType: 'json', dataType: 'json',
data: '', data: '',
success: function(data) { success: function(data) {
$('#currentTime').removeClass('ajax_error');
$('#content').html(data.content); $('#content').html(data.content);
document.title = data.title; document.title = data.title;
$('#currentTime').html(data.time); $('#currentTime').html(data.time);
@ -14,24 +15,27 @@ function presentation_reload() {
$('#content li').css({'font-size': data.bigger + '%'}, 200); $('#content li').css({'font-size': data.bigger + '%'}, 200);
$('#content #sidebar').css({'font-size': '16px'}, 0); $('#content #sidebar').css({'font-size': '16px'}, 0);
$('#content').animate({'margin-top': data.up + 'em'}, 200); $('#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) //# $.each($('#messages li'), function (index, value) {
$('#countdown').slideDown(); //# message_id = value.attr('id').split('_')[1];
if (data.countdown_visible == false) //# if (message_id in data) {
$('#countdown').slideUp(); //# this.html(data[message_id]);
if (data.countdown_control == "reset") //# }
resetTimer(data.countdown_time); //# });
if (data.countdown_control == 'start') { $('#messages li').remove();
if (!timer_is_running) $.each(data['messages'], function (index, value){
startTimer(); $('#messages ul').append('<li>' + value[1] + '</li>');
} });
if (data.countdown_control == 'stop')
stopTimer();
setTimeout("presentation_reload()", 500); setTimeout("presentation_reload()", 500);
}, },
error: function () { error: function () {
$('#currentTime').addClass('ajax_error'); $('#currentTime').addClass('ajax_error');
setTimeout("presentation_reload()", 1000);
} }
}); });
} }

View File

@ -73,7 +73,11 @@ 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()
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.dispatch import receiver
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse