class WorkflowListView(WorkflowViewBase, ListView): context_object_name = 'workflows' paginate_by = 20 paginate_orphans = 4 model = Workflow def get(self, request, *args, **kwargs): # allows us to set defaults on the form params = QueryDict(mutable=True) params.update(request.GET) # initial state params.setdefault('state', 'open') self.form = WorkflowFilterForm(params) self.form.is_valid() return super(WorkflowListView, self).get(request, *args, **kwargs) def get_queryset(self): workflows = Workflow.objects.filter(country=self.country, locality=self.locality) return self.form.filter_queryset(workflows) def get_context_data(self, **kwargs): context = super(WorkflowListView, self).get_context_data(**kwargs) context['form'] = self.form workflows = context['workflows'] # count tasks by state task_stats = Workflow.objects\ .values('id', 'tasks__state')\ .annotate(n_tasks=Count('tasks__id'))\ .filter(id__in=[w.id for w in workflows]) for w in workflows: w.task_counts = { s['tasks__state']: s['n_tasks'] for s in task_stats if s['id'] == w.id } w.task_counts['total'] = sum(x for x in w.task_counts.values()) w.task_counts['complete'] = w.task_counts.get( 'cancelled', 0) + w.task_counts.get('done', 0) w.task_counts['assigned'] = w.tasks.filter(state='open').exclude( assigned_to=None).count() if w.task_counts['assigned'] > 0: w.task_counts['open'] -= w.task_counts['assigned'] w.pct_complete = w.task_counts['complete'] / ( w.task_counts['total'] or 1) * 100.0 w.task_charts = [ (s, w.task_counts.get(s, 0), s.replace('_', ' ')) for s in ['open', 'assigned', 'pending_review', 'cancelled'] ] return context
def get(self, request, *args, **kwargs): # allows us to set defaults on the form params = QueryDict(mutable=True) params.update(request.GET) # initial state params.setdefault('state', 'open') self.form = WorkflowFilterForm(params) self.form.is_valid() return super(WorkflowListView, self).get(request, *args, **kwargs)