marge statistic/backend and statistic/frontend
This commit is contained in:
parent
b50a6668a6
commit
6fd81c3ccc
@ -2,7 +2,6 @@ from django import forms
|
|||||||
from django.contrib.auth.forms import AuthenticationForm
|
from django.contrib.auth.forms import AuthenticationForm
|
||||||
from django_registration.forms import RegistrationFormUniqueEmail
|
from django_registration.forms import RegistrationFormUniqueEmail
|
||||||
|
|
||||||
from access_controller.settings import ZENDESK_ROLES
|
|
||||||
from main.models import UserProfile
|
from main.models import UserProfile
|
||||||
|
|
||||||
|
|
||||||
@ -15,6 +14,7 @@ class CustomRegistrationForm(RegistrationFormUniqueEmail):
|
|||||||
:param visible_fields.email: Поле для ввода email, зарегистирированного на Zendesk
|
:param visible_fields.email: Поле для ввода email, зарегистирированного на Zendesk
|
||||||
:type visible_fields.email: :class:`django_registration.forms.RegistrationFormUniqueEmail`
|
:type visible_fields.email: :class:`django_registration.forms.RegistrationFormUniqueEmail`
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs) -> RegistrationFormUniqueEmail:
|
def __init__(self, *args, **kwargs) -> RegistrationFormUniqueEmail:
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
for visible in self.visible_fields():
|
for visible in self.visible_fields():
|
||||||
@ -68,29 +68,60 @@ class CustomAuthenticationForm(AuthenticationForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
INTERVAL_CHOICES = [
|
||||||
|
('days', 'Дни'),
|
||||||
|
('months', 'Месяцы')
|
||||||
|
]
|
||||||
|
DISPLAY_CHOICES = [
|
||||||
|
('hours', 'Часы'),
|
||||||
|
('days', 'Дни')
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
class StatisticForm(forms.Form):
|
class StatisticForm(forms.Form):
|
||||||
email = forms.EmailField(
|
email = forms.EmailField(
|
||||||
label='Электроная почта',
|
label='Электроная почта',
|
||||||
)
|
widget=forms.EmailInput(
|
||||||
interval = forms.CharField( # TODO: Переделать под html страницу
|
|
||||||
label='Интервал работы',
|
|
||||||
)
|
|
||||||
display_format = forms.CharField( # TODO: Переделать под html страницу
|
|
||||||
label='Формат отображения',
|
|
||||||
)
|
|
||||||
range_start = forms.DateField( # TODO: Переделать под html страницу
|
|
||||||
label='Начало диапазона',
|
|
||||||
widget=forms.DateInput(
|
|
||||||
attrs={
|
attrs={
|
||||||
'type': 'date',
|
'placeholder': 'example@ngenix.ru',
|
||||||
|
'class': 'form-control',
|
||||||
|
'style': 'background-color:#f2f2f2;'
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
range_end = forms.DateField( # TODO: Переделать под html страницу
|
interval = forms.ChoiceField(
|
||||||
label='Конец диапазона',
|
label='Выберите интервалы времени работы',
|
||||||
|
choices=INTERVAL_CHOICES,
|
||||||
|
widget=forms.RadioSelect(
|
||||||
|
attrs={
|
||||||
|
'class': 'btn-check',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
display_format = forms.ChoiceField(
|
||||||
|
label='Выберите формат отображения',
|
||||||
|
choices=DISPLAY_CHOICES,
|
||||||
|
widget=forms.RadioSelect(
|
||||||
|
attrs={
|
||||||
|
'class': 'btn-check',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
range_start = forms.DateField(
|
||||||
|
label='Начало статистики',
|
||||||
widget=forms.DateInput(
|
widget=forms.DateInput(
|
||||||
attrs={
|
attrs={
|
||||||
'type': 'date',
|
'type': 'date',
|
||||||
|
'class': 'btn btn-secondary text-primary bg-white',
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
|
range_end = forms.DateField(
|
||||||
|
label='Конец статистики',
|
||||||
|
widget=forms.DateInput(
|
||||||
|
attrs={
|
||||||
|
'type': 'date',
|
||||||
|
'class': 'btn btn-secondary text-primary bg-white',
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
@ -34,7 +34,6 @@ class RoleChangeLogs(models.Model):
|
|||||||
"""Модель для логирования изменений ролей пользователя"""
|
"""Модель для логирования изменений ролей пользователя"""
|
||||||
user = models.ForeignKey(to=User, on_delete=models.CASCADE,
|
user = models.ForeignKey(to=User, on_delete=models.CASCADE,
|
||||||
help_text='Пользователь, которому присвоили другую роль')
|
help_text='Пользователь, которому присвоили другую роль')
|
||||||
name = models.TextField(help_text='Имя пользователя')
|
|
||||||
old_role = models.IntegerField(default=0, help_text='Старая роль')
|
old_role = models.IntegerField(default=0, help_text='Старая роль')
|
||||||
new_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='Дата и время изменения роли')
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
{% 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>
|
|
||||||
<ul>
|
|
||||||
{% for error in errors %}
|
|
||||||
<li><span class="badge bg-danger">{{error}}</span></li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{%if form.errors%}
|
|
||||||
<ul>
|
|
||||||
{% for field, errors in form.errors.items %}
|
|
||||||
{% for error in errors %}
|
|
||||||
<li><span class="badge bg-danger">{{error}}</span></li>
|
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{%endif%}
|
|
||||||
<ul>
|
|
||||||
{% for warning in warnings %}
|
|
||||||
<li><span class="badge bg-warning">{{warning}}</span></li>
|
|
||||||
{% endfor %}
|
|
||||||
</ul>
|
|
||||||
{% for key,val in log_stats.items %}
|
|
||||||
<h3>{{key}} <b>|</b> {{val}}</h3>
|
|
||||||
<br>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
106
main/templates/pages/statistic.html
Normal file
106
main/templates/pages/statistic.html
Normal file
@ -0,0 +1,106 @@
|
|||||||
|
{% extends 'base/base.html' %}
|
||||||
|
|
||||||
|
{% load static %}
|
||||||
|
|
||||||
|
{% block title %}{{ pagename }}{% endblock %}
|
||||||
|
|
||||||
|
{% block heading %} Страницы просмотра статистики{% endblock %}
|
||||||
|
|
||||||
|
{% block content%}
|
||||||
|
<div class="mt-5">
|
||||||
|
<div class="container-fluid" style="font-size:2rem">
|
||||||
|
<form method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="row g-3">
|
||||||
|
<div class="col-auto">
|
||||||
|
{{ form.email.label }}
|
||||||
|
</div>
|
||||||
|
<div class="col-auto mt-4">
|
||||||
|
{{ form.email }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row g-3 mt-4">
|
||||||
|
<div class="col-auto">
|
||||||
|
{{ form.interval.label }}
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
{% for radio in form.interval%}
|
||||||
|
{{ radio.tag }}
|
||||||
|
<label class="btn btn-secondary text-primary bg-white" for="{{ radio.id_for_label }}">
|
||||||
|
{{ radio.choice_label }}
|
||||||
|
</label>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row g-3 mt-4">
|
||||||
|
<div class="col-auto">
|
||||||
|
{{ form.display_format.label }}
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
{% for radio in form.display_format%}
|
||||||
|
{{ radio.tag }}
|
||||||
|
<label class="btn btn-secondary text-primary bg-white" for="{{ radio.id_for_label }}">
|
||||||
|
{{ radio.choice_label }}
|
||||||
|
</label>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row g-3 mt-4">
|
||||||
|
<div class="col-auto">
|
||||||
|
{{ form.range_start.label}}
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<div class='col-sm-7'>
|
||||||
|
{{ form.range_start}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row g-3 mt-4">
|
||||||
|
<div class="col-auto">
|
||||||
|
{{ form.range_end.label}}
|
||||||
|
</div>
|
||||||
|
<div class="col-auto">
|
||||||
|
<div class='col-sm-7'>
|
||||||
|
{{ form.range_end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-row text-center">
|
||||||
|
<div class="col-12">
|
||||||
|
<button type="submit" class="btn btn-primary bg-white text-primary">Посмотреть статистику</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<ul>
|
||||||
|
{% for error in errors %}
|
||||||
|
<li><span class="badge bg-danger">{{error}}</span></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<ul>
|
||||||
|
{% for warning in warnings %}
|
||||||
|
<li><span class="badge bg-warning">{{warning}}</span></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
<div class="container-fluid">
|
||||||
|
<table class="table table-bordered text-center text-secondary mt-5" style="background-color:#f2f2f2;">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<td scope="col">Пользователи/Даты</td>
|
||||||
|
{% for date in log_stats.keys %}
|
||||||
|
<td scope="col">{{date}}</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{ form.email.value }}</td>
|
||||||
|
{% for time in log_stats.values %}
|
||||||
|
<td>{{time}}</td>
|
||||||
|
{% endfor %}
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -1,207 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
|
|
||||||
<html lang="ru" class="h-100">
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
||||||
<title>Statistic</title>
|
|
||||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css"
|
|
||||||
integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
|
|
||||||
|
|
||||||
|
|
||||||
<!-- jQuery -->
|
|
||||||
<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
|
|
||||||
|
|
||||||
<!-- Isolated Version of Bootstrap, not needed if your site already uses Bootstrap -->
|
|
||||||
<link rel="stylesheet" href="https://formden.com/static/cdn/bootstrap-iso.css"/>
|
|
||||||
|
|
||||||
<!-- Bootstrap Date-Picker Plugin -->
|
|
||||||
<script type="text/javascript"
|
|
||||||
src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/js/bootstrap-datepicker.min.js"></script>
|
|
||||||
<link rel="stylesheet"
|
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.4.1/css/bootstrap-datepicker3.css"/>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
var date_input=$('input[name="date"]'); //our date input has the name "date"
|
|
||||||
var container=$('.bootstrap-iso form').length>0 ? $('.bootstrap-iso form').parent() : "body";
|
|
||||||
var options={
|
|
||||||
format: 'mm/dd/yyyy',
|
|
||||||
container: container,
|
|
||||||
todayHighlight: true,
|
|
||||||
autoclose: true,
|
|
||||||
};
|
|
||||||
$ lessc build/build_standalone.less datepicker.css
|
|
||||||
$('.datepicker').datepicker();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
.bd-placeholder-img {
|
|
||||||
font-size: 1.125rem;
|
|
||||||
text-anchor: middle;
|
|
||||||
-webkit-user-select: none;
|
|
||||||
-moz-user-select: none;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.bd-placeholder-img-lg {
|
|
||||||
font-size: 3.5rem;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<header>
|
|
||||||
<!-- Fixed navbar -->
|
|
||||||
<nav
|
|
||||||
class="navbar navbar-expand-md fixed-top"
|
|
||||||
>
|
|
||||||
<ul
|
|
||||||
class="navbar-nav me-auto mb-2 mb-md-0 justify-content-between fixed-top"
|
|
||||||
style="background-color:#f2f2f2;"
|
|
||||||
>
|
|
||||||
<div class="mx-4">
|
|
||||||
<h1>Logo</h1>
|
|
||||||
</div>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</header>
|
|
||||||
<main class="pt-5">
|
|
||||||
<div class="mt-5">
|
|
||||||
<div class="container-fluid" style="font-size:2rem">
|
|
||||||
<form class="row g-3" method="post">
|
|
||||||
<div class="col-auto">
|
|
||||||
<p class="p">Введите email пользователя</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto mt-4">
|
|
||||||
<input type="email" class="form-control" style="background-color:#f2f2f2;" id="inputEmail"
|
|
||||||
placeholder="example@ngenix.ru">
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<form class="row g-3 mt-4" method="post">
|
|
||||||
<div class="col-auto">
|
|
||||||
<p class="p"> Выберите интервалы времени работы</p>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto">
|
|
||||||
<input type="radio" class="btn-check" name="options" id="option1" autocomplete="off">
|
|
||||||
<label class="btn btn-secondary text-primary bg-white" for="option1">Дни</label>
|
|
||||||
|
|
||||||
<input type="radio" class="btn-check" name="options" id="option2" autocomplete="off">
|
|
||||||
<label class="btn btn-secondary text-primary bg-white" for="option2">Месяцы</label>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<form class="row g-3 mt-4" method="post">
|
|
||||||
<div class="col-auto">
|
|
||||||
<p class="p">Начало статистики</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-auto">
|
|
||||||
<div class='col-sm-6'>
|
|
||||||
<div class="form-group mt-2" style="width: 130px;">
|
|
||||||
<div class="input-group date" data-provide="datepicker">
|
|
||||||
<input type="text" style="background-color:#f2f2f2;" placeholder="MM/DD/YYYY" class="form-control">
|
|
||||||
<div class="input-group-addon">
|
|
||||||
<span class="glyphicon glyphicon-th"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-auto">
|
|
||||||
<p class="pull-right">Начало статистики</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-auto">
|
|
||||||
<div class="form-group mt-2" style="width: 130px;"> <!-- Date input -->
|
|
||||||
<div class="input-group date" data-provide="datepicker">
|
|
||||||
<input type="text" style="background-color:#f2f2f2;" placeholder="MM/DD/YYYY" class="form-control">
|
|
||||||
<div class="input-group-addon">
|
|
||||||
<span class="glyphicon glyphicon-th"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<div class="form-row text-center">
|
|
||||||
<div class="col-12">
|
|
||||||
<button type="submit" class="btn btn-primary bg-white text-primary">Посмотреть статистику</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<div class="container-fluid">
|
|
||||||
<table class="table table-bordered text-center text-secondary mt-5" style="background-color:#f2f2f2;">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<td scope="col">Пользователи/Даты</td>
|
|
||||||
<td scope="col">05/01/2021-01/02/2021</td>
|
|
||||||
<td scope="col">01/02/2021-28/02/2021</td>
|
|
||||||
<td scope="col">01/03/2021-05/03/2021</td>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>keanu@gmail.com</td>
|
|
||||||
<td>15</td>
|
|
||||||
<td>21</td>
|
|
||||||
<td>1</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>vadim@mail.ru</td>
|
|
||||||
<td>2</td>
|
|
||||||
<td>15</td>
|
|
||||||
<td>3</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>example@ngenix.ru</td>
|
|
||||||
<td>0</td>
|
|
||||||
<td>19</td>
|
|
||||||
<td>4</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</main>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
@ -244,8 +244,6 @@ class UsersViewSet(viewsets.ReadOnlyModelViewSet):
|
|||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
def statistic_page(request):
|
def statistic_page(request):
|
||||||
if not request.user.is_superuser:
|
|
||||||
return redirect('index')
|
|
||||||
context = {
|
context = {
|
||||||
'pagename': 'страница статистики',
|
'pagename': 'страница статистики',
|
||||||
'errors': list(),
|
'errors': list(),
|
||||||
@ -267,4 +265,6 @@ def statistic_page(request):
|
|||||||
if request.method == 'GET':
|
if request.method == 'GET':
|
||||||
form = StatisticForm()
|
form = StatisticForm()
|
||||||
context['form'] = form
|
context['form'] = form
|
||||||
return render(request, 'pages/stat.html', context)
|
a = form['interval']
|
||||||
|
print(form['interval'].auto_id,form['interval'].id_for_label)
|
||||||
|
return render(request, 'pages/statistic.html', context)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user