Browse Source

make new

devel
Dmitry Novikov 7 years ago
parent
commit
e9c5e94f6b
  1. 16
      abonapp/views.py
  2. 5
      accounts_app/forms.py
  3. 11
      accounts_app/locale/ru/LC_MESSAGES/django.po
  4. 4
      accounts_app/templates/accounts/index.html
  5. 12
      accounts_app/templates/accounts/settings/ext.htm
  6. 2
      accounts_app/templates/accounts/settings/userprofile_form.html
  7. 18
      accounts_app/urls.py
  8. 49
      accounts_app/views.py
  9. 2
      djing/settings.py
  10. 2
      djing/views.py
  11. 7
      group_app/views.py
  12. 3
      taskapp/locale/ru/LC_MESSAGES/django.po
  13. 2
      taskapp/models.py
  14. 7
      taskapp/templates/taskapp/footer_btns.html
  15. 1
      taskapp/urls.py
  16. 57
      taskapp/views.py
  17. 2
      templates/all_base.html
  18. 2
      templates/base.html

16
abonapp/views.py

@ -73,8 +73,7 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin,
context = super(PeoplesListView, self).get_context_data(**kwargs) context = super(PeoplesListView, self).get_context_data(**kwargs)
context['streets'] = models.AbonStreet.objects.filter(group=gid).only(
'name')
context['streets'] = models.AbonStreet.objects.filter(group=gid).only('name')
context['street_id'] = lib.safe_int(self.request.GET.get('street')) context['street_id'] = lib.safe_int(self.request.GET.get('street'))
context['group'] = group context['group'] = group
return context return context
@ -83,14 +82,15 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin,
class GroupListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList): class GroupListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList):
context_object_name = 'groups' context_object_name = 'groups'
template_name = 'abonapp/group_list.html' template_name = 'abonapp/group_list.html'
queryset = Group.objects.annotate(usercount=Count('abon'))
def get_queryset(self): def get_queryset(self):
queryset = super(GroupListView, self).get_queryset()
queryset = get_objects_for_user(self.request.user,
'group_app.view_group', klass=queryset,
accept_global_perms=False)
return queryset
queryset = get_objects_for_user(
self.request.user,
'group_app.view_group', klass=Group,
use_groups=False,
accept_global_perms=False
)
return queryset.annotate(usercount=Count('abon'))
class AbonCreateView(LoginRequiredMixin, OnlyAdminsMixin, class AbonCreateView(LoginRequiredMixin, OnlyAdminsMixin,

5
accounts_app/forms.py

@ -46,10 +46,11 @@ class UserPermissionsForm(forms.ModelForm):
class Meta: class Meta:
model = UserProfile model = UserProfile
fields = ('avatar', 'password', 'groups', 'user_permissions', 'responsibility_groups', 'is_superuser')
fields = ('user_permissions', 'is_superuser')
class UserProfileForm(forms.ModelForm): class UserProfileForm(forms.ModelForm):
class Meta: class Meta:
model = UserProfile model = UserProfile
exclude = ('avatar', 'password', 'groups', 'user_permissions', 'responsibility_groups', 'is_superuser')
exclude = ('avatar', 'password', 'groups', 'user_permissions',
'responsibility_groups', 'is_admin', 'is_superuser', 'last_login')

11
accounts_app/locale/ru/LC_MESSAGES/django.po

@ -241,10 +241,6 @@ msgstr "Включён-ли"
msgid "Last login" msgid "Last login"
msgstr "Последняя авторизация" msgstr "Последняя авторизация"
#: templates/accounts/index.html:30
msgid "All permissions"
msgstr "Административный доступ (все права)"
#: templates/accounts/login.html:5 #: templates/accounts/login.html:5
msgid "Auth" msgid "Auth"
msgstr "Аутентификация" msgstr "Аутентификация"
@ -309,10 +305,6 @@ msgstr "Изменение прав доступа для выбранного
msgid "The list of user groups to which the account has access" msgid "The list of user groups to which the account has access"
msgstr "Список групп абонентов, к которым учётка имеет доступ" msgstr "Список групп абонентов, к которым учётка имеет доступ"
#: views.py:33
msgid "Wrong login or password, please try again"
msgstr "Неправильный логин или пароль, попробуйте ещё раз"
#: views.py:121 #: views.py:121
msgid "New password is empty, fill it" msgid "New password is empty, fill it"
msgstr "Новый пароль пустой, придумайте себе пароль" msgstr "Новый пароль пустой, придумайте себе пароль"
@ -382,3 +374,6 @@ msgstr "Настройки"
msgid "Name and surname" msgid "Name and surname"
msgstr "Имя и отчество" msgstr "Имя и отчество"
msgid "Is superuser"
msgstr "Является суперпользователем"

4
accounts_app/templates/accounts/index.html

@ -27,8 +27,8 @@
</tr> </tr>
{% if request.user.is_superuser %} {% if request.user.is_superuser %}
<tr> <tr>
<td class="col-sm-2">{% trans 'All permissions' %}</td>
<td class="col-sm-10"><input type="checkbox"{{ userprofile.is_staff|yesno:' checked,' }}></td>
<td class="col-sm-2">{% trans 'Is superuser' %}</td>
<td class="col-sm-10"><input type="checkbox"{{ userprofile.is_superuser|yesno:' checked,' }}></td>
</tr> </tr>
{% endif %} {% endif %}
</tbody> </tbody>

12
accounts_app/templates/accounts/settings/ext.htm

@ -5,7 +5,7 @@
<ol class="breadcrumb"> <ol class="breadcrumb">
<li><span class="glyphicon glyphicon-home"></span></li> <li><span class="glyphicon glyphicon-home"></span></li>
<li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li> <li><a href="{% url 'acc_app:accounts_list' %}">{% trans 'Administrators' %}</a></li>
<li><a href="{% url 'acc_app:profile' %}">{{ user.username }}</a></li>
<li><a href="{% url 'acc_app:setup_info' %}">{{ object.username }}</a></li>
<li class="active">{% trans 'Options' %}</li> <li class="active">{% trans 'Options' %}</li>
</ol> </ol>
{% endblock %} {% endblock %}
@ -17,10 +17,9 @@
{% block main %} {% block main %}
<div class="row"> <div class="row">
<div class="col-sm-3"> <div class="col-sm-3">
<form action="{% url 'acc_app:setup_avatar' %}" method="post" class="thumbnail"
enctype="multipart/form-data">{% csrf_token %}
<form action="{% url 'acc_app:setup_avatar' %}" method="post" class="thumbnail" enctype="multipart/form-data">{% csrf_token %}
<img alt="ava" src="{{ user.get_min_ava }}"/>
<img alt="ava" src="{{ object.get_min_ava }}"/>
<div class="caption"> <div class="caption">
<button type="submit" class="btn btn-primary">{% trans 'Save' %}</button> <button type="submit" class="btn btn-primary">{% trans 'Save' %}</button>
@ -30,11 +29,10 @@
</div> </div>
<div class="col-sm-9"> <div class="col-sm-9">
<h3>{{ user.username|default:_('Not assigned') }}</h3>
<h3>{{ object.username|default:_('Not assigned') }}</h3>
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="active"> <li class="active">
<a href="#livetab_content" data-tab-remote="{% url 'acc_app:setup_info' %}" role="tab"
data-toggle="tab">
<a href="#livetab_content" data-tab-remote="{% url 'acc_app:setup_info' %}" role="tab" data-toggle="tab">
{% trans 'Change self onfo' %} {% trans 'Change self onfo' %}
</a> </a>
</li> </li>

2
accounts_app/templates/accounts/settings/userprofile_form.html

@ -2,7 +2,7 @@
{% load globaltags i18n bootstrap3 %} {% load globaltags i18n bootstrap3 %}
{% block content %} {% block content %}
<form role="form" action="{% url 'acc_app:setup_info' %}" method="post">{% csrf_token %}
<form role="form" action="{{ form_url }}" method="post">{% csrf_token %}
{% bootstrap_form form %} {% bootstrap_form form %}

18
accounts_app/urls.py

@ -11,8 +11,6 @@ urlpatterns = [
path('logout/', LogoutView.as_view(next_page='acc_app:login'), name='logout'), path('logout/', LogoutView.as_view(next_page='acc_app:login'), name='logout'),
path('login_by_location/', views.location_login, name='llogin'), path('login_by_location/', views.location_login, name='llogin'),
path('me/', views.UpdateSelfAccount.as_view(), name='profile'),
path('add/', views.create_profile, name='create_profile'), path('add/', views.create_profile, name='create_profile'),
path('settings/', views.UpdateSelfAccount.as_view(), name='setup_info'), path('settings/', views.UpdateSelfAccount.as_view(), name='setup_info'),
@ -23,23 +21,15 @@ urlpatterns = [
path('<int:uid>/perms/', views.PermsUpdateView.as_view(), name='setup_perms'), path('<int:uid>/perms/', views.PermsUpdateView.as_view(), name='setup_perms'),
path('<int:uid>/perms/object/', views.perms_object, name='setup_perms_object'), path('<int:uid>/perms/object/', views.perms_object, name='setup_perms_object'),
re_path('^(?P<uid>\d+)/perms/object/(?P<klass_name>[a-z_]+\.[a-zA-Z_]+)/$',
views.PermissionClassListView.as_view(),
name='perms_klasses'),
re_path('^(?P<uid>\d+)/perms/object/(?P<klass_name>[a-z_]+\.[a-zA-Z_]+)/$', views.PermissionClassListView.as_view(), name='perms_klasses'),
re_path('^(?P<uid>\d+)/perms/object/(?P<klass_name>[a-z_]+\.[a-zA-Z_]+)/(?P<obj_id>\d+)/$',
views.perms_edit,
name='perms_edit'),
re_path('^(?P<uid>\d+)/perms/object/(?P<klass_name>[a-z_]+\.[a-zA-Z_]+)/(?P<obj_id>\d+)/$', views.perms_edit, name='perms_edit'),
path('<int:uid>/del/', views.delete_profile, name='delete_profile'), path('<int:uid>/del/', views.delete_profile, name='delete_profile'),
path('<int:uid>/user_group_access/',
views.set_abon_groups_permission,
name='set_abon_groups_permission'),
path('<int:uid>/user_group_access/', views.set_abon_groups_permission, name='set_abon_groups_permission'),
path('<int:uid>/manage_responsibility_groups/',
views.ManageResponsibilityGroups.as_view(),
name='manage_responsibility_groups'),
path('<int:uid>/manage_responsibility_groups/', views.ManageResponsibilityGroups.as_view(), name='manage_responsibility_groups'),
path('<int:uid>/actions/', views.ActionListView.as_view(), name='action_log') path('<int:uid>/actions/', views.ActionListView.as_view(), name='action_log')
] ]

49
accounts_app/views.py

@ -10,14 +10,14 @@ from django.shortcuts import render, redirect, get_object_or_404, resolve_url
from django.contrib import messages from django.contrib import messages
from django.urls import NoReverseMatch from django.urls import NoReverseMatch
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext as _, gettext
from django.views.generic import ListView, UpdateView, DetailView from django.views.generic import ListView, UpdateView, DetailView
from django.conf import settings from django.conf import settings
from group_app.models import Group from group_app.models import Group
from .models import UserProfile, UserProfileLog from .models import UserProfile, UserProfileLog
from .forms import AvatarChangeForm, UserPermissionsForm, MyUserObjectPermissionsForm, UserProfileForm
from accounts_app import forms
from djing.lib.decorators import only_admins from djing.lib.decorators import only_admins
from djing.lib.mixins import OnlyAdminsMixin, LoginAdminPermissionMixin, OnlySuperUserMixin from djing.lib.mixins import OnlyAdminsMixin, LoginAdminPermissionMixin, OnlySuperUserMixin
from guardian.decorators import permission_required_or_403 as permission_required from guardian.decorators import permission_required_or_403 as permission_required
@ -28,7 +28,9 @@ class CustomLoginView(LoginView):
template_name = 'accounts/login.html' template_name = 'accounts/login.html'
def form_invalid(self, form): def form_invalid(self, form):
messages.error(self.request, _('Wrong login or password, please try again'))
login_localed = gettext('profile username')
for msg in form.error_messages.values():
messages.error(self.request, msg % {'username': login_localed})
return super().form_invalid(form) return super().form_invalid(form)
def get_success_url(self): def get_success_url(self):
@ -36,7 +38,7 @@ class CustomLoginView(LoginView):
if next_url: if next_url:
return next_url return next_url
if self.request.user.is_staff: if self.request.user.is_staff:
return resolve_url('acc_app:profile')
return resolve_url('acc_app:setup_info')
return resolve_url('client_side:home') return resolve_url('client_side:home')
@ -49,7 +51,7 @@ def location_login(request):
login(request, auser) login(request, auser)
if nextl == 'None' or nextl is None or nextl == '': if nextl == 'None' or nextl is None or nextl == '':
if request.user.is_staff: if request.user.is_staff:
return redirect('acc_app:profile')
return redirect('acc_app:setup_info')
return redirect('client_side:home') return redirect('client_side:home')
return redirect(nextl) return redirect(nextl)
return render(request, 'accounts/login.html', { return render(request, 'accounts/login.html', {
@ -81,7 +83,7 @@ class ProfileShowDetailView(LoginRequiredMixin, OnlyAdminsMixin, DetailView):
class AvatarUpdateView(LoginRequiredMixin, OnlyAdminsMixin, UpdateView): class AvatarUpdateView(LoginRequiredMixin, OnlyAdminsMixin, UpdateView):
form_class = AvatarChangeForm
form_class = forms.AvatarChangeForm
template_name = 'accounts/settings/ch_info.html' template_name = 'accounts/settings/ch_info.html'
def get_object(self, queryset=None): def get_object(self, queryset=None):
@ -92,24 +94,45 @@ class AvatarUpdateView(LoginRequiredMixin, OnlyAdminsMixin, UpdateView):
class UpdateAccount(LoginRequiredMixin, OnlySuperUserMixin, UpdateView): class UpdateAccount(LoginRequiredMixin, OnlySuperUserMixin, UpdateView):
form_class = UserProfileForm
form_class = forms.UserProfileForm
pk_url_kwarg = 'uid' pk_url_kwarg = 'uid'
model = UserProfile model = UserProfile
template_name = 'accounts/settings/userprofile_form.html' template_name = 'accounts/settings/userprofile_form.html'
def form_valid(self, form): def form_valid(self, form):
r = super(UpdateAccount, self).form_valid(form)
r = super().form_valid(form)
messages.success(self.request, _('Saved successfully')) messages.success(self.request, _('Saved successfully'))
return r return r
def get_context_data(self, **kwargs):
context = {
'form_url': resolve_url('acc_app:edit_profile', self.object.pk)
}
context.update(kwargs)
return super().get_context_data(**context)
class UpdateSelfAccount(UpdateAccount):
form_class = UserProfileForm
class UpdateSelfAccount(LoginRequiredMixin, UpdateView):
form_class = forms.UserProfileForm
pk_url_kwarg = 'uid'
model = UserProfile
template_name = 'accounts/settings/userprofile_form.html'
def get_object(self, queryset=None): def get_object(self, queryset=None):
return self.request.user return self.request.user
def form_valid(self, form):
r = super().form_valid(form)
messages.success(self.request, _('Saved successfully'))
return r
def get_context_data(self, **kwargs):
context = {
'form_url': resolve_url('acc_app:setup_info')
}
context.update(kwargs)
return super().get_context_data(**context)
@login_required @login_required
@only_admins @only_admins
@ -195,7 +218,7 @@ class PermsUpdateView(UpdateView):
http_method_names = 'get', 'post' http_method_names = 'get', 'post'
template_name = 'accounts/perms/change_global_perms.html' template_name = 'accounts/perms/change_global_perms.html'
model = UserProfile model = UserProfile
form_class = UserPermissionsForm
form_class = forms.UserPermissionsForm
pk_url_kwarg = 'uid' pk_url_kwarg = 'uid'
def get_success_url(self): def get_success_url(self):
@ -259,7 +282,7 @@ def perms_edit(request, uid: int, klass_name, obj_id):
klass = apps.get_model(app_label, model_name) klass = apps.get_model(app_label, model_name)
obj = get_object_or_404(klass, pk=obj_id) obj = get_object_or_404(klass, pk=obj_id)
frm = MyUserObjectPermissionsForm(userprofile, obj, request.POST or None)
frm = forms.MyUserObjectPermissionsForm(userprofile, obj, request.POST or None)
if request.method == 'POST' and frm.is_valid(): if request.method == 'POST' and frm.is_valid():
frm.save_obj_perms() frm.save_obj_perms()
messages.success(request, _('Permissions has successfully updated')) messages.success(request, _('Permissions has successfully updated'))

2
djing/settings.py

@ -181,7 +181,7 @@ DEFAULT_PICTURE = '/static/img/user_ava.gif'
AUTH_USER_MODEL = 'accounts_app.UserProfile' AUTH_USER_MODEL = 'accounts_app.UserProfile'
LOGIN_URL = reverse_lazy('acc_app:login') LOGIN_URL = reverse_lazy('acc_app:login')
LOGIN_REDIRECT_URL = reverse_lazy('acc_app:profile')
LOGIN_REDIRECT_URL = reverse_lazy('acc_app:setup_info')
LOGOUT_URL = reverse_lazy('acc_app:logout') LOGOUT_URL = reverse_lazy('acc_app:logout')
PAGINATION_ITEMS_PER_PAGE = local_settings.PAGINATION_ITEMS_PER_PAGE PAGINATION_ITEMS_PER_PAGE = local_settings.PAGINATION_ITEMS_PER_PAGE

2
djing/views.py

@ -5,6 +5,6 @@ from django.shortcuts import redirect
@login_required @login_required
def home(request): def home(request):
if request.user.is_staff: if request.user.is_staff:
return redirect('acc_app:profile')
return redirect('acc_app:setup_info')
else: else:
return redirect('client_side:home') return redirect('client_side:home')

7
group_app/views.py

@ -9,6 +9,7 @@ from django.contrib import messages
from django.conf import settings from django.conf import settings
from djing.lib.decorators import only_admins from djing.lib.decorators import only_admins
from guardian.decorators import permission_required_or_403 as permission_required from guardian.decorators import permission_required_or_403 as permission_required
from guardian.shortcuts import get_objects_for_user
from djing.global_base_views import OrderedFilteredList from djing.global_base_views import OrderedFilteredList
from . import models from . import models
@ -27,6 +28,12 @@ class GroupListView(OrderedFilteredList):
model = models.Group model = models.Group
context_object_name = 'groups' context_object_name = 'groups'
def get_queryset(self):
queryset = get_objects_for_user(self.request.user,
'group_app.view_group', klass=self.model,
accept_global_perms=False)
return queryset
@method_decorator(login_decs, name='dispatch') @method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('group_app.change_group'), name='dispatch') @method_decorator(permission_required('group_app.change_group'), name='dispatch')

3
taskapp/locale/ru/LC_MESSAGES/django.po

@ -505,3 +505,6 @@ msgstr "Задачи, которые необходимо выполнить"
msgid "Task has been reminded" msgid "Task has been reminded"
msgstr "Напоминание о задаче отправлено" msgstr "Напоминание о задаче отправлено"
msgid "View all new tasks"
msgstr "Все незавершённые задачи"

2
taskapp/models.py

@ -75,7 +75,7 @@ class Task(models.Model):
class Meta: class Meta:
db_table = 'task' db_table = 'task'
ordering = ('priority', '-id')
ordering = ('-id',)
permissions = ( permissions = (
('can_viewall', _('Access to all tasks')), ('can_viewall', _('Access to all tasks')),
('can_remind', _('Reminders of tasks')) ('can_remind', _('Reminders of tasks'))

7
taskapp/templates/taskapp/footer_btns.html

@ -1,16 +1,23 @@
{% load i18n %} {% load i18n %}
<div class="btn-group btn-group-sm"> <div class="btn-group btn-group-sm">
{% if perms.taskapp.add_task %} {% if perms.taskapp.add_task %}
<a href="{% url 'taskapp:add' %}" class="btn btn-success"> <a href="{% url 'taskapp:add' %}" class="btn btn-success">
<span class="glyphicon glyphicon-plus"></span> {% trans 'Add new task' %} <span class="glyphicon glyphicon-plus"></span> {% trans 'Add new task' %}
</a> </a>
{% endif %} {% endif %}
{% if perms.taskapp.can_viewall %} {% if perms.taskapp.can_viewall %}
<a href="{% url 'taskapp:all_tasks' %}" class="btn btn-info"> <a href="{% url 'taskapp:all_tasks' %}" class="btn btn-info">
<span class="glyphicon glyphicon-baby-formula"></span> {% trans 'View all tasks' %} <span class="glyphicon glyphicon-baby-formula"></span> {% trans 'View all tasks' %}
</a> </a>
<a href="{% url 'taskapp:all_new_tasks' %}" class="btn btn-default">
<span class="glyphicon glyphicon-new-window"></span> {% trans 'View all new tasks' %}
</a>
{% endif %} {% endif %}
<a href="{% url 'taskapp:empty_tasks' %}" class="btn btn-default"> <a href="{% url 'taskapp:empty_tasks' %}" class="btn btn-default">
<span class="glyphicon glyphicon-eye-close"></span> {% trans 'View empty tasks' %} <span class="glyphicon glyphicon-eye-close"></span> {% trans 'View empty tasks' %}
</a> </a>
</div> </div>

1
taskapp/urls.py

@ -20,6 +20,7 @@ urlpatterns = [
path('own/', views.OwnTaskListView.as_view(), name='own_tasks'), path('own/', views.OwnTaskListView.as_view(), name='own_tasks'),
path('my/', views.MyTaskListView.as_view(), name='my_tasks'), path('my/', views.MyTaskListView.as_view(), name='my_tasks'),
path('all/', views.AllTasksListView.as_view(), name='all_tasks'), path('all/', views.AllTasksListView.as_view(), name='all_tasks'),
path('all_new/', views.AllNewTasksListView.as_view(), name='all_new_tasks'),
path('empty/', views.EmptyTasksListView.as_view(), name='empty_tasks'), path('empty/', views.EmptyTasksListView.as_view(), name='empty_tasks'),
path('check_news/', views.check_news, name='check_news') path('check_news/', views.check_news, name='check_news')
] ]

57
taskapp/views.py

@ -1,34 +1,28 @@
from django.contrib.auth.decorators import login_required
from datetime import datetime
from django.contrib.auth.decorators import login_required, permission_required
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.db.models import Count from django.db.models import Count
from django.shortcuts import redirect, get_object_or_404, resolve_url from django.shortcuts import redirect, get_object_or_404, resolve_url
from django.contrib import messages from django.contrib import messages
from django.utils.decorators import method_decorator
from django.views.generic import ListView, CreateView from django.views.generic import ListView, CreateView
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from django.conf import settings from django.conf import settings
from datetime import datetime
from django.views.generic.edit import FormMixin, DeleteView, UpdateView from django.views.generic.edit import FormMixin, DeleteView, UpdateView
from guardian.decorators import permission_required_or_403 as permission_required
from guardian.shortcuts import assign_perm
from chatbot.models import MessageQueue from chatbot.models import MessageQueue
from abonapp.models import Abon from abonapp.models import Abon
from djing import httpresponse_to_referrer from djing import httpresponse_to_referrer
from djing.lib import safe_int, MultipleException, RuTimedelta from djing.lib import safe_int, MultipleException, RuTimedelta
from djing.lib.decorators import only_admins, json_view from djing.lib.decorators import only_admins, json_view
from djing.lib.mixins import LoginAdminMixin, LoginAdminPermissionMixin
from .handle import TaskException from .handle import TaskException
from .models import Task, ExtraComment from .models import Task, ExtraComment
from .forms import TaskFrm, ExtraCommentForm from .forms import TaskFrm, ExtraCommentForm
login_decs = login_required, only_admins
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class NewTasksView(ListView):
class NewTasksView(LoginAdminPermissionMixin, ListView):
""" """
Show new tasks Show new tasks
""" """
@ -36,6 +30,7 @@ class NewTasksView(ListView):
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
template_name = 'taskapp/tasklist.html' template_name = 'taskapp/tasklist.html'
context_object_name = 'tasks' context_object_name = 'tasks'
permission_required = 'taskapp.view_task'
def get_queryset(self): def get_queryset(self):
return Task.objects.filter(recipients=self.request.user, state='S') \ return Task.objects.filter(recipients=self.request.user, state='S') \
@ -43,8 +38,6 @@ class NewTasksView(ListView):
.select_related('abon', 'abon__street', 'abon__group', 'author') .select_related('abon', 'abon__street', 'abon__group', 'author')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class FailedTasksView(NewTasksView): class FailedTasksView(NewTasksView):
""" """
Show crashed tasks Show crashed tasks
@ -57,8 +50,6 @@ class FailedTasksView(NewTasksView):
.select_related('abon', 'abon__street', 'abon__group', 'author') .select_related('abon', 'abon__street', 'abon__group', 'author')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class FinishedTaskListView(NewTasksView): class FinishedTaskListView(NewTasksView):
template_name = 'taskapp/tasklist_finish.html' template_name = 'taskapp/tasklist_finish.html'
@ -67,8 +58,6 @@ class FinishedTaskListView(NewTasksView):
.select_related('abon', 'abon__street', 'abon__group', 'author') .select_related('abon', 'abon__street', 'abon__group', 'author')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class OwnTaskListView(NewTasksView): class OwnTaskListView(NewTasksView):
template_name = 'taskapp/tasklist_own.html' template_name = 'taskapp/tasklist_own.html'
@ -79,8 +68,6 @@ class OwnTaskListView(NewTasksView):
.select_related('abon', 'abon__street', 'abon__group') .select_related('abon', 'abon__street', 'abon__group')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class MyTaskListView(NewTasksView): class MyTaskListView(NewTasksView):
template_name = 'taskapp/tasklist.html' template_name = 'taskapp/tasklist.html'
@ -90,21 +77,24 @@ class MyTaskListView(NewTasksView):
.select_related('abon', 'abon__street', 'abon__group', 'author') .select_related('abon', 'abon__street', 'abon__group', 'author')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.can_viewall'), name='dispatch')
class AllTasksListView(ListView):
class AllTasksListView(LoginAdminMixin, LoginRequiredMixin, ListView):
http_method_names = ('get',) http_method_names = ('get',)
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
template_name = 'taskapp/tasklist_all.html' template_name = 'taskapp/tasklist_all.html'
context_object_name = 'tasks' context_object_name = 'tasks'
permission_required = 'taskapp.can_viewall'
def get_queryset(self): def get_queryset(self):
return Task.objects.annotate(comment_count=Count('extracomment')) \ return Task.objects.annotate(comment_count=Count('extracomment')) \
.select_related('abon', 'abon__street', 'abon__group', 'author') .select_related('abon', 'abon__street', 'abon__group', 'author')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class AllNewTasksListView(AllTasksListView):
def get_queryset(self):
return super(AllNewTasksListView, self).get_queryset().filter(state='S')
class EmptyTasksListView(NewTasksView): class EmptyTasksListView(NewTasksView):
template_name = 'taskapp/tasklist_empty.html' template_name = 'taskapp/tasklist_empty.html'
@ -125,8 +115,7 @@ def task_delete(request, task_id):
return redirect('taskapp:home') return redirect('taskapp:home')
@method_decorator(login_decs, name='dispatch')
class TaskUpdateView(UpdateView):
class TaskUpdateView(LoginAdminMixin, UpdateView):
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
template_name = 'taskapp/add_edit_task.html' template_name = 'taskapp/add_edit_task.html'
form_class = TaskFrm form_class = TaskFrm
@ -283,12 +272,11 @@ def check_news(request):
return r return r
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.add_extracomment'), name='dispatch')
class NewCommentView(CreateView):
class NewCommentView(LoginAdminMixin, LoginRequiredMixin, CreateView):
form_class = ExtraCommentForm form_class = ExtraCommentForm
model = ExtraComment model = ExtraComment
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
permission_required = 'taskapp.add_extracomment'
def form_valid(self, form): def form_valid(self, form):
self.task = get_object_or_404(Task, pk=self.kwargs.get('task_id')) self.task = get_object_or_404(Task, pk=self.kwargs.get('task_id'))
@ -296,16 +284,19 @@ class NewCommentView(CreateView):
author=self.request.user, author=self.request.user,
task=self.task task=self.task
) )
author = self.object.author
assign_perm('taskapp.change_extracomment', author, self.object)
assign_perm('taskapp.delete_extracomment', author, self.object)
assign_perm('taskapp.view_extracomment', author, self.object)
return FormMixin.form_valid(self, form) return FormMixin.form_valid(self, form)
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.delete_extracomment'), name='dispatch')
class DeleteCommentView(DeleteView):
class DeleteCommentView(LoginAdminPermissionMixin, DeleteView):
model = ExtraComment model = ExtraComment
pk_url_kwarg = 'comment_id' pk_url_kwarg = 'comment_id'
http_method_names = ('get', 'post') http_method_names = ('get', 'post')
template_name = 'taskapp/comments/extracomment_confirm_delete.html' template_name = 'taskapp/comments/extracomment_confirm_delete.html'
permission_required = 'taskapp.delete_extracomment'
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = { context = {

2
templates/all_base.html

@ -64,7 +64,7 @@
<li class="dropdown"> <li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans 'Other' %} <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans 'Other' %} <b class="caret"></b></a>
<ul class="dropdown-menu"> <ul class="dropdown-menu">
<li><a href="{% url 'acc_app:profile' %}"><span class="glyphicon glyphicon-wrench"></span> {% trans 'Settings' %}</a></li>
<li><a href="{% url 'acc_app:setup_info' %}"><span class="glyphicon glyphicon-wrench"></span> {% trans 'Settings' %}</a></li>
<li><a href="{% url 'acc_app:logout' %}"><span class="glyphicon glyphicon-log-out"></span> {% trans 'Exit' %}</a></li> <li><a href="{% url 'acc_app:logout' %}"><span class="glyphicon glyphicon-log-out"></span> {% trans 'Exit' %}</a></li>
</ul> </ul>
</li> </li>

2
templates/base.html

@ -8,7 +8,7 @@
<div class="row profile_img"> <div class="row profile_img">
<div class="col-sm-5"> <div class="col-sm-5">
<a href="{% url 'acc_app:profile' %}">
<a href="{% url 'acc_app:setup_info' %}">
<img alt="profile image" class="img-circle img-responsive" src="{{ user.get_min_ava }}"/> <img alt="profile image" class="img-circle img-responsive" src="{{ user.get_min_ava }}"/>
</a> </a>

Loading…
Cancel
Save