diff --git a/openslides/account/views.py b/openslides/account/views.py index 0406d18bc..c8b9d2393 100644 --- a/openslides/account/views.py +++ b/openslides/account/views.py @@ -72,4 +72,5 @@ def get_personal_info_widget(request): template='account/personal_info_widget.html', context=personal_info_context, permission_required=None, - default_column=1) + default_column=1, + default_weight=80) diff --git a/openslides/agenda/views.py b/openslides/agenda/views.py index cf636a922..584a9a264 100644 --- a/openslides/agenda/views.py +++ b/openslides/agenda/views.py @@ -593,11 +593,15 @@ def get_widgets(request): 'items': Item.objects.all(), 'summary': config['presentation_argument'] == 'summary', 'speakers': config['presentation_argument'] == 'show_list_of_speakers'}, - permission_required='projector.can_manage_projector'), + permission_required='projector.can_manage_projector', + default_column=1, + default_weight=20), Widget( request, name='append_to_list_of_speakers', display_name=_('List of speakers'), template='agenda/speaker_widget.html', - permission_required='agenda.can_be_speaker')] + permission_required='agenda.can_be_speaker', + default_column=1, + default_weight=30)] diff --git a/openslides/assignment/views.py b/openslides/assignment/views.py index 482749684..7ec4c40ad 100644 --- a/openslides/assignment/views.py +++ b/openslides/assignment/views.py @@ -641,4 +641,6 @@ def get_widgets(request): display_name=_('Elections'), template='assignment/widget.html', context={'assignments': Assignment.objects.all()}, - permission_required='projector.can_manage_projector')] + permission_required='projector.can_manage_projector', + default_column=1, + default_weight=50)] diff --git a/openslides/motion/views.py b/openslides/motion/views.py index 55b840e6d..c98481eff 100644 --- a/openslides/motion/views.py +++ b/openslides/motion/views.py @@ -837,4 +837,6 @@ def get_widgets(request): display_name=_('Motions'), template='motion/widget.html', context={'motions': Motion.objects.all()}, - permission_required='projector.can_manage_projector')] + permission_required='projector.can_manage_projector', + default_column=1, + default_weight=40)] diff --git a/openslides/participant/views.py b/openslides/participant/views.py index 882b90c56..f1151dc2e 100644 --- a/openslides/participant/views.py +++ b/openslides/participant/views.py @@ -564,7 +564,8 @@ def get_user_widget(request): template='participant/user_widget.html', context={'users': User.objects.all()}, permission_required='projector.can_manage_projector', - default_column=1) + default_column=1, + default_weight=60) def get_group_widget(request): @@ -579,4 +580,5 @@ def get_group_widget(request): template='participant/group_widget.html', context={'groups': Group.objects.all()}, permission_required='projector.can_manage_projector', - default_column=1) + default_column=1, + default_weight=70) diff --git a/openslides/projector/api.py b/openslides/projector/api.py index 0a990a6ba..68299d82b 100644 --- a/openslides/projector/api.py +++ b/openslides/projector/api.py @@ -128,21 +128,23 @@ def get_all_widgets(request, session=False): The session flag decides whether to return only the widgets which are active, that means that they are mentioned in the session. """ - widgets = SortedDict() - session_widgets = request.session.get('widgets', {}) + all_module_widgets = [] for app in settings.INSTALLED_APPS: try: mod = import_module(app + '.views') except ImportError: continue try: - modul_widgets = mod.get_widgets(request) + module_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 + all_module_widgets.extend(module_widgets) + all_module_widgets.sort(key=lambda widget: widget.default_weight) + session_widgets = request.session.get('widgets', {}) + widgets = SortedDict() + for widget in all_module_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 diff --git a/openslides/projector/projector.py b/openslides/projector/projector.py index d9823b44f..3709e2650 100644 --- a/openslides/projector/projector.py +++ b/openslides/projector/projector.py @@ -116,7 +116,8 @@ 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): + 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() @@ -132,9 +133,9 @@ class Widget(object): 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() diff --git a/openslides/projector/views.py b/openslides/projector/views.py index 9a7e9b5fe..6a2a30041 100644 --- a/openslides/projector/views.py +++ b/openslides/projector/views.py @@ -383,7 +383,8 @@ def get_widgets(request): template='projector/welcome_widget.html', context={'welcometext': config['welcome_text']}, permission_required='projector.can_see_dashboard', - default_column=1)) + default_column=1, + default_weight=10)) # Projector live view widget widgets.append(Widget( @@ -392,7 +393,8 @@ def get_widgets(request): display_name=_('Projector live view'), template='projector/live_view_widget.html', permission_required='projector.can_see_projector', - default_column=2)) + default_column=2, + default_weight=10)) # Overlay widget overlays = [] @@ -407,6 +409,7 @@ def get_widgets(request): template='projector/overlay_widget.html', permission_required='projector.can_manage_projector', default_column=2, + default_weight=20, context=context)) # Custom slide widget @@ -419,6 +422,7 @@ def get_widgets(request): 'slides': ProjectorSlide.objects.all().order_by('weight'), 'welcomepage_is_active': not bool(config["presentation"])}, permission_required='projector.can_manage_projector', - default_column=2)) + default_column=2, + default_weight=30)) return widgets