Beispiel #1
0
class StaleAgencyTaskList(TaskList):
    model = StaleAgencyTask
    filter_class = StaleAgencyTaskFilterSet
    title = 'Stale Agencies'
    queryset = (
        StaleAgencyTask.objects.select_related('agency').prefetch_related(
            'agency__foiarequest_set__communications__foia__jurisdiction',
            Prefetch(
                'agency__foiarequest_set',
                queryset=FOIARequest.objects.get_open(
                ).select_related('jurisdiction').filter(
                    communications__response=True).annotate(
                        latest_response=ExtractDay(
                            Now() - Max('communications__date'))).filter(
                                latest_response__gte=STALE_DURATION).order_by(
                                    '-latest_response'),
                to_attr='stale_requests_'),
        ))

    def task_post_helper(self, request, task):
        """Check the new email is valid and, if so, apply it"""
        if request.POST.get('update'):
            email_form = StaleAgencyTaskForm(request.POST)
            if email_form.is_valid():
                new_email = email_form.cleaned_data['email']
                foia_pks = request.POST.getlist('foia')
                foias = FOIARequest.objects.filter(pk__in=foia_pks)
                task.update_email(new_email, foias)
            else:
                messages.error(request, 'The email is invalid.')
                return
        return super(StaleAgencyTaskList, self).task_post_helper(request, task)
Beispiel #2
0
 def get_stale(self, agency=None):
     """Load requests for a stale agency"""
     foia_qs = (self.get_open().annotate(
         latest_response=ExtractDay(Now() - Max(
             Case(
                 When(communications__response=True,
                      then='communications__date'))))).
                order_by('-latest_response').select_related('jurisdiction'))
     if agency is not None:
         foia_qs = foia_qs.filter(agency=agency)
     return foia_qs
Beispiel #3
0
 def stale_requests(self):
     """Returns a list of stale requests associated with the task's agency"""
     if hasattr(self.agency, 'stale_requests_'):
         return self.agency.stale_requests_
     # a request is stale when it is open
     # and it has autofollowups enabled
     requests = (FOIARequest.objects.filter(agency=self.agency).get_open(
     ).filter(disable_autofollowups=False).annotate(
         latest_communication=ExtractDay(Now() -
                                         Max('communications__date'))
     ).order_by('-latest_communication').select_related('jurisdiction'))
     return requests
Beispiel #4
0
def store_statistics():
    """Store the daily statistics"""

    yesterday = date.today() - timedelta(1)

    stats = Statistics.objects.create(
        date=yesterday,
        total_requests=FOIARequest.objects.count(),
        total_requests_success=
            FOIARequest.objects.filter(status='done').count(),
        total_requests_denied=
            FOIARequest.objects.filter(status='rejected').count(),
        total_requests_draft=
            FOIARequest.objects.filter(status='started').count(),
        total_requests_submitted=
            FOIARequest.objects.filter(status='submitted').count(),
        total_requests_awaiting_ack=
            FOIARequest.objects.filter(status='ack').count(),
        total_requests_awaiting_response=
            FOIARequest.objects.filter(status='processed').count(),
        total_requests_awaiting_appeal=
            FOIARequest.objects.filter(status='appealing').count(),
        total_requests_fix_required=
            FOIARequest.objects.filter(status='fix').count(),
        total_requests_payment_required=
            FOIARequest.objects.filter(status='payment').count(),
        total_requests_no_docs=
            FOIARequest.objects.filter(status='no_docs').count(),
        total_requests_partial=
            FOIARequest.objects.filter(status='partial').count(),
        total_requests_abandoned=
            FOIARequest.objects.filter(status='abandoned').count(),
        total_requests_lawsuit=
            FOIARequest.objects.filter(status='lawsuit').count(),
        requests_processing_days=(FOIARequest.objects
            .filter(status='submitted')
            .exclude(date_processing=None)
            .aggregate(days=Sum(date.today() - F('date_processing')))['days']),
        sent_communications_email=FOIACommunication.objects
            .filter(
                date__range=(yesterday, date.today()),
                response=False,
                delivered='email',
                ).count(),
        sent_communications_fax=FOIACommunication.objects
            .filter(
                date__range=(yesterday, date.today()),
                response=False,
                delivered='fax',
                ).count(),
        sent_communications_mail=FOIACommunication.objects
            .filter(
                date__range=(yesterday, date.today()),
                response=False,
                delivered='mail',
                ).count(),
        machine_requests=
            FoiaMachineRequest.objects.count(),
        machine_requests_success=
            FoiaMachineRequest.objects.filter(status='done').count(),
        machine_requests_denied=
            FoiaMachineRequest.objects.filter(status='rejected').count(),
        machine_requests_draft=
            FoiaMachineRequest.objects.filter(status='started').count(),
        machine_requests_submitted=
            FoiaMachineRequest.objects.filter(status='submitted').count(),
        machine_requests_awaiting_ack=
            FoiaMachineRequest.objects.filter(status='ack').count(),
        machine_requests_awaiting_response=
            FoiaMachineRequest.objects.filter(status='processed').count(),
        machine_requests_awaiting_appeal=
            FoiaMachineRequest.objects.filter(status='appealing').count(),
        machine_requests_fix_required=
            FoiaMachineRequest.objects.filter(status='fix').count(),
        machine_requests_payment_required=
            FoiaMachineRequest.objects.filter(status='payment').count(),
        machine_requests_no_docs=
            FoiaMachineRequest.objects.filter(status='no_docs').count(),
        machine_requests_partial=
            FoiaMachineRequest.objects.filter(status='partial').count(),
        machine_requests_abandoned=
            FoiaMachineRequest.objects.filter(status='abandoned').count(),
        machine_requests_lawsuit=
            FoiaMachineRequest.objects.filter(status='lawsuit').count(),
        total_pages=FOIAFile.objects.aggregate(Sum('pages'))['pages__sum'],
        total_users=User.objects.count(),
        total_users_excluding_agencies=
            User.objects.exclude(profile__acct_type='agency').count(),
        total_users_filed=User.objects.annotate(
                num_foia=Count('foiarequest')
        ).exclude(
                num_foia=0,
        ).count(),
        total_agencies=Agency.objects.count(),
        total_fees=FOIARequest.objects.aggregate(Sum('price'))['price__sum'],
        pro_users=Profile.objects.filter(acct_type='pro').count(),
        pro_user_names=';'.join(p.user.username for p in Profile.objects.filter(acct_type='pro')),
        daily_requests_pro=FOIARequest.objects.filter(
            user__profile__acct_type='pro',
            date_submitted=yesterday
        ).exclude(
            user__profile__organization__active=True,
            user__profile__organization__monthly_cost__gt=0,
        ).count(),
        daily_requests_basic=FOIARequest.objects.filter(
            user__profile__acct_type='basic',
            date_submitted=yesterday
        ).exclude(
            user__profile__organization__active=True,
            user__profile__organization__monthly_cost__gt=0,
        ).count(),
        daily_requests_beta=FOIARequest.objects.filter(
            user__profile__acct_type='beta',
            date_submitted=yesterday
        ).exclude(
            user__profile__organization__active=True,
            user__profile__organization__monthly_cost__gt=0,
        ).count(),
        daily_requests_proxy=FOIARequest.objects.filter(
            user__profile__acct_type='proxy',
            date_submitted=yesterday
        ).exclude(
            user__profile__organization__active=True,
            user__profile__organization__monthly_cost__gt=0,
        ).count(),
        daily_requests_admin=FOIARequest.objects.filter(
            user__profile__acct_type='admin',
            date_submitted=yesterday
        ).exclude(
            user__profile__organization__active=True,
            user__profile__organization__monthly_cost__gt=0,
        ).count(),
        daily_requests_org=FOIARequest.objects.filter(
            user__profile__organization__active=True,
            user__profile__organization__monthly_cost__gt=0,
            date_submitted=yesterday
        ).count(),
        daily_articles=Article.objects.filter(
                pub_date__gte=yesterday, pub_date__lt=date.today()).count(),
        orphaned_communications=
            FOIACommunication.objects.filter(foia=None).count(),
        stale_agencies=Agency.objects.filter(stale=True).count(),
        unapproved_agencies=Agency.objects.filter(status='pending').count(),
        total_tasks=Task.objects.count(),
        total_unresolved_tasks=Task.objects.filter(resolved=False).count(),
        total_generic_tasks=GenericTask.objects.count(),
        total_unresolved_generic_tasks=
            GenericTask.objects.filter(resolved=False).count(),
        total_orphan_tasks=OrphanTask.objects.count(),
        total_unresolved_orphan_tasks=
            OrphanTask.objects.filter(resolved=False).count(),
        total_snailmail_tasks=SnailMailTask.objects.count(),
        total_unresolved_snailmail_tasks=
            SnailMailTask.objects.filter(resolved=False).count(),
        total_rejected_tasks=RejectedEmailTask.objects.count(),
        total_unresolved_rejected_tasks=
            RejectedEmailTask.objects.filter(resolved=False).count(),
        total_staleagency_tasks=StaleAgencyTask.objects.count(),
        total_unresolved_staleagency_tasks=
            StaleAgencyTask.objects.filter(resolved=False).count(),
        total_flagged_tasks=FlaggedTask.objects.count(),
        total_unresolved_flagged_tasks=
            FlaggedTask.objects.filter(resolved=False).count(),
        total_newagency_tasks=NewAgencyTask.objects.count(),
        total_unresolved_newagency_tasks=
            NewAgencyTask.objects.filter(resolved=False).count(),
        total_response_tasks=ResponseTask.objects.count(),
        total_unresolved_response_tasks=
            ResponseTask.objects.filter(resolved=False).count(),
        total_faxfail_tasks=FailedFaxTask.objects.count(),
        total_unresolved_faxfail_tasks=
            FailedFaxTask.objects.filter(resolved=False).count(),
        total_crowdfundpayment_tasks=CrowdfundTask.objects.count(),
        total_unresolved_crowdfundpayment_tasks=
            CrowdfundTask.objects.filter(resolved=False).count(),
        daily_robot_response_tasks=ResponseTask.objects.filter(
               date_done__gte=yesterday,
               date_done__lt=date.today(),
               resolved_by__profile__acct_type='robot',
               ).count(),
        flag_processing_days=(FlaggedTask.objects
            .exclude(resolved=True)
            .aggregate(days=ExtractDay(Sum(Now() - F('date_created'))))['days']),
        unresolved_snailmail_appeals=
            SnailMailTask.objects.filter(resolved=False, category='a').count(),
        total_active_org_members=Profile.objects.filter(
                organization__active=True,
                organization__monthly_cost__gt=0,
                ).count(),
        total_active_orgs=Organization.objects.filter(
                active=True,
                monthly_cost__gt=0,
                ).count(),
        total_crowdfunds=Crowdfund.objects.count(),
        total_crowdfunds_pro=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='pro') |
                Q(projects__contributors__profile__acct_type='pro')
                ).count(),
        total_crowdfunds_basic=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='basic') |
                Q(projects__contributors__profile__acct_type='basic')
                ).count(),
        total_crowdfunds_beta=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='beta') |
                Q(projects__contributors__profile__acct_type='beta')
                ).count(),
        total_crowdfunds_proxy=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='proxy') |
                Q(projects__contributors__profile__acct_type='proxy')
                ).count(),
        total_crowdfunds_admin=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='admin') |
                Q(projects__contributors__profile__acct_type='admin')
                ).count(),
        open_crowdfunds=Crowdfund.objects.filter(closed=False).count(),
        open_crowdfunds_pro=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='pro') |
                Q(projects__contributors__profile__acct_type='pro'),
                closed=False,
                ).count(),
        open_crowdfunds_basic=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='basic') |
                Q(projects__contributors__profile__acct_type='basic'),
                closed=False,
                ).count(),
        open_crowdfunds_beta=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='beta') |
                Q(projects__contributors__profile__acct_type='beta'),
                closed=False,
                ).count(),
        open_crowdfunds_proxy=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='proxy') |
                Q(projects__contributors__profile__acct_type='proxy'),
                closed=False,
                ).count(),
        open_crowdfunds_admin=Crowdfund.objects.filter(
                Q(foia__user__profile__acct_type='admin') |
                Q(projects__contributors__profile__acct_type='admin'),
                closed=False,
                ).count(),
        closed_crowdfunds_0=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent=0)
            .count(),
        closed_crowdfunds_0_25=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=0, percent__lte=0.25)
            .count(),
        closed_crowdfunds_25_50=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=0.25, percent__lte=0.50)
            .count(),
        closed_crowdfunds_50_75=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=0.50, percent__lte=0.75)
            .count(),
        closed_crowdfunds_75_100=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=0.75, percent__lte=1.00)
            .count(),
        closed_crowdfunds_100_125=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=1.00, percent__lte=1.25)
            .count(),
        closed_crowdfunds_125_150=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=1.25, percent__lte=1.50)
            .count(),
        closed_crowdfunds_150_175=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=1.50, percent__lte=1.75)
            .count(),
        closed_crowdfunds_175_200=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=1.75, percent__lte=2.00)
            .count(),
        closed_crowdfunds_200=Crowdfund.objects
            .annotate(percent=F('payment_received') / F('payment_required'))
            .filter(closed=True, percent__gt=2.00)
            .count(),
        total_crowdfund_payments=CrowdfundPayment.objects.count(),
        total_crowdfund_payments_loggedin=CrowdfundPayment.objects
            .exclude(user=None).count(),
        total_crowdfund_payments_loggedout=CrowdfundPayment.objects
            .filter(user=None).count(),
        public_projects=Project.objects
            .filter(private=False, approved=True).count(),
        private_projects=Project.objects
            .filter(private=True, approved=True).count(),
        unapproved_projects=Project.objects.filter(approved=False).count(),
        crowdfund_projects=Project.objects.exclude(crowdfunds=None).count(),
        project_users=User.objects.exclude(projects=None).count(),
        project_users_pro=User.objects
            .filter(profile__acct_type='pro').exclude(projects=None).count(),
        project_users_basic=User.objects
            .filter(profile__acct_type='basic').exclude(projects=None).count(),
        project_users_beta=User.objects
            .filter(profile__acct_type='beta').exclude(projects=None).count(),
        project_users_proxy=User.objects
            .filter(profile__acct_type='proxy').exclude(projects=None).count(),
        project_users_admin=User.objects
            .filter(profile__acct_type='admin').exclude(projects=None).count(),
        total_exemptions=Exemption.objects.count(),
        total_invoked_exemptions=InvokedExemption.objects.count(),
        total_example_appeals=ExampleAppeal.objects.count(),
        )
    # stats needs to be saved before many to many relationships can be set
    stats.users_today = User.objects.filter(last_login__year=yesterday.year,
                                            last_login__month=yesterday.month,
                                            last_login__day=yesterday.day)
    stats.save()