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 class UserListView(ListView): model = User class UserCreateView(CreateView): model = User fields = ['name', 'email'] success_url = reverse_lazy('users') class UserDetailView(DetailView): model = User context_object_name = 'user' pk_url_kwarg = 'user_id' def get_context_data(self, **kwargs): 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'] form_class = ActivityLogCreateForm def get_success_url(self): return reverse('user', kwargs={ 'user_id': self.object.user.id, }) class ActivityLogUpdateView(UpdateView): model = ActivityLog fields = ['activity', 'user', 'start_time', 'end_time'] pk_url_kwarg = 'activity_log_id' def get_success_url(self): return reverse('user', kwargs={ 'user_id': self.object.user.id, }) class ActivityLogDeleteView(DeleteView): model = ActivityLog pk_url_kwarg = 'activity_log_id' def get_success_url(self): return reverse('user', kwargs={ 'user_id': self.object.user.id, }) class UserChartsActivity(DetailView): model = User pk_url_kwarg = 'user_id' template_name_suffix = '_activity_charts' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['activity'] = Activity.objects.filter(id=self.kwargs['activity_id']).first() return context