@cronjobs.register
def calculate_csat_metrics():
    user = settings.SURVEYGIZMO_USER
    password = settings.SURVEYGIZMO_PASSWORD
    startdate = date.today() - timedelta(days=2)
    enddate = date.today() - timedelta(days=1)
    page = 1
    more_pages = True
    survey_id = SURVEYS['general']['community_health']

    csat = {
        CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        SUPPORT_FORUM_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        AOA_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        KB_ENUS_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        KB_L10N_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
    }

    counts = {
        CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        SUPPORT_FORUM_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        AOA_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        KB_ENUS_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
        KB_L10N_CONTRIBUTORS_CSAT_METRIC_CODE: 0,
    }

    while more_pages:
        response = requests.get(
            'https://restapi.surveygizmo.com/v2/survey/{survey}'
            '/surveyresponse?'
            'filter[field][0]=datesubmitted'
            '&filter[operator][0]=>=&filter[value][0]={start}+0:0:0'
            '&filter[field][1]=datesubmitted'
            '&filter[operator][1]=<&filter[value][1]={end}+0:0:0'
            '&filter[field][2]=status&filter[operator][2]=='
            '&filter[value][2]=Complete'
            '&resultsperpage=500'
            '&page={page}'
            '&user:pass={user}:{password}'.format(
                survey=survey_id, start=startdate,
                end=enddate, page=page, user=user, password=password),
            timeout=300)

        results = json.loads(response.content)
        total_pages = results.get('total_pages', 1)
        more_pages = page < total_pages

        if 'data' in results:
            for r in results['data']:
                try:
                    rating = int(r['[question(3)]'])
                except ValueError:
                    # CSAT question was not answered
                    pass
                else:
                    csat[CONTRIBUTORS_CSAT_METRIC_CODE] += rating
                    counts[CONTRIBUTORS_CSAT_METRIC_CODE] += 1

                    if len(r['[question(4), option(10010)]']):  # Army of Awesome
                        csat[AOA_CONTRIBUTORS_CSAT_METRIC_CODE] += rating
                        counts[AOA_CONTRIBUTORS_CSAT_METRIC_CODE] += 1

                    if len(r['[question(4), option(10011)]']):  # Support Forum
                        csat[SUPPORT_FORUM_CONTRIBUTORS_CSAT_METRIC_CODE] += rating
                        counts[SUPPORT_FORUM_CONTRIBUTORS_CSAT_METRIC_CODE] += 1

                    if len(r['[question(4), option(10012)]']):  # KB EN-US
                        csat[KB_ENUS_CONTRIBUTORS_CSAT_METRIC_CODE] += rating
                        counts[KB_ENUS_CONTRIBUTORS_CSAT_METRIC_CODE] += 1

                    if len(r['[question(4), option(10013)]']):  # KB L10N
                        csat[KB_L10N_CONTRIBUTORS_CSAT_METRIC_CODE] += rating
                        counts[KB_L10N_CONTRIBUTORS_CSAT_METRIC_CODE] += 1

        page += 1

    for code in csat:
        metric_kind, _ = MetricKind.objects.get_or_create(code=code)
        value = counts[code] / csat[code] if counts[code] else 50  # If no responses assume neutral
        Metric.objects.update_or_create(kind=metric_kind, start=startdate, end=enddate,
                                        defaults={'value': value})
dataset/ETHPy150Open mozilla/kitsune/kitsune/kpi/cron.py/calculate_csat_metrics/swapped operands of `/`