5ad3085551
Add default sorting of widgets. Fix #493
181 lines
5.1 KiB
Python
181 lines
5.1 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
openslides.projector.projector
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Slide functions for the projector app.
|
|
|
|
:copyright: 2011, 2012 by OpenSlides team, see AUTHORS.
|
|
:license: GNU GPL, see LICENSE for more details.
|
|
"""
|
|
|
|
from time import time
|
|
|
|
from django.dispatch import receiver
|
|
from django.template.loader import render_to_string
|
|
|
|
from openslides.config.api import config
|
|
from django.template import RequestContext
|
|
from openslides.utils.exceptions import OpenSlidesError
|
|
|
|
|
|
SLIDE = {}
|
|
|
|
|
|
class SlideMixin(object):
|
|
"""
|
|
A Mixin for a Django-Model, for making the model a slide.
|
|
"""
|
|
|
|
def slide(self):
|
|
"""
|
|
Return a map with all Data for the Slide.
|
|
"""
|
|
return {
|
|
'slide': self,
|
|
'title': 'dummy-title',
|
|
'template': 'projector/default.html',
|
|
}
|
|
|
|
@property
|
|
def sid(self):
|
|
"""
|
|
Return the sid from this Slide
|
|
"""
|
|
return "%s-%d" % (self.prefix, self.id)
|
|
|
|
@property
|
|
def active(self):
|
|
"""
|
|
Return True, if the the slide is the active slide.
|
|
"""
|
|
if self.id is None:
|
|
return False
|
|
from openslides.projector.api import get_active_slide
|
|
return get_active_slide(only_sid=True) == self.sid
|
|
|
|
def set_active(self):
|
|
"""
|
|
Appoint this item as the active slide.
|
|
"""
|
|
from openslides.projector.api import set_active_slide
|
|
set_active_slide(self.sid)
|
|
|
|
def save(self, *args, **kwargs):
|
|
if self.active:
|
|
from api import clear_projector_cache
|
|
clear_projector_cache()
|
|
return super(SlideMixin, self).save(*args, **kwargs)
|
|
|
|
|
|
class Slide(object):
|
|
"""
|
|
Represents a Slide for the projector. Can be a modelinstanz, or a function.
|
|
"""
|
|
def __init__(self, model_slide=False, func=None, model=None, category=None,
|
|
key=None, model_name='', control_template='', weight=0, name=''):
|
|
"""
|
|
model_slide: Boolean if the value is a Model.
|
|
func: The function to call. Only if modelslide is False.
|
|
model: The model. Only if modelslide is True.
|
|
model_name: The name shown for the model.
|
|
category: The category to show this Slide.
|
|
key: the key in the slide object to find itself.
|
|
"""
|
|
self.model_slide = model_slide
|
|
self.func = func
|
|
self.model = model
|
|
self.model_name = model_name
|
|
self.category = category
|
|
self.key = key
|
|
self.control_template = control_template
|
|
self.weight = weight
|
|
self.name = name
|
|
|
|
@property
|
|
def active(self):
|
|
"""
|
|
Return True if the Slide is active, else: False.
|
|
"""
|
|
from api import get_active_slide
|
|
return get_active_slide(True) == self.key
|
|
|
|
def get_items(self):
|
|
"""
|
|
If the Slide is a Slide from a Model, return all Objects.
|
|
"""
|
|
try:
|
|
return self.model.objects.all()
|
|
except AttributeError:
|
|
return 'No Model'
|
|
|
|
|
|
class Widget(object):
|
|
"""
|
|
Class for a Widget for the Projector-Tab.
|
|
"""
|
|
def __init__(self, request, name, html=None, template=None, context={},
|
|
permission_required=None, display_name=None, default_column=1,
|
|
default_weight=0):
|
|
self.name = name
|
|
if display_name is None:
|
|
self.display_name = name.capitalize()
|
|
else:
|
|
self.display_name = display_name
|
|
|
|
if html is not None:
|
|
self.html = html
|
|
elif template is not None:
|
|
self.html = render_to_string(
|
|
template_name=template,
|
|
dictionary=context,
|
|
context_instance=RequestContext(request))
|
|
else:
|
|
raise OpenSlidesError('A Widget must have either a html or a template argument.')
|
|
self.permission_required = permission_required
|
|
self.default_column = default_column
|
|
self.default_weight = default_weight
|
|
|
|
def get_name(self):
|
|
return self.name.lower()
|
|
|
|
def get_html(self):
|
|
return self.html
|
|
|
|
def get_title(self):
|
|
return self.display_name
|
|
|
|
def __repr__(self):
|
|
return repr(self.display_name)
|
|
|
|
def __unicode__(self):
|
|
return unicode(self.display_name)
|
|
|
|
|
|
class Overlay(object):
|
|
"""
|
|
Represents an overlay which can be seen on the projector.
|
|
"""
|
|
|
|
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
|
|
|
|
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()
|
|
|
|
def is_active(self):
|
|
return self.name in config['projector_active_overlays']
|
|
|
|
def show_on_projector(self):
|
|
return self.is_active() and self.get_projector_html() is not None
|