diff options
author | Étienne Loks <etienne.loks@proxience.com> | 2014-10-30 00:49:28 +0100 |
---|---|---|
committer | Étienne Loks <etienne.loks@proxience.com> | 2014-10-30 00:52:17 +0100 |
commit | 56f04c6d3d563fe116ba1c1094a2449910ca2b5d (patch) | |
tree | 316a8cfc21ab85b6a652fb685a87d72ad90a27a6 /ishtar_common | |
parent | 827c268c089cb0591e5adb94cd0d661ef1e71a49 (diff) | |
download | Ishtar-56f04c6d3d563fe116ba1c1094a2449910ca2b5d.tar.bz2 Ishtar-56f04c6d3d563fe116ba1c1094a2449910ca2b5d.zip |
Add a new menu for admin tasks - new view for global variable edition (refs #2111)
Diffstat (limited to 'ishtar_common')
-rw-r--r-- | ishtar_common/ishtar_menu.py | 13 | ||||
-rw-r--r-- | ishtar_common/menu_base.py | 6 | ||||
-rw-r--r-- | ishtar_common/static/media/style.css | 8 | ||||
-rw-r--r-- | ishtar_common/templates/blocks/inline_formset.html | 8 | ||||
-rw-r--r-- | ishtar_common/templates/ishtar/formset.html | 11 | ||||
-rw-r--r-- | ishtar_common/urls.py | 4 | ||||
-rw-r--r-- | ishtar_common/views.py | 30 |
7 files changed, 70 insertions, 10 deletions
diff --git a/ishtar_common/ishtar_menu.py b/ishtar_common/ishtar_menu.py index 0f869dd66..4303b707e 100644 --- a/ishtar_common/ishtar_menu.py +++ b/ishtar_common/ishtar_menu.py @@ -25,6 +25,16 @@ from ishtar_common.menu_base import SectionItem, MenuItem import models MENU_SECTIONS = [ + (5, SectionItem('admin', _(u"Administration"), + childs=[ + MenuItem('account_management', _(u"Account management"), + model=models.IshtarUser, + access_controls=['add_ishtaruser',]), + MenuItem('admin-globalvar', _(u"Global variables"), + model=models.GlobalVar, + access_controls=['add_globalvar',]), + ]) + ), (10, SectionItem('administration', _(u"Directory"), childs=[ SectionItem('person', _(u"Person"), @@ -54,9 +64,6 @@ MENU_SECTIONS = [ access_controls=['change_organization', 'change_own_organization']), ]), - MenuItem('account_management', _(u"Account management"), - model=models.IshtarUser, - access_controls=['add_ishtaruser',]), ]) ) ] diff --git a/ishtar_common/menu_base.py b/ishtar_common/menu_base.py index 24d63a3e6..2331ecbd7 100644 --- a/ishtar_common/menu_base.py +++ b/ishtar_common/menu_base.py @@ -57,8 +57,9 @@ class MenuItem: def can_be_available(self, user): if not self.access_controls: return True + prefix = (self.model._meta.app_label + '.') if self.model else '' for access_control in self.access_controls: - access_control = self.model._meta.app_label + '.' + access_control + access_control = prefix + access_control if user.has_perm(access_control, self.model) or \ access_control in user.get_group_permissions(): return True @@ -71,8 +72,9 @@ class MenuItem: def is_available(self, user, obj=None): if not self.access_controls: return True + prefix = (self.model._meta.app_label + '.') if self.model else '' for access_control in self.access_controls: - access_control = self.model._meta.app_label + '.' + access_control + access_control = prefix + access_control if user.has_perm(access_control, self.model, obj): return True # manage by person type diff --git a/ishtar_common/static/media/style.css b/ishtar_common/static/media/style.css index 3c2c429b1..23bc28832 100644 --- a/ishtar_common/static/media/style.css +++ b/ishtar_common/static/media/style.css @@ -593,6 +593,14 @@ table.confirm tr.spacer td:last-child{ right:135px; } +#global-vars textarea{ + width:220px; +} + +#global-vars input[type=text]{ + width:160px; +} + #dashboard{ padding-top: 20px; } diff --git a/ishtar_common/templates/blocks/inline_formset.html b/ishtar_common/templates/blocks/inline_formset.html index e36405118..744e125f5 100644 --- a/ishtar_common/templates/blocks/inline_formset.html +++ b/ishtar_common/templates/blocks/inline_formset.html @@ -1,12 +1,12 @@ {% load i18n %} {% if extra_formset.non_form_errors %}<div class='errors'>{{extra_formset.non_form_errors.as_ul}}</div>{% endif %} - {% if header %}<table class='inline-table'> + {% if header %}<table class='inline-table' id='{{formset}}aaa'> <caption>{% trans caption %}</caption> - {% endif %}{% for frm in formset%}{% if header %}<thead> - <tr>{% for field in frm.visible_fields%} + <thead> + <tr>{% for field in formset.0.visible_fields%} <th>{{field.label}}</th>{%endfor%} </tr> - </thead>{% endif %} + </thead>{% endif %}{% for frm in formset%} {% if forloop.first and not skip %}<tbody>{%endif%} {% if not skip or not forloop.first %}<tr>{% endif %}{% for field in frm.visible_fields %} <td> diff --git a/ishtar_common/templates/ishtar/formset.html b/ishtar_common/templates/ishtar/formset.html new file mode 100644 index 000000000..5ae0e7c51 --- /dev/null +++ b/ishtar_common/templates/ishtar/formset.html @@ -0,0 +1,11 @@ +{% extends "base.html" %} +{% load i18n inline_formset %} +{% block content %} +<h2>{% trans "Global variables" %}</h2> +<div class='form' id='global-vars'> +<form action="." method="post">{% csrf_token %} + {% inline_formset ' ' formset %} +<input type="submit" value="{% trans "Validate" %}"/> +</form> +</div> +{% endblock %} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 8b148530e..c361ef438 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -23,7 +23,7 @@ from django.conf.urls.static import static from menus import menu -import views +from ishtar_common import views urlpatterns, actions = [], [] @@ -91,6 +91,8 @@ urlpatterns += patterns('ishtar_common.views', 'show_organization', name='show-organization'), url(r'autocomplete-organization/([0-9_]+)?$', 'autocomplete_organization', name='autocomplete-organization'), + url(r'admin-globalvar/', views.GlobalVarEdit.as_view(), + name='admin-globalvar'), url(r'(?P<action_slug>' + actions + r')/$', 'action', name='action'), ) diff --git a/ishtar_common/views.py b/ishtar_common/views.py index 889bd3893..c27aae74b 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -32,8 +32,11 @@ from tempfile import NamedTemporaryFile import ho.pisa as pisa import unicodedata +from extra_views import ModelFormSetView + from django.conf import settings from django.contrib.auth import logout +from django.contrib.auth.decorators import login_required from django.core import serializers from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import reverse, NoReverseMatch @@ -41,6 +44,7 @@ from django.db.models import Q, ImageField from django.http import HttpResponse, Http404 from django.shortcuts import render_to_response, redirect from django.template import RequestContext, loader +from django.utils.decorators import method_decorator from django.utils.translation import ugettext, ugettext_lazy as _ if settings.XHTML2ODT_PATH: @@ -790,3 +794,29 @@ def dashboard_main_detail(request, item_name): '%d_%d_%d' % (n.minute, n.second, n.microsecond) return render_to_response('ishtar/dashboards/dashboard_main_detail.html', dct, context_instance=RequestContext(request)) + + +class LoginRequiredMixin(object): + @method_decorator(login_required) + def dispatch(self, request, *args, **kwargs): + return super(LoginRequiredMixin, self).dispatch(request, *args, + **kwargs) + if kwargs.get('pk') and not self.request.user.is_staff and \ + not str(kwargs['pk']) == str(self.request.user.company.pk): + return redirect(reverse('index')) + return super(LoginRequiredMixin, self).dispatch(request, *args, + **kwargs) + +class AdminLoginRequiredMixin(LoginRequiredMixin): + def dispatch(self, request, *args, **kwargs): + if not request.user.is_staff: + return redirect(reverse('start')) + return super(AdminLoginRequiredMixin, self).dispatch(request, *args, + **kwargs) + +class GlobalVarEdit(AdminLoginRequiredMixin, ModelFormSetView): + template_name = 'ishtar/formset.html' + model = models.GlobalVar + extra = 1 + can_delete = True + fields = ['slug', 'value', 'description'] |