Пример #1
0
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        org = self.user.get_org()

        super(BaselineTermForm, self).__init__(*args, **kwargs)

        if org:
            polls = Poll.get_all(org).order_by('name')
            self.fields['baseline_poll'].queryset = polls
            self.fields['follow_up_poll'].queryset = polls
Пример #2
0
    def __init__(self, *args, **kwargs):
        org = kwargs.pop('org')

        super(SpoofDataForm, self).__init__(*args, **kwargs)

        if org:
            contacts = Contact.get_all(org).order_by('name')
            self.fields['contacts'].queryset = contacts
            questions = Question.objects.filter(poll__in=Poll.get_all(org))
            self.fields['baseline_question'].queryset = questions
            self.fields['follow_up_question'].queryset = questions
Пример #3
0
def fetch_org_runs(org_id):
    """
    Fetches new and modified flow runs for the given org and creates/updates
    poll responses.
    """
    from tracpro.orgs_ext.constants import TaskType
    from tracpro.polls.models import Poll, PollRun, Response

    org = Org.objects.get(pk=org_id)

    client = org.get_temba_client()
    redis_connection = get_redis_connection()
    last_time_key = LAST_FETCHED_RUN_TIME_KEY % org.pk
    last_time = redis_connection.get(last_time_key)

    if last_time is not None:
        last_time = parse_iso8601(last_time)
    else:
        newest_runs = Response.objects.filter(pollrun__poll__org=org).order_by("-created_on")
        newest_runs = newest_runs.exclude(pollrun__pollrun_type=PollRun.TYPE_SPOOFED)
        newest_run = newest_runs.first()
        last_time = newest_run.created_on if newest_run else None

    until = timezone.now()

    total_runs = 0
    for poll in Poll.get_all(org):
        poll_runs = client.get_runs(flows=[poll.flow_uuid], after=last_time, before=until)
        total_runs += len(poll_runs)

        # convert flow runs into poll responses
        for run in poll_runs:
            try:
                Response.from_run(org, run, poll=poll)
            except ValueError as e:
                logger.error("Unable to save run #%d due to error: %s" % (run.id, e.message))
                continue

    logger.info(
        "Fetched %d new and updated runs for org #%d (since=%s)"
        % (total_runs, org.id, format_iso8601(last_time) if last_time else "Never")
    )

    task_result = dict(time=datetime_to_ms(timezone.now()), counts=dict(fetched=total_runs))
    org.set_task_result(TaskType.fetch_runs, task_result)

    redis_connection.set(last_time_key, format_iso8601(until))
Пример #4
0
    def handle(self, *args, **options):
        org_id = int(args[0]) if args else None
        if not org_id:
            raise CommandError("Most provide valid org id")

        try:
            org = Org.objects.get(pk=org_id)
        except Org.DoesNotExist:
            raise CommandError("No such org with id %d" % org_id)

        minutes, hours, days = options['minutes'], options['hours'], options[
            'days']

        if not (minutes or hours or days):
            raise CommandError(
                "Must provide at least one of --minutes --hours or --days")

        since = timezone.now() - relativedelta(
            minutes=minutes, hours=hours, days=days)

        self.stdout.write('Fetching responses for org %s since %s...' %
                          (org.name, since.strftime('%b %d, %Y %H:%M')))

        client = org.get_temba_client()

        polls_by_flow_uuids = {p.flow_uuid: p for p in Poll.get_all(org)}

        runs = client.get_runs(flows=polls_by_flow_uuids.keys(), after=since)

        self.stdout.write("Fetched %d runs for org %s" % (len(runs), org.id))

        created = 0
        updated = 0
        for run in runs:
            poll = polls_by_flow_uuids[run.flow]
            try:
                response = Response.from_run(org, run, poll=poll)
            except ValueError, e:
                self.stderr.write("Unable to save run #%d due to error: %s" %
                                  (run.id, e.message))
                continue

            if getattr(response, 'is_new', False):
                created += 1
            else:
                updated += 1
Пример #5
0
    def handle(self, *args, **options):
        org_id = int(args[0]) if args else None
        if not org_id:
            raise CommandError("Most provide valid org id")

        try:
            org = Org.objects.get(pk=org_id)
        except Org.DoesNotExist:
            raise CommandError("No such org with id %d" % org_id)

        minutes, hours, days = options['minutes'], options['hours'], options['days']

        if not (minutes or hours or days):
            raise CommandError("Must provide at least one of --minutes --hours or --days")

        since = timezone.now() - relativedelta(minutes=minutes, hours=hours, days=days)

        self.stdout.write('Fetching responses for org %s since %s...' % (org.name, since.strftime('%b %d, %Y %H:%M')))

        client = org.get_temba_client()

        polls_by_flow_uuids = {p.flow_uuid: p for p in Poll.get_all(org)}

        runs = client.get_runs(flows=polls_by_flow_uuids.keys(), after=since)

        self.stdout.write("Fetched %d runs for org %s" % (len(runs), org.id))

        created = 0
        updated = 0
        for run in runs:
            if run.flow not in polls_by_flow_uuids:
                continue  # Response is for a Poll not tracked for this org.

            poll = polls_by_flow_uuids[run.flow]
            try:
                response = Response.from_run(org, run, poll=poll)
            except ValueError as e:
                self.stderr.write("Unable to save run #%d due to error: %s" % (run.id, e.message))
                continue

            if getattr(response, 'is_new', False):
                created += 1
            else:
                updated += 1

        self.stdout.write("Created %d new responses and updated %d existing responses" % (created, updated))
Пример #6
0
    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        context['polls'] = Poll.get_all(self.request.org).order_by('name')

        # Loop through all baseline terms, until we find one with data
        for baselineterm in BaselineTerm.objects.all().order_by('-end_date'):
            data_found = baselineterm.check_for_data(self.request.data_regions)
            if data_found:
                answers_dict, baseline_dict, all_regions, date_list = chart_baseline(
                    baselineterm=baselineterm, regions=self.request.data_regions, region_selected=0)
                context['all_regions'] = all_regions
                context['date_list'] = date_list
                context['baseline_dict'] = baseline_dict
                context['answers_dict'] = answers_dict
                context['baselineterm'] = baselineterm
                break  # Found our baseline chart with data, send it back to the view

        return context
Пример #7
0
    def get_context_data(self, **kwargs):
        context = super(HomeView, self).get_context_data(**kwargs)
        context['polls'] = Poll.get_all(self.request.org).order_by('name')
        # Loop through all baseline terms, until we find one with data
        baselineterms = BaselineTerm.get_all(self.request.org).order_by('-end_date')
        for baselineterm in baselineterms:
            data_found = baselineterm.check_for_data(self.request.data_regions)
            if data_found:
                (follow_up_list, baseline_list, all_regions, date_list,
                 baseline_mean, baseline_std, follow_up_mean, follow_up_std,
                 baseline_response_rate, follow_up_response_rate) = chart_baseline(
                    baselineterm=baselineterm, regions=self.request.data_regions, region_selected=None)
                context['all_regions'] = all_regions
                context['date_list'] = date_list
                context['baseline_list'] = baseline_list
                context['follow_up_list'] = follow_up_list
                context['baselineterm'] = baselineterm
                break  # Found our baseline chart with data, send it back to the view

        # Return top 5 baseline terms only
        context['baselineterms'] = baselineterms[0:5]

        return context
Пример #8
0
 def get_context_data(self, **kwargs):
     context = super(HomeView, self).get_context_data(**kwargs)
     context['polls'] = Poll.get_all(self.request.org).order_by('name')
     return context