statistic backend first version
This commit is contained in:
parent
6cdd787cc8
commit
fd1e048ebe
@ -14,15 +14,12 @@ Including another URLconf
|
|||||||
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
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.contrib.auth import views as auth_views
|
||||||
from django.urls import path, include
|
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 main_page, profile_page, CustomRegistrationView, CustomLoginView
|
||||||
|
from main.views import work_page, work_hand_over, work_become_engineer, \
|
||||||
|
AdminPageView, statistic_page
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls, name='admin'),
|
path('admin/', admin.site.urls, name='admin'),
|
||||||
@ -37,7 +34,8 @@ urlpatterns = [
|
|||||||
path('work/become_engineer/', work_become_engineer, name="work_become_engineer"),
|
path('work/become_engineer/', work_become_engineer, name="work_become_engineer"),
|
||||||
path('accounts/', include('django_registration.backends.activation.urls')),
|
path('accounts/', include('django_registration.backends.activation.urls')),
|
||||||
path('accounts/login/', include('django.contrib.auth.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 += [
|
urlpatterns += [
|
||||||
|
@ -10,6 +10,7 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail):
|
|||||||
Форма для регистрации :class:`django_registration.forms.RegistrationFormUniqueEmail`
|
Форма для регистрации :class:`django_registration.forms.RegistrationFormUniqueEmail`
|
||||||
с добавлением bootstrap-класса 'form-control'
|
с добавлением bootstrap-класса 'form-control'
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
for visible in self.visible_fields():
|
for visible in self.visible_fields():
|
||||||
@ -18,7 +19,7 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail):
|
|||||||
visible.field.widget.attrs['class'] += 'form-control'
|
visible.field.widget.attrs['class'] += 'form-control'
|
||||||
else:
|
else:
|
||||||
visible.field.widget.attrs['class'] = 'form-control'
|
visible.field.widget.attrs['class'] = 'form-control'
|
||||||
if visible.html_name !='email':
|
if visible.html_name != 'email':
|
||||||
visible.field.required = False
|
visible.field.required = False
|
||||||
|
|
||||||
class Meta(RegistrationFormUniqueEmail.Meta):
|
class Meta(RegistrationFormUniqueEmail.Meta):
|
||||||
@ -57,3 +58,28 @@ class CustomAuthenticationForm(AuthenticationForm):
|
|||||||
,
|
,
|
||||||
'inactive': "Аккаунт не активен.",
|
'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',
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
|
67
main/migrations/0005_auto_20210304_0119.py
Normal file
67
main/migrations/0005_auto_20210304_0119.py
Normal file
@ -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),
|
||||||
|
),
|
||||||
|
]
|
@ -34,6 +34,7 @@ class RoleChangeLogs(models.Model):
|
|||||||
"""
|
"""
|
||||||
user = models.ForeignKey(to=User, on_delete=models.CASCADE, help_text='Пользователь, которому присвоили другую роль')
|
user = models.ForeignKey(to=User, on_delete=models.CASCADE, help_text='Пользователь, которому присвоили другую роль')
|
||||||
name = models.TextField(help_text='Имя пользователя')
|
name = models.TextField(help_text='Имя пользователя')
|
||||||
|
old_role = models.TextField(help_text='Старая роль')
|
||||||
new_role = models.TextField(help_text='Присвоенная роль')
|
new_role = models.TextField(help_text='Присвоенная роль')
|
||||||
change_time = models.DateTimeField(help_text='Дата и время изменения роли')
|
change_time = models.DateTimeField(help_text='Дата и время изменения роли')
|
||||||
changed_by = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='changed_by', help_text='Кем была изменена роль')
|
changed_by = models.ForeignKey(to=User, on_delete=models.CASCADE, related_name='changed_by', help_text='Кем была изменена роль')
|
||||||
|
26
main/templates/pages/stat.html
Normal file
26
main/templates/pages/stat.html
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{% extends 'base/base.html' %}
|
||||||
|
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}{{ pagename }}{% endblock %}
|
||||||
|
|
||||||
|
{% block heading %}Статистика{% endblock %}
|
||||||
|
|
||||||
|
{% block extra_css %}
|
||||||
|
<link rel="stylesheet" href="{% static 'main/css/work.css' %}">
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div>
|
||||||
|
<form action="" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{% for field in form %}
|
||||||
|
{{field.label}}
|
||||||
|
{{field}}
|
||||||
|
<br>
|
||||||
|
{% endfor %}
|
||||||
|
<input type="submit">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
||||||
|
|
@ -9,7 +9,7 @@ from django.contrib.auth.tokens import default_token_generator
|
|||||||
from django.contrib.auth.views import LoginView
|
from django.contrib.auth.views import LoginView
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.http import HttpResponseRedirect
|
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.urls import reverse_lazy
|
||||||
from django.views.generic import FormView
|
from django.views.generic import FormView
|
||||||
from django_registration.views import RegistrationView
|
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 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, \
|
from main.extra_func import check_user_exist, update_profile, get_user_organization, make_engineer, make_light_agent, \
|
||||||
get_users_list
|
get_users_list
|
||||||
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm
|
from main.forms import AdminPageUsers, CustomRegistrationForm, CustomAuthenticationForm, StatisticForm
|
||||||
from .models import UserProfile
|
from .models import UserProfile, RoleChangeLogs
|
||||||
|
|
||||||
|
|
||||||
class CustomRegistrationView(RegistrationView):
|
class CustomRegistrationView(RegistrationView):
|
||||||
@ -190,3 +190,53 @@ class CustomLoginView(LoginView):
|
|||||||
Отображение страницы авторизации пользователя
|
Отображение страницы авторизации пользователя
|
||||||
"""
|
"""
|
||||||
form_class = CustomAuthenticationForm
|
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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user