OpenSlides/openslides/projector/api.py

176 lines
4.5 KiB
Python
Raw Normal View History

2012-04-25 22:29:19 +02:00
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
openslides.projector.api
~~~~~~~~~~~~~~~~~~~~~~~~
Useful functions for the projector app.
:copyright: 2011, 2012 by OpenSlides team, see AUTHORS.
:license: GNU GPL, see LICENSE for more details.
"""
2012-08-15 13:42:25 +02:00
from django.conf import settings
from django.core.cache import cache
2012-04-14 20:10:49 +02:00
from django.template.loader import render_to_string
2012-08-15 13:42:25 +02:00
from django.utils.datastructures import SortedDict
from django.utils.importlib import import_module
from openslides.config.models import config
from openslides.projector.projector import SLIDE, Slide, Widget
2012-06-11 13:43:48 +02:00
def split_sid(sid):
2012-07-07 14:01:40 +02:00
"""
Slit a SID in the model-part and in the model-id
"""
2012-04-17 12:07:32 +02:00
try:
data = sid.split('-')
except AttributeError:
return None
2012-02-09 01:46:58 +01:00
if len(data) == 2:
model = data[0]
id = data[1]
return (model, id)
2012-02-09 01:46:58 +01:00
if len(data) == 1:
try:
2012-04-18 15:47:51 +02:00
return (SLIDE[data[0]].key, None)
2012-02-09 01:46:58 +01:00
except KeyError:
return None
return None
def get_slide_from_sid(sid, element=False):
2012-07-07 14:01:40 +02:00
"""
Return the Slide for an given sid.
If element== False, return the slide-dict,
else, return the object.
"""
2012-04-17 12:07:32 +02:00
try:
key, id = split_sid(sid)
except TypeError:
return None
if id is not None:
try:
object = SLIDE[key].model.objects.get(pk=id)
except SLIDE[key].model.DoesNotExist:
return None
if element:
return object
return object.slide()
try:
return SLIDE[key].func()
except KeyError:
return None
2012-02-06 22:22:16 +01:00
def get_active_slide(only_sid=False):
"""
2012-02-06 22:22:16 +01:00
Returns the active slide. If no slide is active, or it can not find an Item,
2012-07-07 14:01:40 +02:00
return None
2012-07-07 14:01:40 +02:00
if only_sid is True, returns only the id of this item. Returns None if not
Item is active.
"""
2012-02-15 12:04:11 +01:00
sid = config["presentation"]
2012-02-06 22:22:16 +01:00
if only_sid:
return sid
return get_slide_from_sid(sid)
def set_active_slide(sid, argument=None):
2012-07-07 14:01:40 +02:00
"""
Set the active Slide.
"""
2012-02-15 12:04:11 +01:00
config["presentation"] = sid
config['presentation_argument'] = argument
cache.delete('projector_content')
cache.delete('projector_scrollcontent')
2012-02-09 02:29:38 +01:00
2012-07-07 14:01:40 +02:00
def register_slidemodel(model, model_name=None, control_template=None,
weight=0):
"""
Register a Model as a slide.
"""
if model_name is None:
model_name = model.prefix
2012-04-14 11:18:47 +02:00
2012-04-14 20:10:49 +02:00
if control_template is None:
control_template = 'projector/default_control_slidemodel.html'
2012-04-14 11:18:47 +02:00
category = model.__module__.split('.')[0]
2012-04-14 20:10:49 +02:00
SLIDE[model_name] = Slide(
2012-03-03 09:11:56 +01:00
model_slide=True,
model=model,
category=category,
key=model.prefix,
2012-03-03 11:16:10 +01:00
model_name=model_name,
2012-04-14 20:10:49 +02:00
control_template=control_template,
weight=weight,
2012-03-03 09:11:56 +01:00
)
2012-04-15 15:46:32 +02:00
def register_slidefunc(key, func, control_template=None, weight=0, name=''):
2012-07-07 14:01:40 +02:00
"""
Register a function for as a slide.
"""
2012-04-14 20:10:49 +02:00
if control_template is None:
control_template = 'projector/default_control_slidefunc.html'
2012-04-14 11:18:47 +02:00
category = func.__module__.split('.')[0]
2012-03-03 09:11:56 +01:00
SLIDE[key] = Slide(
model_slide=False,
func=func,
category=category,
key=key,
2012-04-14 20:10:49 +02:00
control_template=control_template,
weight=weight,
2012-04-15 15:46:32 +02:00
name=name,
2012-03-03 09:11:56 +01:00
)
def projector_message_set(message, sid=None):
2012-07-07 14:01:40 +02:00
"""
Set the overlay-message.
if sid is set, only show the message on the sid-slide.
"""
from models import ProjectorOverlay
config['projector_message'] = message
try:
overlay = ProjectorOverlay.objects.get(def_name='Message')
except ProjectorOverlay.DoesNotExist:
overlay = ProjectorOverlay(def_name='Message', active=False)
overlay.sid=sid
overlay.save()
def projector_message_delete():
2012-07-07 14:01:40 +02:00
"""
Delete the overlay-message.
"""
config['projector_message'] = ''
2012-08-15 13:42:25 +02:00
def get_all_widgets(request, session=False):
widgets = SortedDict()
session_widgets = request.session.get('widgets', {})
for app in settings.INSTALLED_APPS:
try:
mod = import_module(app + '.views')
except ImportError:
continue
appname = mod.__name__.split('.')[0]
try:
modul_widgets = mod.get_widgets(request)
except AttributeError:
continue
for widget in modul_widgets:
if (widget.permission_required is None or
request.user.has_perm(widget.permission_required)):
if not session or session_widgets.get(widget.get_name(), True):
widgets[widget.get_name()] = widget
return widgets