From dd08821aea9b06a34b303ee4066763c7a986a512 Mon Sep 17 00:00:00 2001 From: Sokurov Idar Date: Thu, 11 Mar 2021 18:14:57 +0300 Subject: [PATCH] fix bag --- main/extra_func.py | 33 ++++++----- main/migrations/0005_auto_20210304_0119.py | 67 ---------------------- main/migrations/0011_auto_20210311_1734.py | 28 +++++++++ main/models.py | 10 ++-- main/templates/pages/stat.html | 23 ++++---- main/views.py | 1 + 6 files changed, 68 insertions(+), 94 deletions(-) delete mode 100644 main/migrations/0005_auto_20210304_0119.py create mode 100644 main/migrations/0011_auto_20210311_1734.py diff --git a/main/extra_func.py b/main/extra_func.py index 167fb09..cef57b4 100644 --- a/main/extra_func.py +++ b/main/extra_func.py @@ -185,12 +185,13 @@ def daterange(start_date, end_date) -> list: return dates -def get_timedelta(log) -> timedelta: +def get_timedelta(log,time=None) -> 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) return time @@ -227,8 +228,8 @@ class StatisticData: """ if self.is_valid_statistic(): stat = self.statistic - self._use_display(stat) - self._use_interval(stat) + stat = self._use_display(stat) + stat = self._use_interval(stat) return stat else: return None @@ -281,19 +282,21 @@ class StatisticData: Приводит данные к формату отображения """ if not self.is_valid_statistic() or not self.display: - return - for key, item in self.statistic.items(): + return stat + new_stat = {} + for key, item in stat.items(): if self.display == 'hours': - self.statistic[key] = item / 3600 + new_stat[key] = item / 3600 elif self.display == 'days': - self.statistic[key] = item / 86400 + new_stat[key] = item / 86400 + return new_stat def _use_interval(self, stat): """ Объединяет ключи и значения в соответствии с интервалом работы """ if not self.is_valid_statistic() or not self.interval: - return + return stat new_stat = {} if self.interval == 'months': # Переделываем ключи под формат('начало_месяца - конец_месяца') @@ -307,7 +310,7 @@ class StatisticData: new_stat[index] = value elif self.interval == 'days': new_stat = stat # статистика изначально в днях - self.statistic = new_stat + return new_stat def check_time(self): """ @@ -341,12 +344,16 @@ class StatisticData: self.warnings += ['Не обнаружены изменения роли в данном промежутке'] return None first_log, last_log = self.data[0], self.data[len(self.data) - 1] + if first_log.old_role == ROLES['engineer']: self.fill_daterange(self.start_date, first_log.change_time.date()) self.statistic[first_log.change_time.date()] += get_timedelta(first_log).total_seconds() + 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() + for log_index in range(len(self.data) - 1): if self.data[log_index].new_role == ROLES['engineer']: current_log, next_log = self.data[log_index], self.data[log_index + 1] @@ -364,7 +371,6 @@ class StatisticData: Заполение диапазона дат значением val по умолчанию val = кол-во секунд в 1 дне """ - self.statistic.clear() for day in daterange(first, last): 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) diff --git a/main/migrations/0005_auto_20210304_0119.py b/main/migrations/0005_auto_20210304_0119.py deleted file mode 100644 index 361ec25..0000000 --- a/main/migrations/0005_auto_20210304_0119.py +++ /dev/null @@ -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), - ), - ] diff --git a/main/migrations/0011_auto_20210311_1734.py b/main/migrations/0011_auto_20210311_1734.py new file mode 100644 index 0000000..c228bfc --- /dev/null +++ b/main/migrations/0011_auto_20210311_1734.py @@ -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='Код роли пользователя'), + ), + ] diff --git a/main/models.py b/main/models.py index 72947df..95d38f2 100644 --- a/main/models.py +++ b/main/models.py @@ -31,9 +31,11 @@ def save_user_profile(sender, instance, **kwargs): 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='Имя пользователя') - old_role = models.IntegerField(help_text='Старая роль') - new_role = models.IntegerField(help_text='Присвоенная роль') + old_role = models.IntegerField(default=0, help_text='Старая роль') + new_role = models.IntegerField(default=0, 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='Кем была изменена роль') diff --git a/main/templates/pages/stat.html b/main/templates/pages/stat.html index 69afbde..9279123 100644 --- a/main/templates/pages/stat.html +++ b/main/templates/pages/stat.html @@ -21,26 +21,29 @@ {% endfor %} - {% for key,val in log_stats.items %} -

{{key}} | {{val}}

-
- {% endfor %} - {%if form.errors%} {%endif%} - + + {% for key,val in log_stats.items %} +

{{key}} | {{val}}

+
+ {% endfor %} {% endblock %} diff --git a/main/views.py b/main/views.py index 5a0569f..36365f2 100644 --- a/main/views.py +++ b/main/views.py @@ -236,6 +236,7 @@ def statistic_page(request): return redirect('index') context = { 'pagename': 'страница статистики', + 'errors': list(), } if request.method == "POST": form = StatisticForm(request.POST)