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['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['group'] = group
return context
@ -83,14 +82,15 @@ class PeoplesListView(LoginRequiredMixin, OnlyAdminsMixin,
class GroupListView(LoginRequiredMixin, OnlyAdminsMixin, OrderedFilteredList):
context_object_name = 'groups'
template_name = 'abonapp/group_list.html'
queryset = Group.objects.annotate(usercount=Count('abon'))
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,

5
accounts_app/forms.py

@ -46,10 +46,11 @@ class UserPermissionsForm(forms.ModelForm):
class Meta:
model = UserProfile
fields = ('avatar', 'password', 'groups', 'user_permissions', 'responsibility_groups', 'is_superuser')
fields = ('user_permissions', 'is_superuser')
class UserProfileForm(forms.ModelForm):
class Meta:
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"
msgstr "Последняя авторизация"
#: templates/accounts/index.html:30
msgid "All permissions"
msgstr "Административный доступ (все права)"
#: templates/accounts/login.html:5
msgid "Auth"
msgstr "Аутентификация"
@ -309,10 +305,6 @@ msgstr "Изменение прав доступа для выбранного
msgid "The list of user groups to which the account has access"
msgstr "Список групп абонентов, к которым учётка имеет доступ"
#: views.py:33
msgid "Wrong login or password, please try again"
msgstr "Неправильный логин или пароль, попробуйте ещё раз"
#: views.py:121
msgid "New password is empty, fill it"
msgstr "Новый пароль пустой, придумайте себе пароль"
@ -382,3 +374,6 @@ msgstr "Настройки"
msgid "Name and surname"
msgstr "Имя и отчество"
msgid "Is superuser"
msgstr "Является суперпользователем"

4
accounts_app/templates/accounts/index.html

@ -27,8 +27,8 @@
</tr>
{% if request.user.is_superuser %}
<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>
{% endif %}
</tbody>

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

@ -5,7 +5,7 @@
<ol class="breadcrumb">
<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:profile' %}">{{ user.username }}</a></li>
<li><a href="{% url 'acc_app:setup_info' %}">{{ object.username }}</a></li>
<li class="active">{% trans 'Options' %}</li>
</ol>
{% endblock %}
@ -17,10 +17,9 @@
{% block main %}
<div class="row">
<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">
<button type="submit" class="btn btn-primary">{% trans 'Save' %}</button>
@ -30,11 +29,10 @@
</div>
<div class="col-sm-9">
<h3>{{ user.username|default:_('Not assigned') }}</h3>
<h3>{{ object.username|default:_('Not assigned') }}</h3>
<ul class="nav nav-tabs">
<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' %}
</a>
</li>

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

@ -2,7 +2,7 @@
{% load globaltags i18n bootstrap3 %}
{% 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 %}

18
accounts_app/urls.py

@ -11,8 +11,6 @@ urlpatterns = [
path('logout/', LogoutView.as_view(next_page='acc_app:login'), name='logout'),
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('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/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>/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')
]

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.urls import NoReverseMatch
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.conf import settings
from group_app.models import Group
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.mixins import OnlyAdminsMixin, LoginAdminPermissionMixin, OnlySuperUserMixin
from guardian.decorators import permission_required_or_403 as permission_required
@ -28,7 +28,9 @@ class CustomLoginView(LoginView):
template_name = 'accounts/login.html'
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)
def get_success_url(self):
@ -36,7 +38,7 @@ class CustomLoginView(LoginView):
if next_url:
return next_url
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')
@ -49,7 +51,7 @@ def location_login(request):
login(request, auser)
if nextl == 'None' or nextl is None or nextl == '':
if request.user.is_staff:
return redirect('acc_app:profile')
return redirect('acc_app:setup_info')
return redirect('client_side:home')
return redirect(nextl)
return render(request, 'accounts/login.html', {
@ -81,7 +83,7 @@ class ProfileShowDetailView(LoginRequiredMixin, OnlyAdminsMixin, DetailView):
class AvatarUpdateView(LoginRequiredMixin, OnlyAdminsMixin, UpdateView):
form_class = AvatarChangeForm
form_class = forms.AvatarChangeForm
template_name = 'accounts/settings/ch_info.html'
def get_object(self, queryset=None):
@ -92,24 +94,45 @@ class AvatarUpdateView(LoginRequiredMixin, OnlyAdminsMixin, UpdateView):
class UpdateAccount(LoginRequiredMixin, OnlySuperUserMixin, UpdateView):
form_class = UserProfileForm
form_class = forms.UserProfileForm
pk_url_kwarg = 'uid'
model = UserProfile
template_name = 'accounts/settings/userprofile_form.html'
def form_valid(self, form):
r = super(UpdateAccount, self).form_valid(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: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):
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
@only_admins
@ -195,7 +218,7 @@ class PermsUpdateView(UpdateView):
http_method_names = 'get', 'post'
template_name = 'accounts/perms/change_global_perms.html'
model = UserProfile
form_class = UserPermissionsForm
form_class = forms.UserPermissionsForm
pk_url_kwarg = 'uid'
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)
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():
frm.save_obj_perms()
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'
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')
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
def home(request):
if request.user.is_staff:
return redirect('acc_app:profile')
return redirect('acc_app:setup_info')
else:
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 djing.lib.decorators import only_admins
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 . import models
@ -27,6 +28,12 @@ class GroupListView(OrderedFilteredList):
model = models.Group
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(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"
msgstr "Напоминание о задаче отправлено"
msgid "View all new tasks"
msgstr "Все незавершённые задачи"

2
taskapp/models.py

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

7
taskapp/templates/taskapp/footer_btns.html

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

1
taskapp/urls.py

@ -20,6 +20,7 @@ urlpatterns = [
path('own/', views.OwnTaskListView.as_view(), name='own_tasks'),
path('my/', views.MyTaskListView.as_view(), name='my_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('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.db.models import Count
from django.shortcuts import redirect, get_object_or_404, resolve_url
from django.contrib import messages
from django.utils.decorators import method_decorator
from django.views.generic import ListView, CreateView
from django.utils.translation import ugettext as _
from django.conf import settings
from datetime import datetime
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 abonapp.models import Abon
from djing import httpresponse_to_referrer
from djing.lib import safe_int, MultipleException, RuTimedelta
from djing.lib.decorators import only_admins, json_view
from djing.lib.mixins import LoginAdminMixin, LoginAdminPermissionMixin
from .handle import TaskException
from .models import Task, ExtraComment
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
"""
@ -36,6 +30,7 @@ class NewTasksView(ListView):
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
template_name = 'taskapp/tasklist.html'
context_object_name = 'tasks'
permission_required = 'taskapp.view_task'
def get_queryset(self):
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')
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.view_task'), name='dispatch')
class FailedTasksView(NewTasksView):
"""
Show crashed tasks
@ -57,8 +50,6 @@ class FailedTasksView(NewTasksView):
.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):
template_name = 'taskapp/tasklist_finish.html'
@ -67,8 +58,6 @@ class FinishedTaskListView(NewTasksView):
.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):
template_name = 'taskapp/tasklist_own.html'
@ -79,8 +68,6 @@ class OwnTaskListView(NewTasksView):
.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):
template_name = 'taskapp/tasklist.html'
@ -90,21 +77,24 @@ class MyTaskListView(NewTasksView):
.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',)
paginate_by = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10)
template_name = 'taskapp/tasklist_all.html'
context_object_name = 'tasks'
permission_required = 'taskapp.can_viewall'
def get_queryset(self):
return Task.objects.annotate(comment_count=Count('extracomment')) \
.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):
template_name = 'taskapp/tasklist_empty.html'
@ -125,8 +115,7 @@ def task_delete(request, task_id):
return redirect('taskapp:home')
@method_decorator(login_decs, name='dispatch')
class TaskUpdateView(UpdateView):
class TaskUpdateView(LoginAdminMixin, UpdateView):
http_method_names = ('get', 'post')
template_name = 'taskapp/add_edit_task.html'
form_class = TaskFrm
@ -283,12 +272,11 @@ def check_news(request):
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
model = ExtraComment
http_method_names = ('get', 'post')
permission_required = 'taskapp.add_extracomment'
def form_valid(self, form):
self.task = get_object_or_404(Task, pk=self.kwargs.get('task_id'))
@ -296,16 +284,19 @@ class NewCommentView(CreateView):
author=self.request.user,
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)
@method_decorator(login_decs, name='dispatch')
@method_decorator(permission_required('taskapp.delete_extracomment'), name='dispatch')
class DeleteCommentView(DeleteView):
class DeleteCommentView(LoginAdminPermissionMixin, DeleteView):
model = ExtraComment
pk_url_kwarg = 'comment_id'
http_method_names = ('get', 'post')
template_name = 'taskapp/comments/extracomment_confirm_delete.html'
permission_required = 'taskapp.delete_extracomment'
def get_context_data(self, **kwargs):
context = {

2
templates/all_base.html

@ -64,7 +64,7 @@
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">{% trans 'Other' %} <b class="caret"></b></a>
<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>
</ul>
</li>

2
templates/base.html

@ -8,7 +8,7 @@
<div class="row profile_img">
<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 }}"/>
</a>

Loading…
Cancel
Save