OpenSlides/openslides/projector/signals.py

151 lines
4.6 KiB
Python
Raw Normal View History

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
openslides.projector.signals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Signals for the projector app.
:copyright: 20112013 by OpenSlides team, see AUTHORS.
:license: GNU GPL, see LICENSE for more details.
"""
2013-04-15 10:40:47 +02:00
from time import time
from django.dispatch import Signal, receiver
from django import forms
2013-04-15 10:40:47 +02:00
from django.template.loader import render_to_string
from django.core.context_processors import csrf
2013-04-15 10:40:47 +02:00
from openslides.config.api import config
from openslides.config.signals import config_signal
from openslides.config.api import ConfigVariable, ConfigPage
2013-04-15 10:40:47 +02:00
from .projector import Overlay
from .api import clear_projector_cache
2013-04-15 10:40:47 +02:00
projector_overlays = Signal(providing_args=['request'])
@receiver(config_signal, dispatch_uid='setup_projector_config_variables')
def setup_projector_config_variables(sender, **kwargs):
"""
Projector config variables for OpenSlides. They are not shown on a
config page.
"""
presentation = ConfigVariable(
name='presentation',
default_value='')
presentation_argument = ConfigVariable(
name='presentation_argument',
default_value=None)
projector_message = ConfigVariable(
name='projector_message',
default_value='')
countdown_time = ConfigVariable(
name='countdown_time',
default_value=60)
countdown_start_stamp = ConfigVariable(
name='countdown_start_stamp',
default_value=0)
countdown_pause_stamp = ConfigVariable(
name='countdown_pause_stamp',
default_value=0)
countdown_state = ConfigVariable(
name='countdown_state',
default_value='inactive')
bigger = ConfigVariable(
name='bigger',
default_value=100)
up = ConfigVariable(
name='up',
default_value=0)
2013-04-15 10:40:47 +02:00
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):
"""
2013-03-18 12:34:47 +01:00
Receiver for the countdown.
2013-04-15 10:40:47 +02:00
"""
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'
clear_projector_cache()
2013-04-15 10:40:47 +02:00
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)