Move projector.models.ProjectorSlide to core.models.CustomSlide
This commit is contained in:
parent
5ddadbab6a
commit
2392c1ab36
3
fabfile.py
vendored
3
fabfile.py
vendored
@ -43,8 +43,7 @@ def check():
|
||||
"""
|
||||
Checks for PEP 8 errors in openslides and in tests.
|
||||
"""
|
||||
local('flake8 --max-line-length=150 --statistics openslides')
|
||||
local('flake8 --max-line-length=150 --statistics tests')
|
||||
local('flake8 --max-line-length=150 --statistics openslides tests')
|
||||
|
||||
|
||||
def prepare_commit():
|
||||
|
@ -2,10 +2,10 @@
|
||||
{% load tags %}
|
||||
|
||||
<div class="{% if node.is_active_slide %}activeline{% endif %}">
|
||||
{% if perms.agenda.can_manage_agenda or perms.projector.can_manage_projector %}
|
||||
{% if perms.agenda.can_manage_agenda or perms.core.can_manage_projector %}
|
||||
<div class="manage">
|
||||
<span style="width: 1px; white-space: nowrap;">
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ node|absolute_url:'projector' }}"
|
||||
class="activate_link btn {% if node.is_active_slide and active_type == 'text' %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show agenda item' %}">
|
||||
|
@ -79,7 +79,7 @@
|
||||
{% if perms.agenda.can_see_orga_items %}
|
||||
<th class="duration">{% trans "Duration" %}</th>
|
||||
{% endif %}
|
||||
{% if perms.agenda.can_manage_agenda or perms.projector.can_manage_projector %}
|
||||
{% if perms.agenda.can_manage_agenda or perms.core.can_manage_projector %}
|
||||
<th class="manage">{% trans "Actions" %}</th>
|
||||
{% endif %}
|
||||
</tr>
|
||||
@ -93,9 +93,9 @@
|
||||
{% if perms.agenda.can_see_orga_items %}
|
||||
<td class="duration">{{ duration }} h</td>
|
||||
{% endif %}
|
||||
{% if perms.agenda.can_manage_agenda or perms.projector.can_manage_projector %}
|
||||
{% if perms.agenda.can_manage_agenda or perms.core.can_manage_projector %}
|
||||
<td class="manage">
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<span>
|
||||
<a href="{% url 'projector_activate_slide' 'agenda' %}"
|
||||
class="activate_link btn {% if agenda_is_active %}btn-primary{% endif %} btn-mini"
|
||||
|
@ -21,7 +21,7 @@
|
||||
{{ item }}
|
||||
<small class="pull-right">
|
||||
<a href="{% url 'item_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ item|absolute_url:'projector' }}"
|
||||
class="activate_link btn btn-mini {% if item.is_active_slide and active_type != 'list_of_speakers' %}btn-primary{% endif %}"
|
||||
rel="tooltip" data-original-title="{% trans 'Show item' %}">
|
||||
@ -67,7 +67,7 @@
|
||||
<a href="{% url 'agenda_speaker_close' item.pk %}" class="btn btn-mini btn-danger">{% trans 'Close list' %}</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ item|absolute_url:'projector_list_of_speakers' }}"
|
||||
class="activate_link btn btn-mini {% if item.is_active_slide and active_type == 'list_of_speakers' %}btn-primary{% endif %}"
|
||||
rel="tooltip" data-original-title="{% trans 'Show list of speakers' %}">
|
||||
|
@ -14,7 +14,7 @@ class AgendaWidget(Widget):
|
||||
"""
|
||||
name = 'agenda'
|
||||
verbose_name = ugettext_lazy('Agenda')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 1
|
||||
default_weight = 20
|
||||
template_name = 'agenda/widget_item.html'
|
||||
|
@ -22,7 +22,7 @@
|
||||
<a href="{% url 'assignment_list' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
|
||||
<a href="{% url 'assignment_pdf' assignment.id %}" class="btn btn-mini" rel="tooltip" data-original-title="{% trans 'Print election as PDF' %}" target="_blank"><i class="icon-print"></i> PDF</a>
|
||||
<!-- activate projector -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ assignment|absolute_url:'projector' }}"
|
||||
class="activate_link btn {% if assignment.is_active_slide %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show election' %}">
|
||||
|
@ -53,7 +53,7 @@
|
||||
<td><span class="label label-info">{{ object.get_status_display }}</status></td>
|
||||
<td>
|
||||
<span style="width: 1px; white-space: nowrap;">
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ object|absolute_url:'projector' }}"
|
||||
class="activate_link btn {% if object.is_active_slide %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show election' %}">
|
||||
|
@ -15,7 +15,7 @@
|
||||
<small class="pull-right">
|
||||
<a href="{{ assignment|absolute_url:'detail' }}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to election" %}</a>
|
||||
<!-- activate projector -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ assignment|absolute_url:'projector' }}"
|
||||
class="activate_link btn {% if assignment.is_active_slide %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show election' %}">
|
||||
|
@ -13,7 +13,7 @@ class AssignmentWidget(Widget):
|
||||
"""
|
||||
name = 'assignment'
|
||||
verbose_name = ugettext_lazy('Elections')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 1
|
||||
default_weight = 50
|
||||
template_name = 'assignment/widget_assignment.html'
|
||||
|
@ -1,3 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import main_menu, signals, widgets # noqa
|
||||
from . import main_menu, signals, slides, widgets # noqa
|
||||
|
@ -10,7 +10,7 @@ class DashboardMainMenuEntry(MainMenuEntry):
|
||||
Main menu entry to the dashboard.
|
||||
"""
|
||||
verbose_name = ugettext_lazy('Dashboard')
|
||||
permission_required = 'projector.can_see_dashboard'
|
||||
permission_required = 'core.can_see_dashboard'
|
||||
default_weight = 10
|
||||
icon_css_class = 'icon-home'
|
||||
pattern_name = 'core_dashboard'
|
||||
|
@ -0,0 +1,39 @@
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy, ugettext_noop
|
||||
|
||||
from openslides.utils.models import AbsoluteUrlMixin
|
||||
from openslides.projector.models import SlideMixin
|
||||
|
||||
|
||||
class CustomSlide(SlideMixin, AbsoluteUrlMixin, models.Model):
|
||||
"""
|
||||
Model for Slides, only for the projector.
|
||||
"""
|
||||
slide_callback_name = 'customslide'
|
||||
|
||||
title = models.CharField(max_length=256, verbose_name=ugettext_lazy('Title'))
|
||||
text = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy('Text'))
|
||||
weight = models.IntegerField(default=0, verbose_name=ugettext_lazy('Weight'))
|
||||
|
||||
class Meta:
|
||||
"""
|
||||
General permissions that can not be placed at a specific app.
|
||||
"""
|
||||
permissions = (
|
||||
('can_manage_projector', ugettext_noop('Can manage the projector')),
|
||||
('can_see_projector', ugettext_noop('Can see the projector')),
|
||||
('can_see_dashboard', ugettext_noop('Can see the dashboard')),
|
||||
)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title
|
||||
|
||||
def get_absolute_url(self, link='update'):
|
||||
if link == 'update':
|
||||
url = reverse('customslide_update', args=[str(self.pk)])
|
||||
elif link == 'delete':
|
||||
url = reverse('customslide_delete', args=[str(self.pk)])
|
||||
else:
|
||||
url = super(CustomSlide, self).get_absolute_url(link)
|
||||
return url
|
7
openslides/core/slides.py
Normal file
7
openslides/core/slides.py
Normal file
@ -0,0 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from openslides.projector.api import register_slide_model
|
||||
|
||||
from .models import CustomSlide
|
||||
|
||||
register_slide_model(CustomSlide, 'core/customslide_slide.html')
|
@ -43,7 +43,7 @@
|
||||
<li>{% trans 'No items available.' %}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<a href="{% url 'customslide_new' %}" class="btn btn-mini right" style="margin: 10px 0;">
|
||||
<a href="{% url 'customslide_create' %}" class="btn btn-mini right" style="margin: 10px 0;">
|
||||
<i class="icon-plus"></i>{% trans 'New' %}
|
||||
</a>
|
||||
{% endblock %}
|
@ -27,4 +27,18 @@ urlpatterns = patterns(
|
||||
|
||||
url(r'^search/$',
|
||||
views.SearchView(),
|
||||
name='core_search',))
|
||||
name='core_search',),
|
||||
|
||||
# CustomSlide urls
|
||||
url(r'^customslide/new/$',
|
||||
views.CustomSlideCreateView.as_view(),
|
||||
name='customslide_create'),
|
||||
|
||||
url(r'^customslide/(?P<pk>\d+)/edit/$',
|
||||
views.CustomSlideUpdateView.as_view(),
|
||||
name='customslide_update'),
|
||||
|
||||
url(r'^customslide/(?P<pk>\d+)/del/$',
|
||||
views.CustomSlideDeleteView.as_view(),
|
||||
name='customslide_delete'),
|
||||
)
|
||||
|
@ -15,19 +15,20 @@ from openslides import get_git_commit_id, RELEASE
|
||||
from openslides.config.api import config
|
||||
from openslides.utils.plugins import get_plugin_description, get_plugin_verbose_name, get_plugin_version
|
||||
from openslides.utils.signals import template_manipulation
|
||||
from openslides.utils.views import AjaxMixin, TemplateView, View
|
||||
from openslides.utils import views as utils_views
|
||||
from openslides.utils.widgets import Widget
|
||||
|
||||
from .forms import SelectWidgetsForm
|
||||
from .models import CustomSlide
|
||||
|
||||
|
||||
class DashboardView(AjaxMixin, TemplateView):
|
||||
class DashboardView(utils_views.AjaxMixin, utils_views.TemplateView):
|
||||
"""
|
||||
Overview over all possible slides, the overlays and a live view: the
|
||||
Dashboard of OpenSlides. This main view uses the widget api to collect all
|
||||
widgets from all apps. See openslides.utils.widgets.Widget for more details.
|
||||
"""
|
||||
permission_required = 'projector.can_see_dashboard' # TODO: Rename this to core.can_see_dashboard
|
||||
permission_required = 'core.can_see_dashboard'
|
||||
template_name = 'core/dashboard.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@ -42,13 +43,13 @@ class DashboardView(AjaxMixin, TemplateView):
|
||||
return context
|
||||
|
||||
|
||||
class SelectWidgetsView(TemplateView):
|
||||
class SelectWidgetsView(utils_views.TemplateView):
|
||||
"""
|
||||
Shows a form to select which widgets should be displayed on the own
|
||||
dashboard. The setting is saved in the session.
|
||||
"""
|
||||
# TODO: Use another base view class here, e. g. a FormView
|
||||
permission_required = 'projector.can_see_dashboard' # TODO: Rename this to core.can_see_dashboard
|
||||
permission_required = 'core.can_see_dashboard'
|
||||
template_name = 'core/select_widgets.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@ -84,7 +85,7 @@ class SelectWidgetsView(TemplateView):
|
||||
return redirect(reverse('core_dashboard'))
|
||||
|
||||
|
||||
class VersionView(TemplateView):
|
||||
class VersionView(utils_views.TemplateView):
|
||||
"""
|
||||
Shows version infos.
|
||||
"""
|
||||
@ -155,7 +156,7 @@ class SearchView(_SearchView):
|
||||
return models
|
||||
|
||||
|
||||
class ErrorView(View):
|
||||
class ErrorView(utils_views.View):
|
||||
"""
|
||||
View for Http 403, 404 and 500 error pages.
|
||||
"""
|
||||
@ -180,3 +181,35 @@ class ErrorView(View):
|
||||
context_instance=RequestContext(request, context))
|
||||
response.status_code = self.status_code
|
||||
return response
|
||||
|
||||
|
||||
class CustomSlideViewMixin(object):
|
||||
"""
|
||||
Mixin for for CustomSlide Views.
|
||||
"""
|
||||
permission_required = 'core.can_manage_projector'
|
||||
template_name = 'core/customslide_update.html'
|
||||
model = CustomSlide
|
||||
success_url_name = 'core_dashboard'
|
||||
url_name_args = []
|
||||
|
||||
|
||||
class CustomSlideCreateView(CustomSlideViewMixin, utils_views.CreateView):
|
||||
"""
|
||||
Create a custom slide.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class CustomSlideUpdateView(CustomSlideViewMixin, utils_views.UpdateView):
|
||||
"""
|
||||
Update a custom slide.
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class CustomSlideDeleteView(CustomSlideViewMixin, utils_views.DeleteView):
|
||||
"""
|
||||
Delete a custom slide.
|
||||
"""
|
||||
pass
|
||||
|
@ -1,16 +1,20 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from openslides.config.api import config
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from openslides.config.api import config
|
||||
from openslides.projector.api import get_active_slide
|
||||
from openslides.utils.widgets import Widget
|
||||
|
||||
from .models import CustomSlide
|
||||
|
||||
|
||||
class WelcomeWidget(Widget):
|
||||
"""
|
||||
Welcome widget with static info for all users.
|
||||
"""
|
||||
name = 'welcome'
|
||||
permission_required = 'projector.can_see_dashboard'
|
||||
permission_required = 'core.can_see_dashboard'
|
||||
default_column = 1
|
||||
default_weight = 10
|
||||
template_name = 'core/widget_welcome.html'
|
||||
@ -18,3 +22,23 @@ class WelcomeWidget(Widget):
|
||||
|
||||
def get_verbose_name(self):
|
||||
return config['welcome_title']
|
||||
|
||||
|
||||
class CustonSlideWidget(Widget):
|
||||
"""
|
||||
Widget to control custom slides.
|
||||
"""
|
||||
name = 'custom_slide'
|
||||
verbose_name = ugettext_lazy('Custom Slides')
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 2
|
||||
default_weight = 30
|
||||
template_name = 'core/widget_customslide.html'
|
||||
context = None
|
||||
|
||||
def get_context_data(self, **context):
|
||||
return super(CustonSlideWidget, self).get_context_data(
|
||||
slides=CustomSlide.objects.all().order_by('weight'),
|
||||
welcomepage_is_active=(
|
||||
get_active_slide().get('callback', 'default') == 'default'),
|
||||
**context)
|
||||
|
@ -14,7 +14,7 @@ class PDFPresentationWidget(Widget):
|
||||
"""
|
||||
name = 'presentations'
|
||||
verbose_name = ugettext_lazy('Presentations')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 1
|
||||
default_weight = 75
|
||||
template_name = 'mediafile/widget_pdfpresentation.html'
|
||||
|
@ -37,7 +37,7 @@
|
||||
rel="tooltip" data-original-title="{% trans 'Print motion as PDF' %}" target="_blank">
|
||||
<i class="icon-print"></i> PDF</a>
|
||||
<!-- activate projector -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ motion|absolute_url:'projector' }}" class="activate_link btn {% if motion.is_active_slide %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show motion' %}">
|
||||
<i class="icon-facetime-video {% if motion.is_active_slide %}icon-white{% endif %}"></i>
|
||||
</a>
|
||||
|
@ -78,7 +78,7 @@
|
||||
{% endif %}</td>
|
||||
<td>
|
||||
<span style="width: 1px; white-space: nowrap;">
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ motion|absolute_url:'projector' }}" class="activate_link btn {% if motion.is_active_slide %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show motion' %}">
|
||||
<i class="icon-facetime-video {% if motion.is_active_slide %}icon-white{% endif %}"></i>
|
||||
|
@ -18,7 +18,7 @@
|
||||
<div class="btn-toolbar">
|
||||
<a href="{% url 'motion_detail' motion.id %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to motion" %}</a>
|
||||
<!-- activate projector -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ motion|absolute_url:'projector' }}" class="activate_link btn {% if motion.is_active_slide %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show motion' %}">
|
||||
<i class="icon-facetime-video {% if motion.is_active_slide %}icon-white{% endif %}"></i>
|
||||
</a>
|
||||
|
@ -13,7 +13,7 @@ class MotionWidget(Widget):
|
||||
"""
|
||||
name = 'motion'
|
||||
verbose_name = ugettext_lazy('Motions')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 1
|
||||
default_weight = 40
|
||||
icon_css_class = 'icon-file'
|
||||
|
@ -68,9 +68,9 @@ def create_builtin_groups_and_admin(sender, **kwargs):
|
||||
return
|
||||
|
||||
# Anonymous and Registered
|
||||
ct_projector = ContentType.objects.get(app_label='projector', model='projectorslide')
|
||||
perm_1 = Permission.objects.get(content_type=ct_projector, codename='can_see_projector')
|
||||
perm_2 = Permission.objects.get(content_type=ct_projector, codename='can_see_dashboard')
|
||||
ct_core = ContentType.objects.get(app_label='core', model='customslide')
|
||||
perm_1 = Permission.objects.get(content_type=ct_core, codename='can_see_projector')
|
||||
perm_2 = Permission.objects.get(content_type=ct_core, codename='can_see_dashboard')
|
||||
|
||||
ct_agenda = ContentType.objects.get(app_label='agenda', model='item')
|
||||
ct_speaker = ContentType.objects.get(app_label='agenda', model='speaker')
|
||||
@ -110,7 +110,7 @@ def create_builtin_groups_and_admin(sender, **kwargs):
|
||||
perm_12 = Permission.objects.get(content_type=ct_motion, codename='can_manage_motion')
|
||||
perm_13 = Permission.objects.get(content_type=ct_assignment, codename='can_manage_assignment')
|
||||
perm_14 = Permission.objects.get(content_type=ct_participant, codename='can_manage_participant')
|
||||
perm_15 = Permission.objects.get(content_type=ct_projector, codename='can_manage_projector')
|
||||
perm_15 = Permission.objects.get(content_type=ct_core, codename='can_manage_projector')
|
||||
perm_15a = Permission.objects.get(content_type=ct_mediafile, codename='can_manage')
|
||||
|
||||
ct_config = ContentType.objects.get(app_label='config', model='configstore')
|
||||
|
@ -11,7 +11,7 @@
|
||||
<small class="pull-right">
|
||||
<a href="{% url 'user_group_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
|
||||
<!-- activate projector -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{% url 'projector_activate_slide' group.sid %}" class="activate_link btn {% if group.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show group' %}">
|
||||
<i class="icon-facetime-video {% if group.active %}icon-white{% endif %}"></i>
|
||||
</a>
|
||||
|
@ -48,7 +48,7 @@
|
||||
</td>
|
||||
<td>
|
||||
<span style="width: 1px; white-space: nowrap;">
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ group|absolute_url:'projector' }}"
|
||||
class="activate_link btn {% if group.is_active_slide %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show group' %}">
|
||||
|
@ -108,7 +108,7 @@
|
||||
</td>
|
||||
<td>
|
||||
<span style="width: 1px; white-space: nowrap;">
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{{ user|absolute_url:'projector' }}" class="activate_link btn {% if user.is_active_slide %}btn-primary{% endif %} btn-mini"
|
||||
rel="tooltip" data-original-title="{% trans 'Show participant' %}">
|
||||
<i class="icon-facetime-video {% if user.is_active_slide %}icon-white{% endif %}"></i>
|
||||
|
@ -11,7 +11,7 @@
|
||||
<small class="pull-right">
|
||||
<a href="{% url 'user_overview' %}" class="btn btn-mini"><i class="icon-chevron-left"></i> {% trans "Back to overview" %}</a>
|
||||
<!-- activate projector -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<a href="{% url 'projector_activate_slide' shown_user.sid %}" class="activate_link btn {% if shown_user.active %}btn-primary{% endif %} btn-mini" rel="tooltip" data-original-title="{% trans 'Show participant' %}">
|
||||
<i class="icon-facetime-video {% if shown_user.active %}icon-white{% endif %}"></i>
|
||||
</a>
|
||||
|
@ -14,7 +14,7 @@ class UserWidget(Widget):
|
||||
"""
|
||||
name = 'user'
|
||||
verbose_name = ugettext_lazy('Participants')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 1
|
||||
default_weight = 60
|
||||
default_active = False
|
||||
@ -34,7 +34,7 @@ class GroupWidget(Widget):
|
||||
"""
|
||||
name = 'group'
|
||||
verbose_name = ugettext_lazy('Groups')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 1
|
||||
default_weight = 70
|
||||
default_active = False
|
||||
|
@ -1,3 +1,3 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from . import signals, slides, widgets # noqa
|
||||
from . import signals, widgets # noqa
|
||||
|
@ -2,10 +2,7 @@
|
||||
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy, ugettext_noop
|
||||
|
||||
from openslides.utils.models import AbsoluteUrlMixin
|
||||
from openslides.utils.utils import int_or_none
|
||||
|
||||
|
||||
@ -105,35 +102,3 @@ class SlideMixin(object):
|
||||
context.update({'slide': self,
|
||||
slide_name: self})
|
||||
return context
|
||||
|
||||
|
||||
class ProjectorSlide(SlideMixin, AbsoluteUrlMixin, models.Model):
|
||||
"""
|
||||
Model for Slides, only for the projector. Also called custom slides.
|
||||
"""
|
||||
# TODO: Rename it to CustomSlide and move it to core app.
|
||||
# Check and rename permissions.
|
||||
slide_callback_name = 'projector_slide'
|
||||
|
||||
title = models.CharField(max_length=256, verbose_name=ugettext_lazy("Title"))
|
||||
text = models.TextField(null=True, blank=True, verbose_name=ugettext_lazy("Text"))
|
||||
weight = models.IntegerField(default=0, verbose_name=ugettext_lazy("Weight"))
|
||||
|
||||
class Meta:
|
||||
permissions = (
|
||||
('can_manage_projector', ugettext_noop("Can manage the projector")),
|
||||
('can_see_projector', ugettext_noop("Can see the projector")),
|
||||
('can_see_dashboard', ugettext_noop("Can see the dashboard")),
|
||||
)
|
||||
|
||||
def __unicode__(self):
|
||||
return self.title
|
||||
|
||||
def get_absolute_url(self, link='update'):
|
||||
if link == 'update':
|
||||
url = reverse('customslide_edit', args=[str(self.pk)])
|
||||
elif link == 'delete':
|
||||
url = reverse('customslide_delete', args=[str(self.pk)])
|
||||
else:
|
||||
url = super(ProjectorSlide, self).get_absolute_url(link)
|
||||
return url
|
||||
|
@ -1,7 +0,0 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
from openslides.projector.api import register_slide_model
|
||||
|
||||
from .models import ProjectorSlide
|
||||
|
||||
register_slide_model(ProjectorSlide, 'projector/projectorslide_slide.html')
|
@ -14,7 +14,7 @@
|
||||
</a>
|
||||
|
||||
<!-- projector control buttons -->
|
||||
{% if perms.projector.can_manage_projector %}
|
||||
{% if perms.core.can_manage_projector %}
|
||||
<p>
|
||||
<a class="projector_edit btn" href="{% url 'projector_bigger' %}" title="{% trans 'Zoom in' %}">
|
||||
<i class="icon-zoom-in"></i>
|
||||
|
@ -27,18 +27,6 @@ urlpatterns = patterns(
|
||||
views.OverlayMessageView.as_view(),
|
||||
name='projector_overlay_message'),
|
||||
|
||||
url(r'^new/$',
|
||||
views.CustomSlideCreateView.as_view(),
|
||||
name='customslide_new'),
|
||||
|
||||
url(r'^(?P<pk>\d+)/edit/$',
|
||||
views.CustomSlideUpdateView.as_view(),
|
||||
name='customslide_edit'),
|
||||
|
||||
url(r'^(?P<pk>\d+)/del/$',
|
||||
views.CustomSlideDeleteView.as_view(),
|
||||
name='customslide_delete'),
|
||||
|
||||
url(r'^bigger/$',
|
||||
views.ProjectorControllView.as_view(),
|
||||
{'direction': 'bigger'},
|
||||
|
@ -3,21 +3,19 @@
|
||||
from openslides.config.api import config
|
||||
from openslides.mediafile.models import Mediafile
|
||||
from openslides.utils.tornado_webserver import ProjectorSocketHandler
|
||||
from openslides.utils.views import (CreateView, DeleteView,
|
||||
RedirectView, TemplateView, UpdateView)
|
||||
from openslides.utils.views import RedirectView, TemplateView
|
||||
|
||||
from .api import (call_on_projector, get_active_slide,
|
||||
get_overlays, get_projector_content, get_projector_overlays,
|
||||
get_projector_overlays_js, reset_countdown, set_active_slide,
|
||||
start_countdown, stop_countdown, update_projector_overlay)
|
||||
from .models import ProjectorSlide
|
||||
|
||||
|
||||
class ProjectorView(TemplateView):
|
||||
"""
|
||||
The Projector-Page.
|
||||
"""
|
||||
permission_required = 'projector.can_see_projector'
|
||||
permission_required = 'core.can_see_projector'
|
||||
template_name = 'projector.html'
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
@ -45,7 +43,7 @@ class ActivateView(RedirectView):
|
||||
"""
|
||||
Activate a Slide.
|
||||
"""
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
url_name = 'core_dashboard'
|
||||
allow_ajax = True
|
||||
|
||||
@ -72,7 +70,7 @@ class ProjectorControllView(RedirectView):
|
||||
"""
|
||||
Scale or scroll the projector.
|
||||
"""
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
url_name = 'core_dashboard'
|
||||
allow_ajax = True
|
||||
|
||||
@ -106,7 +104,7 @@ class CountdownControllView(RedirectView):
|
||||
"""
|
||||
Start, stop or reset the countdown.
|
||||
"""
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
url_name = 'core_dashboard'
|
||||
allow_ajax = True
|
||||
|
||||
@ -141,7 +139,7 @@ class OverlayMessageView(RedirectView):
|
||||
"""
|
||||
url_name = 'core_dashboard'
|
||||
allow_ajax = True
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
|
||||
def pre_post_redirect(self, request, *args, **kwargs):
|
||||
if 'message' in request.POST:
|
||||
@ -162,7 +160,7 @@ class ActivateOverlay(RedirectView):
|
||||
"""
|
||||
url_name = 'core_dashboard'
|
||||
allow_ajax = True
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
|
||||
def pre_redirect(self, request, *args, **kwargs):
|
||||
overlay = get_overlays()[kwargs['name']]
|
||||
@ -180,36 +178,3 @@ class ActivateOverlay(RedirectView):
|
||||
|
||||
def get_ajax_context(self, **kwargs):
|
||||
return {'active': self.active, 'name': self.name}
|
||||
|
||||
|
||||
class CustomSlideCreateView(CreateView):
|
||||
"""
|
||||
Create a custom slide.
|
||||
"""
|
||||
permission_required = 'agenda.can_manage_agenda'
|
||||
template_name = 'projector/new.html'
|
||||
model = ProjectorSlide
|
||||
context_object_name = 'customslide'
|
||||
success_url_name = 'core_dashboard'
|
||||
url_name_args = []
|
||||
|
||||
|
||||
class CustomSlideUpdateView(UpdateView):
|
||||
"""
|
||||
Update a custom slide.
|
||||
"""
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
template_name = 'projector/new.html'
|
||||
model = ProjectorSlide
|
||||
context_object_name = 'customslide'
|
||||
success_url_name = 'core_dashboard'
|
||||
url_name_args = []
|
||||
|
||||
|
||||
class CustomSlideDeleteView(DeleteView):
|
||||
"""
|
||||
Delete a custom slide.
|
||||
"""
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
model = ProjectorSlide
|
||||
success_url_name = 'core_dashboard'
|
||||
|
@ -3,10 +3,8 @@
|
||||
from django.core.context_processors import csrf
|
||||
from django.utils.translation import ugettext_lazy
|
||||
|
||||
from openslides.projector.api import get_active_slide
|
||||
from openslides.utils.widgets import Widget
|
||||
|
||||
from .models import ProjectorSlide
|
||||
from .signals import projector_overlays
|
||||
|
||||
|
||||
@ -16,7 +14,7 @@ class ProjectorLiveWidget(Widget):
|
||||
"""
|
||||
name = 'live_view'
|
||||
verbose_name = ugettext_lazy('Projector live view')
|
||||
permission_required = 'projector.can_see_projector'
|
||||
permission_required = 'core.can_see_projector'
|
||||
default_column = 2
|
||||
default_weight = 10
|
||||
template_name = 'projector/widget_live_view.html'
|
||||
@ -28,7 +26,7 @@ class OverlayWidget(Widget):
|
||||
"""
|
||||
name = 'overlays' # TODO: Use singular here
|
||||
verbose_name = ugettext_lazy('Overlays')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
permission_required = 'core.can_manage_projector'
|
||||
default_column = 2
|
||||
default_weight = 20
|
||||
template_name = 'projector/widget_overlay.html'
|
||||
@ -44,22 +42,3 @@ class OverlayWidget(Widget):
|
||||
return super(OverlayWidget, self).get_context_data(
|
||||
overlays=overlays,
|
||||
**context)
|
||||
|
||||
|
||||
class CustonSlideWidget(Widget):
|
||||
"""
|
||||
Widget to control custom slides.
|
||||
"""
|
||||
name = 'custom_slide'
|
||||
verbose_name = ugettext_lazy('Custom Slides')
|
||||
permission_required = 'projector.can_manage_projector'
|
||||
default_column = 2
|
||||
default_weight = 30
|
||||
template_name = 'projector/widget_custom_slide.html'
|
||||
context = None
|
||||
|
||||
def get_context_data(self, **context):
|
||||
return super(CustonSlideWidget, self).get_context_data(
|
||||
slides=ProjectorSlide.objects.all().order_by('weight'),
|
||||
welcomepage_is_active=get_active_slide().get('callback', 'default') == 'default',
|
||||
**context)
|
||||
|
@ -7,6 +7,7 @@ from openslides import get_version
|
||||
from openslides.agenda.models import Item
|
||||
from openslides.config.api import config
|
||||
from openslides.core import views
|
||||
from openslides.core.models import CustomSlide
|
||||
from openslides.participant.models import User
|
||||
from openslides.utils.test import TestCase
|
||||
|
||||
@ -15,7 +16,7 @@ class SelectWidgetsViewTest(TestCase):
|
||||
rf = RequestFactory()
|
||||
|
||||
@patch('openslides.core.views.SelectWidgetsForm')
|
||||
@patch('openslides.core.views.TemplateView.get_context_data')
|
||||
@patch('openslides.core.views.utils_views.TemplateView.get_context_data')
|
||||
@patch('openslides.core.views.Widget')
|
||||
def test_get_context_data(self, mock_Widget, mock_get_context_data,
|
||||
mock_SelectWidgetsForm):
|
||||
@ -99,3 +100,46 @@ class SearchViewTest(TestCase):
|
||||
self.assertEqual(Client().get('/search/').status_code, 403)
|
||||
config['system_enable_anonymous'] = True
|
||||
self.assertEqual(Client().get('/search/').status_code, 200)
|
||||
|
||||
|
||||
class CustomSlidesTest(TestCase):
|
||||
def setUp(self):
|
||||
self.admin_client = Client()
|
||||
self.admin_client.login(username='admin', password='admin')
|
||||
|
||||
def test_create(self):
|
||||
url = '/customslide/new/'
|
||||
response = self.admin_client.get(url)
|
||||
self.assertTemplateUsed(response, 'core/customslide_update.html')
|
||||
response = self.admin_client.post(
|
||||
url,
|
||||
{'title': 'test_title_roo2xi2EibooHie1kohd', 'weight': '0'})
|
||||
self.assertRedirects(response, '/dashboard/')
|
||||
self.assertTrue(CustomSlide.objects.filter(
|
||||
title='test_title_roo2xi2EibooHie1kohd').exists())
|
||||
|
||||
def test_update(self):
|
||||
# Setup
|
||||
url = '/customslide/1/edit/'
|
||||
CustomSlide.objects.create(title='test_title_jeeDeB3aedei8ahceeso')
|
||||
# Test
|
||||
response = self.admin_client.get(url)
|
||||
self.assertTemplateUsed(response, 'core/customslide_update.html')
|
||||
self.assertContains(response, 'test_title_jeeDeB3aedei8ahceeso')
|
||||
response = self.admin_client.post(
|
||||
url,
|
||||
{'title': 'test_title_ai8Ooboh5bahr6Ee7goo', 'weight': '0'})
|
||||
self.assertRedirects(response, '/dashboard/')
|
||||
self.assertEqual(CustomSlide.objects.get(pk=1).title,
|
||||
'test_title_ai8Ooboh5bahr6Ee7goo')
|
||||
|
||||
def test_delete(self):
|
||||
# Setup
|
||||
url = '/customslide/1/del/'
|
||||
CustomSlide.objects.create(title='test_title_oyie0em1chieM7YohX4H')
|
||||
# Test
|
||||
response = self.admin_client.get(url)
|
||||
self.assertRedirects(response, '/customslide/1/edit/')
|
||||
response = self.admin_client.post(url, {'yes': 'true'})
|
||||
self.assertRedirects(response, '/dashboard/')
|
||||
self.assertFalse(CustomSlide.objects.exists())
|
||||
|
@ -82,8 +82,8 @@ class DefaultGroups(TestCase):
|
||||
|
||||
def test_default_perms_anonymous(self):
|
||||
anonymous = Group.objects.get(pk=1)
|
||||
default_perms = ('projector.can_see_projector',
|
||||
'projector.can_see_dashboard',
|
||||
default_perms = ('core.can_see_projector',
|
||||
'core.can_see_dashboard',
|
||||
'agenda.can_see_agenda',
|
||||
'agenda.can_see_orga_items',
|
||||
'motion.can_see_motion',
|
||||
|
@ -5,7 +5,6 @@ from django.test.client import Client, RequestFactory
|
||||
from mock import call, MagicMock, patch
|
||||
|
||||
from openslides.config.api import config
|
||||
from openslides.projector.models import ProjectorSlide
|
||||
from openslides.projector import views
|
||||
from openslides.utils.test import TestCase
|
||||
|
||||
@ -114,43 +113,6 @@ class ProjectorControllViewTest(TestCase):
|
||||
self.assertEqual(context, {'scale_level': 1, 'scroll_level': 2})
|
||||
|
||||
|
||||
class CustomSlidesTest(TestCase):
|
||||
def setUp(self):
|
||||
self.admin_client = Client()
|
||||
self.admin_client.login(username='admin', password='admin')
|
||||
|
||||
def test_create(self):
|
||||
url = '/projector/new/'
|
||||
response = self.admin_client.get(url)
|
||||
self.assertTemplateUsed(response, 'projector/new.html')
|
||||
response = self.admin_client.post(url, {'title': 'test_title_roo2xi2EibooHie1kohd', 'weight': '0'})
|
||||
self.assertRedirects(response, '/dashboard/')
|
||||
self.assertTrue(ProjectorSlide.objects.filter(title='test_title_roo2xi2EibooHie1kohd').exists())
|
||||
|
||||
def test_update(self):
|
||||
# Setup
|
||||
url = '/projector/1/edit/'
|
||||
ProjectorSlide.objects.create(title='test_title_jeeDeB3aedei8ahceeso')
|
||||
# Test
|
||||
response = self.admin_client.get(url)
|
||||
self.assertTemplateUsed(response, 'projector/new.html')
|
||||
self.assertContains(response, 'test_title_jeeDeB3aedei8ahceeso')
|
||||
response = self.admin_client.post(url, {'title': 'test_title_ai8Ooboh5bahr6Ee7goo', 'weight': '0'})
|
||||
self.assertRedirects(response, '/dashboard/')
|
||||
self.assertEqual(ProjectorSlide.objects.get(pk=1).title, 'test_title_ai8Ooboh5bahr6Ee7goo')
|
||||
|
||||
def test_delete(self):
|
||||
# Setup
|
||||
url = '/projector/1/del/'
|
||||
ProjectorSlide.objects.create(title='test_title_oyie0em1chieM7YohX4H')
|
||||
# Test
|
||||
response = self.admin_client.get(url)
|
||||
self.assertRedirects(response, '/projector/1/edit/')
|
||||
response = self.admin_client.post(url, {'yes': 'true'})
|
||||
self.assertRedirects(response, '/dashboard/')
|
||||
self.assertFalse(ProjectorSlide.objects.exists())
|
||||
|
||||
|
||||
class CountdownControllView(TestCase):
|
||||
def setUp(self):
|
||||
self.admin_client = Client()
|
||||
|
Loading…
Reference in New Issue
Block a user