From d46b90010de3cd8d62bb5b6ad896b9f2a301ef9b Mon Sep 17 00:00:00 2001 From: Yuriy Kulakov Date: Thu, 4 Mar 2021 18:22:49 +0300 Subject: [PATCH] Added permissions system to control page --- main/migrations/0005_auto_20210302_2255.py | 17 +++++++++++++ main/migrations/0006_delete_userprofile.py | 16 ++++++++++++ main/migrations/0007_userprofile.py | 29 ++++++++++++++++++++++ main/migrations/0008_auto_20210303_2305.py | 17 +++++++++++++ main/templates/base/menu.html | 3 +++ main/templates/pages/adm_ruleset.html | 23 ++++++++--------- main/views.py | 26 ++++++++++++++----- static/main/js/control.js | 9 +++++++ 8 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 main/migrations/0005_auto_20210302_2255.py create mode 100644 main/migrations/0006_delete_userprofile.py create mode 100644 main/migrations/0007_userprofile.py create mode 100644 main/migrations/0008_auto_20210303_2305.py create mode 100644 static/main/js/control.js diff --git a/main/migrations/0005_auto_20210302_2255.py b/main/migrations/0005_auto_20210302_2255.py new file mode 100644 index 0000000..dff2dc2 --- /dev/null +++ b/main/migrations/0005_auto_20210302_2255.py @@ -0,0 +1,17 @@ +# Generated by Django 3.1.6 on 2021-03-02 19:55 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0004_rolechangelogs'), + ] + + operations = [ + migrations.AlterModelOptions( + name='userprofile', + options={'permissions': [('admin', 'Have access to control page')]}, + ), + ] diff --git a/main/migrations/0006_delete_userprofile.py b/main/migrations/0006_delete_userprofile.py new file mode 100644 index 0000000..23adaab --- /dev/null +++ b/main/migrations/0006_delete_userprofile.py @@ -0,0 +1,16 @@ +# Generated by Django 3.1.6 on 2021-03-03 19:32 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0005_auto_20210302_2255'), + ] + + operations = [ + migrations.DeleteModel( + name='UserProfile', + ), + ] diff --git a/main/migrations/0007_userprofile.py b/main/migrations/0007_userprofile.py new file mode 100644 index 0000000..2b05dd7 --- /dev/null +++ b/main/migrations/0007_userprofile.py @@ -0,0 +1,29 @@ +# Generated by Django 3.1.6 on 2021-03-03 19:35 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('main', '0006_delete_userprofile'), + ] + + operations = [ + migrations.CreateModel( + name='UserProfile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('role', models.CharField(default='None', max_length=100)), + ('image', models.URLField(blank=True, null=True)), + ('name', models.CharField(default='None', max_length=100)), + ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': [('control_access', 'User has access to control page')], + }, + ), + ] diff --git a/main/migrations/0008_auto_20210303_2305.py b/main/migrations/0008_auto_20210303_2305.py new file mode 100644 index 0000000..8082682 --- /dev/null +++ b/main/migrations/0008_auto_20210303_2305.py @@ -0,0 +1,17 @@ +# Generated by Django 3.1.6 on 2021-03-03 20:05 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0007_userprofile'), + ] + + operations = [ + migrations.AlterModelOptions( + name='userprofile', + options={}, + ), + ] diff --git a/main/templates/base/menu.html b/main/templates/base/menu.html index 8448b0c..f64ceb3 100644 --- a/main/templates/base/menu.html +++ b/main/templates/base/menu.html @@ -11,6 +11,9 @@ {% if request.user.is_authenticated %}
Профиль + {% if perms.main.has_control_access %} + Управление + {% endif %} Выйти
{% else %} diff --git a/main/templates/pages/adm_ruleset.html b/main/templates/pages/adm_ruleset.html index 1bddc5f..387cd73 100644 --- a/main/templates/pages/adm_ruleset.html +++ b/main/templates/pages/adm_ruleset.html @@ -2,7 +2,7 @@ {% load static %} -{% block title %}Управление{%endblock %} +{% block title %}Управление{% endblock %} {% block heading %}Управление{% endblock %} @@ -16,19 +16,24 @@

Основная информация о странице

+ {% block form %}
{% csrf_token %}
+ {% block hidden_form %}
{% for field in form.users %} {{ field.tag }} {% endfor %}
+ {% endblock %}
Список сотрудников
+ + {% block table %} @@ -52,10 +57,12 @@
+ {% endblock%}
+ {% block count %}
@@ -91,19 +98,11 @@
+ {% endblock %} + {% endblock %}
- + {% endblock %} diff --git a/main/views.py b/main/views.py index 72d4e52..517ea84 100644 --- a/main/views.py +++ b/main/views.py @@ -1,22 +1,20 @@ -from django.contrib.auth.decorators import login_required from django.contrib.auth.forms import PasswordResetForm -from django.contrib.auth.models import User from django.contrib.auth.tokens import default_token_generator +from django.contrib.contenttypes.models import ContentType from django.shortcuts import render, get_list_or_404 from django.urls import reverse_lazy from django.views.generic import FormView -from django_registration.backends.one_step.views import RegistrationView from access_controller.settings import EMAIL_HOST_USER from main.extra_func import check_user_exist, update_profile, get_user_organization, \ make_engineer, make_light_agent, get_users_list -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Permission from main.models import UserProfile from main.forms import CustomRegistrationForm, AdminPageUsers from django_registration.views import RegistrationView from django.contrib.auth.decorators import login_required -from django.contrib.auth.mixins import LoginRequiredMixin +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin from django.core.exceptions import PermissionDenied import logging @@ -55,12 +53,27 @@ class CustomRegistrationView(RegistrationView): ) forms.save(**opts) update_profile(user.userprofile) + self.set_permission(user) return user else: raise ValueError('Непредвиденная ошибка') else: self.is_allowed = False + @staticmethod + def set_permission(user) -> None: + """ + Дает разрешение на просмотр страница администратора, если пользователь имеет роль admin + """ + + content_type = ContentType.objects.get_for_model(UserProfile) + permission, created = Permission.objects.get_or_create( + codename='has_control_access', + content_type=content_type, + ) + if user.userprofile.role == 'admin': + user.user_permissions.add(permission) + def get_success_url(self, user=None): """ Возвращает url-адрес страницы, куда нужно перейти после успешной/неуспешной регистрации @@ -100,7 +113,8 @@ def main_page(request): return render(request, 'pages/index.html') -class AdminPageView(FormView, LoginRequiredMixin): +class AdminPageView(FormView, LoginRequiredMixin, PermissionRequiredMixin): + permission_required = 'main.has_control_access' template_name = 'pages/adm_ruleset.html' form_class = AdminPageUsers success_url = '/control/' diff --git a/static/main/js/control.js b/static/main/js/control.js new file mode 100644 index 0000000..1fd4f9c --- /dev/null +++ b/static/main/js/control.js @@ -0,0 +1,9 @@ +"use strict"; +let checkboxes = document.getElementsByName("users"); +let fields = document.querySelectorAll(".checkbox_field"); +if (checkboxes.length == fields.length) { + for (let i = 0; i < fields.length; ++i) { + let el = checkboxes[i].cloneNode(true); + fields[i].appendChild(el); + } +}