diff --git a/access_controller/urls.py b/access_controller/urls.py index 45d815b..6554616 100644 --- a/access_controller/urls.py +++ b/access_controller/urls.py @@ -14,15 +14,12 @@ Including another URLconf 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ from django.contrib import admin -from django.contrib.auth.forms import AuthenticationForm -from django.contrib.auth.views import LoginView from django.contrib.auth import views as auth_views from django.urls import path, include -from access_controller import settings -from access_controller.settings import DEBUG -from main.views import main_page, profile_page, CustomRegistrationView, 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, \ + AdminPageView, statistic_page urlpatterns = [ path('admin/', admin.site.urls, name='admin'), @@ -37,7 +34,8 @@ urlpatterns = [ path('work/become_engineer/', work_become_engineer, name="work_become_engineer"), path('accounts/', include('django_registration.backends.activation.urls')), path('accounts/login/', include('django.contrib.auth.urls')), - path('control/', AdminPageView.as_view(), name='control') + path('control/', AdminPageView.as_view(), name='control'), + path('statistic/', statistic_page, name='statistic') ] urlpatterns += [ diff --git a/main/forms.py b/main/forms.py index e69de1d..ff6a9d3 100644 --- a/main/forms.py +++ b/main/forms.py @@ -10,6 +10,7 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail): Форма для регистрации :class:`django_registration.forms.RegistrationFormUniqueEmail` с добавлением bootstrap-класса 'form-control' """ + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) for visible in self.visible_fields(): @@ -18,7 +19,7 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail): visible.field.widget.attrs['class'] += 'form-control' else: visible.field.widget.attrs['class'] = 'form-control' - if visible.html_name !='email': + if visible.html_name != 'email': visible.field.required = False class Meta(RegistrationFormUniqueEmail.Meta): @@ -57,3 +58,28 @@ class CustomAuthenticationForm(AuthenticationForm): , 'inactive': "Аккаунт не активен.", } + + +class StatisticForm(forms.Form): + email = forms.EmailField( + label='Электроная почта', + ) + inter = forms.CharField( # TODO: Переделать под html страницу + label='Выбор интервала', + ) + dio_start = forms.DateField( # TODO: Переделать под html страницу + label='Начало диапазона', + widget=forms.DateInput( + attrs={ + 'type': 'date', + } + ), + ) + dio_end = forms.DateField( # TODO: Переделать под html страницу + label='Конец диапазона', + widget=forms.DateInput( + attrs={ + 'type': 'date', + } + ), + ) diff --git a/main/migrations/0005_auto_20210304_0119.py b/main/migrations/0005_auto_20210304_0119.py new file mode 100644 index 0000000..361ec25 --- /dev/null +++ b/main/migrations/0005_auto_20210304_0119.py @@ -0,0 +1,67 @@ +# Generated by Django 3.1.6 on 2021-03-03 22:19 + +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', '0004_rolechangelogs'), + ] + + operations = [ + migrations.AddField( + model_name='rolechangelogs', + name='old_role', + field=models.TextField(default='agent', help_text='Старая роль'), + preserve_default=False, + ), + 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 8665570..13bd55e 100644 --- a/main/models.py +++ b/main/models.py @@ -34,6 +34,7 @@ class RoleChangeLogs(models.Model): """ user = models.ForeignKey(to=User, on_delete=models.CASCADE, help_text='Пользователь, которому присвоили другую роль') name = models.TextField(help_text='Имя пользователя') + old_role = models.TextField(help_text='Старая роль') new_role = models.TextField(help_text='Присвоенная роль') change_time = models.DateTimeField(help_text='Дата и время изменения роли') changed_by = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='changed_by', help_text='Кем была изменена роль') diff --git a/main/templates/pages/stat.html b/main/templates/pages/stat.html new file mode 100644 index 0000000..1ac47d7 --- /dev/null +++ b/main/templates/pages/stat.html @@ -0,0 +1,26 @@ +{% extends 'base/base.html' %} + +{% load static %} + +{% block title %}{{ pagename }}{% endblock %} + +{% block heading %}Статистика{% endblock %} + +{% block extra_css %} + +{% endblock %} + +{% block content %} +
+
+ {% csrf_token %} + {% for field in form %} + {{field.label}} + {{field}} +
+ {% endfor %} + +
+
+{% endblock %} + diff --git a/main/views.py b/main/views.py index b765bd0..532aac0 100644 --- a/main/views.py +++ b/main/views.py @@ -9,7 +9,7 @@ from django.contrib.auth.tokens import default_token_generator from django.contrib.auth.views import LoginView from django.core.exceptions import PermissionDenied from django.http import HttpResponseRedirect -from django.shortcuts import get_list_or_404, redirect, reverse, render +from django.shortcuts import get_list_or_404, redirect, reverse, render, get_object_or_404 from django.urls import reverse_lazy from django.views.generic import FormView from django_registration.views import RegistrationView @@ -19,8 +19,8 @@ from zenpy.lib.api_objects import User as ZenpyUser 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 -from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm -from .models import UserProfile +from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm +from .models import UserProfile, RoleChangeLogs class CustomRegistrationView(RegistrationView): @@ -190,3 +190,53 @@ class CustomLoginView(LoginView): Отображение страницы авторизации пользователя """ form_class = CustomAuthenticationForm + + +@login_required() +def statistic_page(request): + if not request.user.is_superuser: + return redirect('index') + context = { + 'pagename': 'страница статистики', + } + if request.method == "POST": + form = StatisticForm(request.POST) + if form.is_valid(): + start_date = form.cleaned_data['dio_start'] + end_date = form.cleaned_data['dio_end'] + try: + data = RoleChangeLogs.objects.filter( + change_time__range=[start_date, end_date], + user=User.objects.get(email=form.cleaned_data['email']), + ) + except User.DoesNotExist: + data = [] + context['errors'] = 'Пользователь не найден' + if not data: + context['errors'] = 'Не найдено изменений роли за этот промежуток времени' + else: + sep = form.cleaned_data['inter'] + stat = {} + if sep == 'days': + for day in daterange(start_date, end_date+timedelta(days=1)): + stat[day] = 0 + if data[0].old_role == 'engineer': + stat[start_date] += data[0].change_time.time().hour + if data[-1].old_role == 'engineer': + stat[end_date] += 24-data[-1].change_time.time().hour + else: + context['errors'] = form.errors + + if request.method == 'GET': + form = StatisticForm() + + context['form'] = form + return render(request, 'pages/stat.html', context) + + +from datetime import timedelta, date + + +def daterange(start_date, end_date): + for n in range(int((end_date - start_date).days)): + yield start_date + timedelta(n)