abra at Thu Dec 27 13:44:21 +04 2018

This commit is contained in:
2018-12-27 13:44:21 +04:00
parent da6260be34
commit 8109fc7619
9 changed files with 59 additions and 14 deletions

View File

@@ -28,7 +28,7 @@ class UserChartsPie(DetailView):
sectors = sorted(list(total_time.items()), key=lambda x: x[1])
ax.pie(x=[i[1] for i in sectors], labels=[i[0] for i in sectors])
ax.pie(x=[i[1] for i in sectors], labels=[i[0] for i in sectors], autopct='%1.0f%%')
buf = io.BytesIO()
fig.savefig(buf, format='png')
@@ -59,6 +59,7 @@ class UserChartsActivityAll(DetailView):
day_hours = day_seconds / timedelta(hours=1).total_seconds()
ax.bar(days, day_hours)
ax.hlines([np.mean(day_hours)], day_l, day_r, color='orange', lw=3)
plt.xticks(days, [f'{i:%m-%d}' for i in days], rotation=60)
plt.ylabel('кол-во часов')

14
web/forms.py Normal file
View File

@@ -0,0 +1,14 @@
import bootstrap_datepicker_plus
from django import forms
from web.models import ActivityLog
class ActivityLogCreateForm(forms.ModelForm):
class Meta:
model = ActivityLog
fields = ['user', 'activity', 'start_time', 'end_time']
widgets = {
'start_time': bootstrap_datepicker_plus.DateTimePickerInput(format='%Y-%m-%d %H:%M'),
'end_time': bootstrap_datepicker_plus.DateTimePickerInput(format='%Y-%m-%d %H:%M'),
}

View File

@@ -26,14 +26,17 @@ class ActivityLog(models.Model):
logged_at = models.DateTimeField(auto_now_add=True)
def clean(self):
if self.start_time is None or self.end_time is None:
raise ValidationError(f'Не указано время: {self}')
if self.start_time >= self.end_time:
raise ValidationError(f'Illegal times: {self}')
raise ValidationError(f'Некорректное время: {self}')
for other_activity in ActivityLog.objects.filter(user=self.user).exclude(id=self.id):
l = max(self.start_time, other_activity.start_time)
r = min(self.end_time, other_activity.end_time)
if r > l:
raise ValidationError(f'Intersects with another activity: \n{self}\n{other_activity}\n{l}, {r}')
raise ValidationError(f'Пересекается с другой активностью: \n{self}\n{other_activity}\n{l}, {r}')
def __str__(self):
return f'ActivityLog[{self.user}, {self.activity}] {self.start_time}-{self.end_time} ({self.end_time - self.start_time})'

View File

@@ -1,6 +1,8 @@
import numpy as np
from django.urls import reverse, reverse_lazy
from django.views.generic import CreateView, DeleteView, DetailView, ListView, UpdateView
from web.forms import ActivityLogCreateForm
from web.models import ActivityLog, User, Activity
@@ -23,12 +25,26 @@ class UserDetailView(DetailView):
context = super().get_context_data(**kwargs)
context['activity_logs'] = ActivityLog.objects.filter(user=self.object).order_by('start_time')
context['activities'] = set(i.activity for i in ActivityLog.objects.filter(user=self.object))
total_times = {i: 0 for i in context['activities']}
total = 0
for i in context['activity_logs']:
total_times[i.activity] += (i.end_time - i.start_time).total_seconds()
total += (i.end_time - i.start_time).total_seconds()
keys = list(total_times.keys())
context['activities_and_pcts'] = [
(keys[i], total_times[keys[i]] / total * 100)
for i in reversed(np.argsort(list(total_times.values())))
]
return context
class ActivityLogCreateView(CreateView):
model = ActivityLog
fields = ['activity', 'user', 'start_time', 'end_time']
# fields = ['activity', 'user', 'start_time', 'end_time']
form_class = ActivityLogCreateForm
def get_success_url(self):
return reverse('user', kwargs={
@@ -66,5 +82,3 @@ class UserChartsActivity(DetailView):
context = super().get_context_data(**kwargs)
context['activity'] = Activity.objects.filter(id=self.kwargs['activity_id']).first()
return context