From 5035ce8be511a6a130d1abf99c4769da233288f5 Mon Sep 17 00:00:00 2001 From: Ivan Savov Date: Mon, 26 Sep 2016 13:13:09 -0400 Subject: [PATCH 1/2] Notes about data model learned from debugging #153. --- docs/design.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 docs/design.md diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 00000000..01c8d957 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,78 @@ + +High-level design document +========================== + + +Data model +---------- + + - Users: Django built in user model + - Session: Django session is used to store information under the following keys: + - `experiments_enrollments` **WHAT SHOULD THIS CONTAIN?** + - `experiments_goals` + - `experiments_session_key` **WHEN IS IT WRITTEN?** + - `experiments_verified_human` + - Cookies: + - `sessionid` used to associate with Django session stored on server side + - Experiments: + - Experiments and experiment alternatives are automatically created when first + occurrence in a template or view code appears. They are stored in table `experiments_experiment` + + +-----------+-------------+---------------+---------------------+--------------------+-------+------------+----------+ + | name (PK) | description | alternatives" | relevant_chi2_goals | relevant_mwu_goals | state | start_date | end_date | + + - Enrolments + - Bots are ignored + - Session-based users are enroled based on session id **STORED WHERE?** + - Logged in users are enroled based on their user id using table `experiments_enrollment` + + +-----+-----------------+-----------+-------------+---------------+---------+ + | id | enrollment_date | last_seen | alternative | experiment_id | user_id | + + - Goals: + - Definitions, goals must be created in advance and described in `settings.EXPERIMENTS_GOALS`. + - Counters are stored in Redis using the following key names: + + COUNTER_CACHE_KEY = 'experiments:participants:' + PARTICIPANT_KEY = '%s:%s:participant' % (experiment.name, alternative_name) + COUNTER_FREQ_CACHE_KEY = 'experiments:freq:%s' + GOAL_KEY = '%s:%s:%s:goal' % (experiment.name, alternative_name, goal_name) + + + +Request-response cycle +---------------------- +The workflow is different for logged in users and session-based auth. + +### Session users + + - `experiments.utils.SessionUser` + - **WHAT KEYS ARE USED ON SESSION?** + - **WHEN ARE THESE STORED?** + + +### Logged in users + + - `experiments.utils.AuthenticatedUser` + + + +Goal tracking +------------- + + - Check if user is enrolled + - Increment appropriate counter in Redis + + + + + + +Analytics +--------- + + - Read goal counters and enrolment denominator to compute rates + - Compute stats + + + From faa938d594814070ce101a715990f3c1fecce428 Mon Sep 17 00:00:00 2001 From: Ivan Savov Date: Mon, 5 Dec 2016 14:48:45 -0500 Subject: [PATCH 2/2] indentation fix --- docs/design.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/docs/design.md b/docs/design.md index 01c8d957..7947ba69 100644 --- a/docs/design.md +++ b/docs/design.md @@ -18,27 +18,31 @@ Data model - Experiments and experiment alternatives are automatically created when first occurrence in a template or view code appears. They are stored in table `experiments_experiment` - +-----------+-------------+---------------+---------------------+--------------------+-------+------------+----------+ - | name (PK) | description | alternatives" | relevant_chi2_goals | relevant_mwu_goals | state | start_date | end_date | - + ``` + +-----------+-------------+---------------+---------------------+--------------------+-------+------------+----------+ + | name (PK) | description | alternatives" | relevant_chi2_goals | relevant_mwu_goals | state | start_date | end_date | + ``` + - Enrolments - Bots are ignored - Session-based users are enroled based on session id **STORED WHERE?** - Logged in users are enroled based on their user id using table `experiments_enrollment` - - +-----+-----------------+-----------+-------------+---------------+---------+ - | id | enrollment_date | last_seen | alternative | experiment_id | user_id | + + ``` + +-----+-----------------+-----------+-------------+---------------+---------+ + | id | enrollment_date | last_seen | alternative | experiment_id | user_id | + ``` - Goals: - Definitions, goals must be created in advance and described in `settings.EXPERIMENTS_GOALS`. - Counters are stored in Redis using the following key names: - - COUNTER_CACHE_KEY = 'experiments:participants:' - PARTICIPANT_KEY = '%s:%s:participant' % (experiment.name, alternative_name) - COUNTER_FREQ_CACHE_KEY = 'experiments:freq:%s' - GOAL_KEY = '%s:%s:%s:goal' % (experiment.name, alternative_name, goal_name) - - + + ``` + COUNTER_CACHE_KEY = 'experiments:participants:' + PARTICIPANT_KEY = '%s:%s:participant' % (experiment.name, alternative_name) + COUNTER_FREQ_CACHE_KEY = 'experiments:freq:%s' + GOAL_KEY = '%s:%s:%s:goal' % (experiment.name, alternative_name, goal_name) + ``` Request-response cycle ----------------------