Esempio n. 1
0
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
Esempio n. 2
0
    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)