This commit is contained in:
Sokurov Idar 2021-03-11 18:14:57 +03:00
parent ef9d0fc721
commit dd08821aea
6 changed files with 68 additions and 94 deletions

View File

@ -185,12 +185,13 @@ def daterange(start_date, end_date) -> list:
return dates return dates
def get_timedelta(log) -> timedelta: def get_timedelta(log,time=None) -> timedelta:
""" """
Возвращает объект класса timedelta, который хранит промежуток времени от начала суток до момента, Возвращает объект класса timedelta, который хранит промежуток времени от начала суток до момента,
который находится в log (объект класса RoleChangeLogs) который находится в log (объект класса RoleChangeLogs) или в time(datetime.time), если введён
""" """
time = log.change_time.time() if time is None:
time = log.change_time.time()
time = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second) time = timedelta(hours=time.hour, minutes=time.minute, seconds=time.second)
return time return time
@ -227,8 +228,8 @@ class StatisticData:
""" """
if self.is_valid_statistic(): if self.is_valid_statistic():
stat = self.statistic stat = self.statistic
self._use_display(stat) stat = self._use_display(stat)
self._use_interval(stat) stat = self._use_interval(stat)
return stat return stat
else: else:
return None return None
@ -281,19 +282,21 @@ class StatisticData:
Приводит данные к формату отображения Приводит данные к формату отображения
""" """
if not self.is_valid_statistic() or not self.display: if not self.is_valid_statistic() or not self.display:
return return stat
for key, item in self.statistic.items(): new_stat = {}
for key, item in stat.items():
if self.display == 'hours': if self.display == 'hours':
self.statistic[key] = item / 3600 new_stat[key] = item / 3600
elif self.display == 'days': elif self.display == 'days':
self.statistic[key] = item / 86400 new_stat[key] = item / 86400
return new_stat
def _use_interval(self, stat): def _use_interval(self, stat):
""" """
Объединяет ключи и значения в соответствии с интервалом работы Объединяет ключи и значения в соответствии с интервалом работы
""" """
if not self.is_valid_statistic() or not self.interval: if not self.is_valid_statistic() or not self.interval:
return return stat
new_stat = {} new_stat = {}
if self.interval == 'months': if self.interval == 'months':
# Переделываем ключи под формат('началоесяца - конец_месяца') # Переделываем ключи под формат('началоесяца - конец_месяца')
@ -307,7 +310,7 @@ class StatisticData:
new_stat[index] = value new_stat[index] = value
elif self.interval == 'days': elif self.interval == 'days':
new_stat = stat # статистика изначально в днях new_stat = stat # статистика изначально в днях
self.statistic = new_stat return new_stat
def check_time(self): def check_time(self):
""" """
@ -341,12 +344,16 @@ class StatisticData:
self.warnings += ['Не обнаружены изменения роли в данном промежутке'] self.warnings += ['Не обнаружены изменения роли в данном промежутке']
return None return None
first_log, last_log = self.data[0], self.data[len(self.data) - 1] first_log, last_log = self.data[0], self.data[len(self.data) - 1]
if first_log.old_role == ROLES['engineer']: if first_log.old_role == ROLES['engineer']:
self.fill_daterange(self.start_date, first_log.change_time.date()) self.fill_daterange(self.start_date, first_log.change_time.date())
self.statistic[first_log.change_time.date()] += get_timedelta(first_log).total_seconds() self.statistic[first_log.change_time.date()] += get_timedelta(first_log).total_seconds()
if last_log.new_role == ROLES['engineer']: if last_log.new_role == ROLES['engineer']:
self.fill_daterange(last_log.change_time.date() + timedelta(days=1), self.end_date + timedelta(days=1)) self.fill_daterange(last_log.change_time.date() + timedelta(days=1), self.end_date)
self.statistic[self.end_date + timedelta(days=1)] = get_timedelta(None,datetime.now().time()).total_seconds()
self.statistic[last_log.change_time.date()] += (timedelta(days=1) - get_timedelta(last_log)).total_seconds() self.statistic[last_log.change_time.date()] += (timedelta(days=1) - get_timedelta(last_log)).total_seconds()
for log_index in range(len(self.data) - 1): for log_index in range(len(self.data) - 1):
if self.data[log_index].new_role == ROLES['engineer']: if self.data[log_index].new_role == ROLES['engineer']:
current_log, next_log = self.data[log_index], self.data[log_index + 1] current_log, next_log = self.data[log_index], self.data[log_index + 1]
@ -364,7 +371,6 @@ class StatisticData:
Заполение диапазона дат значением val Заполение диапазона дат значением val
по умолчанию val = кол-во секунд в 1 дне по умолчанию val = кол-во секунд в 1 дне
""" """
self.statistic.clear()
for day in daterange(first, last): for day in daterange(first, last):
self.statistic[day] = val self.statistic[day] = val
@ -372,4 +378,5 @@ class StatisticData:
""" """
Обнуление всех дней Обнуление всех дней
""" """
self.statistic.clear()
self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0) self.fill_daterange(self.start_date, self.end_date + timedelta(days=1), 0)

View File

@ -1,67 +0,0 @@
# 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),
),
]

View File

@ -0,0 +1,28 @@
# Generated by Django 3.1.6 on 2021-03-11 14:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('main', '0010_userprofile_meta'),
]
operations = [
migrations.AddField(
model_name='rolechangelogs',
name='old_role',
field=models.IntegerField(default=0, 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.IntegerField(default=0, help_text='Код роли пользователя'),
),
]

View File

@ -31,9 +31,11 @@ def save_user_profile(sender, instance, **kwargs):
class RoleChangeLogs(models.Model): 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.IntegerField(help_text='Старая роль') old_role = models.IntegerField(default=0, help_text='Старая роль')
new_role = models.IntegerField(help_text='Присвоенная роль') new_role = models.IntegerField(default=0, 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='Кем была изменена роль')

View File

@ -21,26 +21,29 @@
{% endfor %} {% endfor %}
<input type="submit"> <input type="submit">
</form> </form>
{% for key,val in log_stats.items %}
<h3>{{key}} <b>|</b> {{val}}</h3>
<br>
{% endfor %}
<ul> <ul>
{% for error in errors %} {% for error in errors %}
<li>{{error}}</li> <li><span class="badge bg-danger">{{error}}</span></li>
{% endfor %} {% endfor %}
</ul> </ul>
{%if form.errors%} {%if form.errors%}
<ul> <ul>
{% for field, errors in form.errors.items %} {% for field, errors in form.errors.items %}
{% for error in errors %} {% for error in errors %}
<li>{{error}}</li> <li><span class="badge bg-danger">{{error}}</span></li>
{% endfor %} {% endfor %}
{% endfor %} {% endfor %}
</ul> </ul>
{%endif%} {%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> </div>
{% endblock %} {% endblock %}

View File

@ -236,6 +236,7 @@ def statistic_page(request):
return redirect('index') return redirect('index')
context = { context = {
'pagename': 'страница статистики', 'pagename': 'страница статистики',
'errors': list(),
} }
if request.method == "POST": if request.method == "POST":
form = StatisticForm(request.POST) form = StatisticForm(request.POST)