From 6f3356ad25dca886a332b7d46d8fe5f47df857ed Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sun, 14 Mar 2021 20:33:57 +0300 Subject: [PATCH 01/13] Removed logging settings --- access_controller/settings.py | 36 +---------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/access_controller/settings.py b/access_controller/settings.py index 96703b6..afa3c1a 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -143,41 +143,7 @@ AUTHENTICATION_BACKENDS = [ # Logging system # https://docs.djangoproject.com/en/3.1/topics/logging/ -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'verbose': { - 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}', - 'style': '{', - }, - 'simple': { - 'format': '{levelname} {message}', - 'style': '{', - }, - }, - 'handlers': { - 'console': { - 'level': 'INFO', - 'class': 'logging.StreamHandler', - 'formatter': 'simple' - }, - 'mail_admins': { - 'level': 'ERROR', - 'class': 'django.utils.log.AdminEmailHandler', - } - }, - 'loggers': { - 'django': { - 'handlers': ['console'], - 'propagate': True, - }, - 'main.index': { - 'handlers': ['console'], - 'level': 'INFO', - } - } -} + ZENDESK_ROLES = { 'engineer': 360005209000, From e193ae0f559a560f47862b3a0f64ae60af6c87b5 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sun, 14 Mar 2021 20:34:46 +0300 Subject: [PATCH 02/13] Added default date to change_time field --- main/migrations/0009_auto_20210309_2317.py | 61 ++++++++++++++++++++++ main/models.py | 3 +- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 main/migrations/0009_auto_20210309_2317.py diff --git a/main/migrations/0009_auto_20210309_2317.py b/main/migrations/0009_auto_20210309_2317.py new file mode 100644 index 0000000..a59717a --- /dev/null +++ b/main/migrations/0009_auto_20210309_2317.py @@ -0,0 +1,61 @@ +# Generated by Django 3.1.6 on 2021-03-09 20:17 + +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', '0008_auto_20210303_2305'), + ] + + operations = [ + migrations.AlterField( + model_name='rolechangelogs', + name='change_time', + field=models.DateTimeField(help_text='Дата и время изменения роли'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='changed_by', + field=models.ForeignKey(help_text='Кем была изменена роль', on_delete=django.db.models.deletion.CASCADE, related_name='changed_by', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='name', + field=models.TextField(help_text='Имя пользователя'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='new_role', + field=models.TextField(help_text='Присвоенная роль'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='user', + field=models.ForeignKey(help_text='Пользователь, которому присвоили другую роль', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='userprofile', + name='image', + field=models.URLField(blank=True, help_text='Аватарка', null=True), + ), + migrations.AlterField( + model_name='userprofile', + name='name', + field=models.CharField(default='None', help_text='Имя пользователя на нашем сайте', max_length=100), + ), + migrations.AlterField( + model_name='userprofile', + name='role', + field=models.CharField(default='None', help_text='Код роли пользователя', max_length=100), + ), + migrations.AlterField( + model_name='userprofile', + name='user', + field=models.OneToOneField(help_text='Пользователь', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/main/models.py b/main/models.py index f8f8385..0fbc988 100644 --- a/main/models.py +++ b/main/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver +from django.utils import timezone class UserProfile(models.Model): @@ -29,5 +30,5 @@ class RoleChangeLogs(models.Model): user = models.ForeignKey(to=User, on_delete=models.CASCADE, help_text='Пользователь, которому присвоили другую роль') name = models.TextField(help_text='Имя пользователя') new_role = models.TextField(help_text='Присвоенная роль') - change_time = models.DateTimeField(help_text='Дата и время изменения роли') + change_time = models.DateTimeField(help_text='Дата и время изменения роли', default=timezone.now) changed_by = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='changed_by', help_text='Кем была изменена роль') From b8883cc8575da0a8bc527e72b33eb226ec731b7d Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sun, 14 Mar 2021 21:27:26 +0300 Subject: [PATCH 03/13] Added logging to database --- main/extra_func.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index 691bd37..5fe7edf 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,13 +1,18 @@ +import logging import os +from django.utils import timezone from zenpy import Zenpy from zenpy.lib.exception import APIException -from main.models import UserProfile +from main.models import UserProfile, RoleChangeLogs from access_controller.settings import ZENDESK_ROLES as ROLES +# from access_controller.main.models import RoleChangeLogs + + class ZendeskAdmin: """ Класс **ZendeskAdmin** существует, чтобы в каждой фунциии отдельно не проверять аккаунт администратора @@ -28,7 +33,7 @@ class ZendeskAdmin: email: str = os.getenv('ACCESS_CONTROLLER_API_EMAIL') token: str = os.getenv('ACCESS_CONTROLLER_API_TOKEN') password: str = os.getenv('ACCESS_CONTROLLER_API_PASSWORD') - _instance=None + _instance = None def __new__(cls, *args, **kwargs): if cls._instance is None: @@ -191,3 +196,27 @@ def check_user_auth(email: str, password: str) -> bool: except APIException: return False return True + + +class DatabaseHandler(logging.Handler): + def __init__(self): + logging.Handler.__init__(self) + self.database = RoleChangeLogs() + + def emit(self, record): + # admin = ZendeskAdmin() + user = record.msg + # data = UserProfile.objects.filter(user=user.user) + self.database.name = user.name + self.database.new_role = user.role + self.database.user = user.user + self.database.changed_by = user.user + self.database.save() + + +def log(user): + dbhandler = DatabaseHandler() + logging.getLogger('MY_LOGGER').addHandler(dbhandler) + logger = logging.getLogger('MY_LOGGER') + logger.setLevel('INFO') + logger.info(user) From 0a8685383842d6498c8c28527c65885818e5b20c Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sun, 14 Mar 2021 20:33:57 +0300 Subject: [PATCH 04/13] Removed logging settings --- access_controller/settings.py | 36 +---------------------------------- 1 file changed, 1 insertion(+), 35 deletions(-) diff --git a/access_controller/settings.py b/access_controller/settings.py index deadf32..b96d66a 100644 --- a/access_controller/settings.py +++ b/access_controller/settings.py @@ -142,41 +142,7 @@ AUTHENTICATION_BACKENDS = [ # Logging system # https://docs.djangoproject.com/en/3.1/topics/logging/ -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'formatters': { - 'verbose': { - 'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}', - 'style': '{', - }, - 'simple': { - 'format': '{levelname} {message}', - 'style': '{', - }, - }, - 'handlers': { - 'console': { - 'level': 'INFO', - 'class': 'logging.StreamHandler', - 'formatter': 'simple' - }, - 'mail_admins': { - 'level': 'ERROR', - 'class': 'django.utils.log.AdminEmailHandler', - } - }, - 'loggers': { - 'django': { - 'handlers': ['console'], - 'propagate': True, - }, - 'main.index': { - 'handlers': ['console'], - 'level': 'INFO', - } - } -} + ZENDESK_ROLES = { 'engineer': 360005209000, From 063c2bf17ae16ec7859305ee9a45e0412b6985b8 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sun, 14 Mar 2021 20:34:46 +0300 Subject: [PATCH 05/13] Added default date to change_time field --- main/migrations/0009_auto_20210309_2317.py | 61 ++++++++++++++++++++++ main/models.py | 3 +- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 main/migrations/0009_auto_20210309_2317.py diff --git a/main/migrations/0009_auto_20210309_2317.py b/main/migrations/0009_auto_20210309_2317.py new file mode 100644 index 0000000..a59717a --- /dev/null +++ b/main/migrations/0009_auto_20210309_2317.py @@ -0,0 +1,61 @@ +# Generated by Django 3.1.6 on 2021-03-09 20:17 + +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', '0008_auto_20210303_2305'), + ] + + operations = [ + migrations.AlterField( + model_name='rolechangelogs', + name='change_time', + field=models.DateTimeField(help_text='Дата и время изменения роли'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='changed_by', + field=models.ForeignKey(help_text='Кем была изменена роль', on_delete=django.db.models.deletion.CASCADE, related_name='changed_by', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='name', + field=models.TextField(help_text='Имя пользователя'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='new_role', + field=models.TextField(help_text='Присвоенная роль'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='user', + field=models.ForeignKey(help_text='Пользователь, которому присвоили другую роль', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='userprofile', + name='image', + field=models.URLField(blank=True, help_text='Аватарка', null=True), + ), + migrations.AlterField( + model_name='userprofile', + name='name', + field=models.CharField(default='None', help_text='Имя пользователя на нашем сайте', max_length=100), + ), + migrations.AlterField( + model_name='userprofile', + name='role', + field=models.CharField(default='None', help_text='Код роли пользователя', max_length=100), + ), + migrations.AlterField( + model_name='userprofile', + name='user', + field=models.OneToOneField(help_text='Пользователь', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/main/models.py b/main/models.py index 112e29e..381a7df 100644 --- a/main/models.py +++ b/main/models.py @@ -2,6 +2,7 @@ from django.db import models from django.contrib.auth.models import User from django.db.models.signals import post_save from django.dispatch import receiver +from django.utils import timezone class UserProfile(models.Model): @@ -37,6 +38,6 @@ class RoleChangeLogs(models.Model): name = models.TextField(help_text='Имя пользователя') old_role = models.IntegerField(default=0, help_text='Старая роль') new_role = models.IntegerField(default=0, help_text='Присвоенная роль') - change_time = models.DateTimeField(help_text='Дата и время изменения роли') + change_time = models.DateTimeField(help_text='Дата и время изменения роли', default=timezone.now) changed_by = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='changed_by', help_text='Кем была изменена роль') From da53c34e50e044187b7ab939d76933ae25821838 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sun, 14 Mar 2021 21:27:26 +0300 Subject: [PATCH 06/13] Added logging to database --- main/extra_func.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/main/extra_func.py b/main/extra_func.py index ada4a88..c9e72cb 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -1,3 +1,4 @@ +import logging import os from datetime import timedelta, datetime, date @@ -5,6 +6,7 @@ from django.contrib.auth.models import User from zenpy import Zenpy from zenpy.lib.exception import APIException + from access_controller.settings import ZENDESK_ROLES as ROLES, ONE_DAY from main.models import UserProfile, RoleChangeLogs @@ -382,3 +384,27 @@ class StatisticData: """ self.statistic.clear() self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0) + + +class DatabaseHandler(logging.Handler): + def __init__(self): + logging.Handler.__init__(self) + self.database = RoleChangeLogs() + + def emit(self, record): + # admin = ZendeskAdmin() + user = record.msg + # data = UserProfile.objects.filter(user=user.user) + self.database.name = user.name + self.database.new_role = user.role + self.database.user = user.user + self.database.changed_by = user.user + self.database.save() + + +def log(user): + dbhandler = DatabaseHandler() + logging.getLogger('MY_LOGGER').addHandler(dbhandler) + logger = logging.getLogger('MY_LOGGER') + logger.setLevel('INFO') + logger.info(user) From 933ebb72d698a3ff9b943293b6b8048bce9baaca Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Mon, 15 Mar 2021 21:03:11 +0300 Subject: [PATCH 07/13] Updated database logging --- access_controller/urls.py | 1 - main/extra_func.py | 6 ++++- main/migrations/0013_merge_20210315_1948.py | 14 ++++++++++ main/migrations/0014_auto_20210315_1948.py | 29 +++++++++++++++++++++ 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 main/migrations/0013_merge_20210315_1948.py create mode 100644 main/migrations/0014_auto_20210315_1948.py diff --git a/access_controller/urls.py b/access_controller/urls.py index da72f11..bca3495 100644 --- a/access_controller/urls.py +++ b/access_controller/urls.py @@ -16,7 +16,6 @@ Including another URLconf from django.contrib import admin from django.contrib.auth import views as auth_views from django.urls import path, include -from main.views import work_page, work_hand_over, work_become_engineer, AdminPageView from main.views import main_page, profile_page, CustomRegistrationView, CustomLoginView from main.views import work_page, work_hand_over, work_become_engineer, \ diff --git a/main/extra_func.py b/main/extra_func.py index bb3ade5..eedc4aa 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -397,9 +397,13 @@ class DatabaseHandler(logging.Handler): user = record.msg # data = UserProfile.objects.filter(user=user.user) self.database.name = user.name - self.database.new_role = user.role self.database.user = user.user self.database.changed_by = user.user + if user.custom_role_id == ROLES['engineer']: + self.database.old_role = ROLES['light_agent'] + elif user.custom_role_id == ROLES['light_agent']: + self.database.old_role = ROLES['engineer'] + self.database.new_role = user.custom_role_id self.database.save() diff --git a/main/migrations/0013_merge_20210315_1948.py b/main/migrations/0013_merge_20210315_1948.py new file mode 100644 index 0000000..c3fa7f0 --- /dev/null +++ b/main/migrations/0013_merge_20210315_1948.py @@ -0,0 +1,14 @@ +# Generated by Django 3.1.6 on 2021-03-15 16:48 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0012_auto_20210312_1225'), + ('main', '0009_auto_20210309_2317'), + ] + + operations = [ + ] diff --git a/main/migrations/0014_auto_20210315_1948.py b/main/migrations/0014_auto_20210315_1948.py new file mode 100644 index 0000000..20610af --- /dev/null +++ b/main/migrations/0014_auto_20210315_1948.py @@ -0,0 +1,29 @@ +# Generated by Django 3.1.6 on 2021-03-15 16:48 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0013_merge_20210315_1948'), + ] + + operations = [ + migrations.AlterField( + model_name='rolechangelogs', + name='change_time', + field=models.DateTimeField(default=django.utils.timezone.now, help_text='Дата и время изменения роли'), + ), + migrations.AlterField( + model_name='rolechangelogs', + name='new_role', + field=models.IntegerField(default=0, help_text='Присвоенная роль'), + ), + migrations.AlterField( + model_name='userprofile', + name='role', + field=models.CharField(default='None', help_text='Глобальное имя роли пользователя', max_length=100), + ), + ] From 259ab76cba22d3453e9a855f30343d3157db1fd2 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Wed, 17 Mar 2021 03:13:37 +0300 Subject: [PATCH 08/13] Added csv file logging --- .gitignore | 1 + main/extra_func.py | 32 +++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index d798070..6b6423b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ local_settings.py db.sqlite3 db.sqlite3-journal media/ +logs.csv # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ # in your Git repository. Update and uncomment the following line accordingly. diff --git a/main/extra_func.py b/main/extra_func.py index eedc4aa..3829e64 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -393,9 +393,7 @@ class DatabaseHandler(logging.Handler): self.database = RoleChangeLogs() def emit(self, record): - # admin = ZendeskAdmin() user = record.msg - # data = UserProfile.objects.filter(user=user.user) self.database.name = user.name self.database.user = user.user self.database.changed_by = user.user @@ -407,9 +405,37 @@ class DatabaseHandler(logging.Handler): self.database.save() +class CsvFormatter(logging.Formatter): + def __init__(self): + logging.Formatter.__init__(self) + + def format(self, record): + user = record.msg + msg = '' + msg += user.name + if user.custom_role_id == ROLES['engineer']: + msg += ',engineer,' + elif user.custom_role_id == ROLES['light_agent']: + msg.append('light_agent') + time = str(timezone.now().today()) + msg += time[:16] + msg += ',' + msg += user.name + return msg + + def log(user): + """ + Осуществляет запись логов в базу данных и csv файл + :param user: request.user.userprofile + :return: + """ dbhandler = DatabaseHandler() - logging.getLogger('MY_LOGGER').addHandler(dbhandler) + csvformatter = CsvFormatter() + csvhandler = logging.FileHandler('logs.csv', "a") + csvhandler.setFormatter(csvformatter) logger = logging.getLogger('MY_LOGGER') + logger.addHandler(dbhandler) + logger.addHandler(csvhandler) logger.setLevel('INFO') logger.info(user) From 67da8681e59bd5620b99b77cfe8038dc0f8d9034 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Wed, 17 Mar 2021 15:47:41 +0300 Subject: [PATCH 09/13] Fixed userprofile.custom_role_id updating issue in work_hand_over and work_become_engineer --- main/views.py | 69 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 23 deletions(-) diff --git a/main/views.py b/main/views.py index 4d1a9a5..2610456 100644 --- a/main/views.py +++ b/main/views.py @@ -1,38 +1,29 @@ import logging import os +from datetime import datetime +from django.contrib.auth.decorators import login_required +from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin +from django.contrib.auth.models import User, Permission from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.forms import PasswordResetForm from django.contrib.auth.views import LoginView from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import PermissionDenied from django.core.handlers.wsgi import WSGIRequest from django.http import HttpResponseRedirect, HttpResponse from django.shortcuts import render, get_list_or_404, redirect from django.urls import reverse_lazy, reverse from django.views.generic import FormView -from zenpy import Zenpy - -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, log - -from django.contrib.auth.models import User, Permission -from main.models import UserProfile -from main.forms import CustomRegistrationForm, AdminPageUsers, CustomAuthenticationForm from django_registration.views import RegistrationView -from django.contrib.auth.decorators import login_required -from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin -from django.core.exceptions import PermissionDenied - -from access_controller.settings import ZENDESK_ROLES +from zenpy import Zenpy from zenpy.lib.api_objects import User as ZenpyUser -content_type_temp = ContentType.objects.get_for_model(UserProfile) -permission_temp, created = Permission.objects.get_or_create( - codename='has_control_access', - content_type=content_type_temp, -) - +from access_controller.settings import EMAIL_HOST_USER, ZENDESK_ROLES +from main.extra_func import check_user_exist, update_profile, get_user_organization, make_engineer, make_light_agent, \ + get_users_list, StatisticData, log +from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm +from .models import UserProfile class CustomRegistrationView(RegistrationView): """ @@ -111,7 +102,6 @@ def profile_page(request: WSGIRequest) -> HttpResponse: 'profile': user_profile, 'pagename': 'Страница профиля' } - log(request.user) return render(request, 'pages/profile.html', context) @@ -151,12 +141,14 @@ def work_page(request, id): @login_required() def work_hand_over(request): zenpy_user, admin = auth_user(request) + if zenpy_user.custom_role_id == ZENDESK_ROLES['engineer']: zenpy_user.custom_role_id = ZENDESK_ROLES['light_agent'] admin.users.update(zenpy_user) request.user.userprofile.role = "agent" + request.user.userprofile.custom_role_id = ZENDESK_ROLES['light_agent'] request.user.userprofile.save() - # log(request.user.userprofile.user) + log(request.user.userprofile) return HttpResponseRedirect(reverse('work', args=(request.user.id,))) @@ -167,8 +159,9 @@ def work_become_engineer(request): zenpy_user.custom_role_id = ZENDESK_ROLES['engineer'] admin.users.update(zenpy_user) request.user.userprofile.role = "agent" + request.user.userprofile.custom_role_id = ZENDESK_ROLES['engineer'] request.user.userprofile.save() - # log(request.user.userprofile.user) + log(request.user.userprofile) return HttpResponseRedirect(reverse('work', args=(request.user.id,))) @@ -200,10 +193,12 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): @staticmethod def make_engineers(users): [make_engineer(user) for user in users] + # [log(user, self.request.user.userprofile) for user in users] @staticmethod def make_light_agents(users): [make_light_agent(user) for user in users] + # [log(user, self.request.user.userprofile) for user in users] @staticmethod def count_users(users) -> tuple: @@ -239,3 +234,31 @@ class CustomLoginView(LoginView): Отображение страницы авторизации пользователя """ form_class = CustomAuthenticationForm + + +@login_required() +def statistic_page(request): + if not request.user.is_superuser: + return redirect('index') + context = { + 'pagename': 'страница статистики', + 'errors': list(), + } + if request.method == "POST": + form = StatisticForm(request.POST) + if form.is_valid(): + start_date, end_date = form.cleaned_data['range_start'], form.cleaned_data['range_end'] + interval, show = form.cleaned_data['interval'], form.cleaned_data['display_format'] + Data = StatisticData(start_date, end_date, form.cleaned_data['email']) + Data.set_display(show) + Data.set_interval(interval) + stats = Data.get_statistic() + if Data.errors: + context['errors'] = Data.errors + if Data.warnings: + context['warnings'] = Data.warnings + context['log_stats'] = stats if not context['errors'] else None + if request.method == 'GET': + form = StatisticForm() + context['form'] = form + return render(request, 'pages/stat.html', context) From 838d6926fc43987d0060c8e91304125a72365bf8 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Wed, 17 Mar 2021 16:00:55 +0300 Subject: [PATCH 10/13] Fixed userprofile.custom_role_id updating issue in update_role, fixed userprofile.changed_by logging --- main/extra_func.py | 61 +++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/main/extra_func.py b/main/extra_func.py index 3829e64..7f0d2e8 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -119,14 +119,16 @@ class ZendeskAdmin: raise ValueError('invalid access_controller`s login data') -def update_role(user_profile: UserProfile, role: str) -> UserProfile: +def update_role(user_profile: UserProfile, role: int) -> UserProfile: """ Функция **update_role** меняет роль пользователя. """ zendesk = ZendeskAdmin() user = zendesk.get_user(user_profile.user.email) user.custom_role_id = role + user_profile.custom_role_id = role zendesk.admin.users.update(user) + user_profile.save() def make_engineer(user_profile: UserProfile) -> UserProfile: @@ -390,19 +392,25 @@ class StatisticData: class DatabaseHandler(logging.Handler): def __init__(self): logging.Handler.__init__(self) - self.database = RoleChangeLogs() def emit(self, record): - user = record.msg - self.database.name = user.name - self.database.user = user.user - self.database.changed_by = user.user + database = RoleChangeLogs() + users = record.msg + if users[1]: + user = users[0] + admin = users[1] + elif not users[1]: + user = users[0] + admin = users[0] + database.name = user.name + database.user = user.user + database.changed_by = admin.user if user.custom_role_id == ROLES['engineer']: - self.database.old_role = ROLES['light_agent'] + database.old_role = ROLES['light_agent'] elif user.custom_role_id == ROLES['light_agent']: - self.database.old_role = ROLES['engineer'] - self.database.new_role = user.custom_role_id - self.database.save() + database.old_role = ROLES['engineer'] + database.new_role = user.custom_role_id + database.save() class CsvFormatter(logging.Formatter): @@ -410,32 +418,41 @@ class CsvFormatter(logging.Formatter): logging.Formatter.__init__(self) def format(self, record): - user = record.msg + users = record.msg + if users[1]: + user = users[0] + admin = users[1] + elif not users[1]: + user = users[0] + admin = users[0] msg = '' msg += user.name if user.custom_role_id == ROLES['engineer']: msg += ',engineer,' elif user.custom_role_id == ROLES['light_agent']: - msg.append('light_agent') + msg += ',light_agent,' time = str(timezone.now().today()) msg += time[:16] msg += ',' - msg += user.name + msg += admin.name return msg -def log(user): +def log(user, admin=0): """ Осуществляет запись логов в базу данных и csv файл - :param user: request.user.userprofile + :param admin: + :param user: :return: """ - dbhandler = DatabaseHandler() - csvformatter = CsvFormatter() - csvhandler = logging.FileHandler('logs.csv', "a") - csvhandler.setFormatter(csvformatter) + users = [user, admin] logger = logging.getLogger('MY_LOGGER') - logger.addHandler(dbhandler) - logger.addHandler(csvhandler) + if not logger.hasHandlers(): + dbhandler = DatabaseHandler() + csvformatter = CsvFormatter() + csvhandler = logging.FileHandler('logs.csv', "a") + csvhandler.setFormatter(csvformatter) + logger.addHandler(dbhandler) + logger.addHandler(csvhandler) logger.setLevel('INFO') - logger.info(user) + logger.info(users) From 9d0b6982db5806b8a38294a7cf6bdc6bf181a8ea Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Wed, 17 Mar 2021 16:01:39 +0300 Subject: [PATCH 11/13] Added logging for control page, fully added logging to project --- main/views.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/main/views.py b/main/views.py index 2610456..52e89e5 100644 --- a/main/views.py +++ b/main/views.py @@ -190,15 +190,15 @@ class AdminPageView(LoginRequiredMixin, PermissionRequiredMixin, FormView): self.make_light_agents(form.cleaned_data['users']) return super().form_valid(form) - @staticmethod - def make_engineers(users): + # @staticmethod + def make_engineers(self, users): [make_engineer(user) for user in users] - # [log(user, self.request.user.userprofile) for user in users] + [log(user, self.request.user.userprofile) for user in users] - @staticmethod - def make_light_agents(users): + # @staticmethod + def make_light_agents(self, users): [make_light_agent(user) for user in users] - # [log(user, self.request.user.userprofile) for user in users] + [log(user, self.request.user.userprofile) for user in users] @staticmethod def count_users(users) -> tuple: From 14cf635d3b6f7401cf9bd77fc01257bf8f199d08 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Wed, 17 Mar 2021 16:16:09 +0300 Subject: [PATCH 12/13] Changed logs.csv location --- .gitignore | 2 +- main/extra_func.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6b6423b..1f6ea85 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,7 @@ local_settings.py db.sqlite3 db.sqlite3-journal media/ -logs.csv +logs/ # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ # in your Git repository. Update and uncomment the following line accordingly. diff --git a/main/extra_func.py b/main/extra_func.py index 7f0d2e8..11c539e 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -450,7 +450,7 @@ def log(user, admin=0): if not logger.hasHandlers(): dbhandler = DatabaseHandler() csvformatter = CsvFormatter() - csvhandler = logging.FileHandler('logs.csv', "a") + csvhandler = logging.FileHandler('logs/logs.csv', "a") csvhandler.setFormatter(csvformatter) logger.addHandler(dbhandler) logger.addHandler(csvhandler) From 65253f6904ce90d00cab95cbfda76981e7b00f94 Mon Sep 17 00:00:00 2001 From: Timofey Mazurov Date: Sat, 10 Apr 2021 21:28:29 +0300 Subject: [PATCH 13/13] Fixed custom_role_id change for work page --- main/migrations/0009_auto_20210309_2317.py | 61 --------------------- main/migrations/0013_merge_20210315_1948.py | 14 ----- main/migrations/0014_auto_20210315_1948.py | 29 ---------- main/views.py | 1 + 4 files changed, 1 insertion(+), 104 deletions(-) delete mode 100644 main/migrations/0009_auto_20210309_2317.py delete mode 100644 main/migrations/0013_merge_20210315_1948.py delete mode 100644 main/migrations/0014_auto_20210315_1948.py diff --git a/main/migrations/0009_auto_20210309_2317.py b/main/migrations/0009_auto_20210309_2317.py deleted file mode 100644 index a59717a..0000000 --- a/main/migrations/0009_auto_20210309_2317.py +++ /dev/null @@ -1,61 +0,0 @@ -# Generated by Django 3.1.6 on 2021-03-09 20:17 - -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', '0008_auto_20210303_2305'), - ] - - operations = [ - migrations.AlterField( - model_name='rolechangelogs', - name='change_time', - field=models.DateTimeField(help_text='Дата и время изменения роли'), - ), - migrations.AlterField( - model_name='rolechangelogs', - name='changed_by', - field=models.ForeignKey(help_text='Кем была изменена роль', on_delete=django.db.models.deletion.CASCADE, related_name='changed_by', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='rolechangelogs', - name='name', - field=models.TextField(help_text='Имя пользователя'), - ), - migrations.AlterField( - model_name='rolechangelogs', - name='new_role', - field=models.TextField(help_text='Присвоенная роль'), - ), - migrations.AlterField( - model_name='rolechangelogs', - name='user', - field=models.ForeignKey(help_text='Пользователь, которому присвоили другую роль', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='userprofile', - name='image', - field=models.URLField(blank=True, help_text='Аватарка', null=True), - ), - migrations.AlterField( - model_name='userprofile', - name='name', - field=models.CharField(default='None', help_text='Имя пользователя на нашем сайте', max_length=100), - ), - migrations.AlterField( - model_name='userprofile', - name='role', - field=models.CharField(default='None', help_text='Код роли пользователя', max_length=100), - ), - migrations.AlterField( - model_name='userprofile', - name='user', - field=models.OneToOneField(help_text='Пользователь', on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/main/migrations/0013_merge_20210315_1948.py b/main/migrations/0013_merge_20210315_1948.py deleted file mode 100644 index c3fa7f0..0000000 --- a/main/migrations/0013_merge_20210315_1948.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 3.1.6 on 2021-03-15 16:48 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('main', '0012_auto_20210312_1225'), - ('main', '0009_auto_20210309_2317'), - ] - - operations = [ - ] diff --git a/main/migrations/0014_auto_20210315_1948.py b/main/migrations/0014_auto_20210315_1948.py deleted file mode 100644 index 20610af..0000000 --- a/main/migrations/0014_auto_20210315_1948.py +++ /dev/null @@ -1,29 +0,0 @@ -# Generated by Django 3.1.6 on 2021-03-15 16:48 - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('main', '0013_merge_20210315_1948'), - ] - - operations = [ - migrations.AlterField( - model_name='rolechangelogs', - name='change_time', - field=models.DateTimeField(default=django.utils.timezone.now, help_text='Дата и время изменения роли'), - ), - migrations.AlterField( - model_name='rolechangelogs', - name='new_role', - field=models.IntegerField(default=0, help_text='Присвоенная роль'), - ), - migrations.AlterField( - model_name='userprofile', - name='role', - field=models.CharField(default='None', help_text='Глобальное имя роли пользователя', max_length=100), - ), - ] diff --git a/main/views.py b/main/views.py index 0446ea7..e41e254 100644 --- a/main/views.py +++ b/main/views.py @@ -194,6 +194,7 @@ def user_update(zenpy_user: User, admin: User, request: WSGIRequest) -> UserProf admin.users.update(zenpy_user) request.user.userprofile.role = "agent" + request.user.userprofile.custom_role_id = zenpy_user.custom_role_id request.user.userprofile.save() messages.success(request, "Права были изменены")