wikimedia/wikimedia-fundraising-tools

View on GitHub
fundraising_ab_tests/fundraising_experiment.py

Summary

Maintainability
A
3 hrs
Test Coverage
import logging

import mediawiki.centralnotice.api
from process.globals import get_config
from .results import get_banner_results

log = logging.getLogger(__name__)


class FrTest(object):
    """Single N-way test

    Currently, only banner tests are supported."""

    def __init__(self, label=None, type="", campaign=None, banners=None, start=None, end=None, disabled=False, **ignore):
        config = get_config()
        for key in config.ignored_columns:
            if key in ignore:
                ignore.pop(key)
        if ignore:
            log.warning("ignoring columns: {columns}".format(columns=", ".join(list(ignore.keys()))))

        self.campaign = mediawiki.centralnotice.api.get_campaign(campaign)
        if not self.campaign:
            log.warning("no such campaign '{campaign}'".format(campaign=campaign))

        self.type = type.lower()

        self.banners = []
        if self.type.count('banner') > 0:
            self.is_banner_test = True
            if banners:
                if hasattr(banners, 'strip'):
                    banners = [s.strip() for s in banners.split(",")]
                self.banners = banners
            else:
                if self.campaign['banners']:
                    self.banners = list(self.campaign['banners'].keys())

            # self.variations = [ FrTestVariation(banner=name) for name in self.banners ]

        self.is_country_test = (self.type.count('country') > 0)
        self.is_lp_test = (self.type.count('lp') > 0)

        self.start_time = start
        self.end_time = end

        self.label = label
        if not self.label:
            # FIXME
            self.label = campaign

        self.enabled = not disabled

        self.results = []

    def load_results(self):
        if self.is_banner_test and self.banners:
            cases = []
            for name in self.banners:
                test_case = self.get_case(
                    campaign=self.campaign['name'],
                    banner=name,
                    languages=self.campaign['languages'],
                    countries=self.campaign['countries'],
                )
                cases.append(test_case)

            self.results.extend(get_banner_results(cases))

        if self.is_country_test:
            # results = [ calculate_result(country=code) for code in campaign['countries'] ]
            # self.results.extend(results)
            log.warning("country test type not implemented")

        if self.is_lp_test:
            log.warning("LP test type not implemented")

    def get_case(self, **kw):
        conditions = {
            'start': self.start_time,
            'end': self.end_time,
        }
        conditions.update(**kw)

        return conditions

    def __repr__(self):
        description = '''
Test: %(label)s (%(campaigns)s) %(start)s - %(end)s
''' % {
            'label': self.label,
            'campaigns': self.campaign['name'],
            'start': self.start_time,
            'end': self.end_time,
        }
        if not self.enabled:
            description += " DISABLED "
        if self.is_banner_test:
            description += " banners: " + str(self.banners)
        if self.is_country_test:
            description += " countries: " + str(self.countries)
        if self.is_lp_test:
            description += " lps: " + str(self.lps)
        return description

# class FrTestVariation(object):