fix bag
This commit is contained in:
parent
ef9d0fc721
commit
dd08821aea
@ -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)
|
||||||
|
@ -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),
|
|
||||||
),
|
|
||||||
]
|
|
28
main/migrations/0011_auto_20210311_1734.py
Normal file
28
main/migrations/0011_auto_20210311_1734.py
Normal 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='Код роли пользователя'),
|
||||||
|
),
|
||||||
|
]
|
@ -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='Кем была изменена роль')
|
||||||
|
@ -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 %}
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user