Milimetric has submitted this change and it was merged.
Change subject: db design update, forms renamed, tests fixed
......................................................................
db design update, forms renamed, tests fixed
Change-Id: I8664f0f1b8a3eadeb1f110c4be5209aef393807b
---
M .gitignore
D design/User Metrics Database Model - User Tagging.mwb
A design/Wiki Metrics Database Model.mwb
M tests/fixtures.py
M tests/test_controllers/test_cohorts.py
M tests/test_metrics/test_bytes_added.py
M tests/test_models/test_mappings.py
M wikimetrics/config/db_config.yaml
M wikimetrics/controllers/metrics.py
M wikimetrics/controllers/reports.py
M wikimetrics/static/js/reportCreate.js
M wikimetrics/templates/csv_upload.html
M wikimetrics/templates/csv_upload_review.html
R wikimetrics/templates/forms/csv_upload.html
R wikimetrics/templates/forms/metric_configuration.html
A wikimetrics/templates/forms/output_configuration.html
R wikimetrics/templates/report.html
17 files changed, 170 insertions(+), 117 deletions(-)
Approvals:
Milimetric: Verified; Looks good to me, approved
diff --git a/.gitignore b/.gitignore
index 4a28ba2..00c7c63 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,6 +5,7 @@
*.csv
*.json
*.db
+*.bak
*egg-info
diff --git a/design/User Metrics Database Model - User Tagging.mwb
b/design/User Metrics Database Model - User Tagging.mwb
deleted file mode 100644
index 6628c28..0000000
--- a/design/User Metrics Database Model - User Tagging.mwb
+++ /dev/null
Binary files differ
diff --git a/design/Wiki Metrics Database Model.mwb b/design/Wiki Metrics
Database Model.mwb
new file mode 100644
index 0000000..73ed219
--- /dev/null
+++ b/design/Wiki Metrics Database Model.mwb
Binary files differ
diff --git a/tests/fixtures.py b/tests/fixtures.py
index 689a6e6..282c55a 100644
--- a/tests/fixtures.py
+++ b/tests/fixtures.py
@@ -34,24 +34,122 @@
def setUp(self):
- # create basic test records for non-mediawiki tests
- self.session = db.get_session()
-
+ #****************************************************************
+ # set up for every test - delete and re-create all needed records
+ #****************************************************************
project = 'enwiki'
+ self.session = db.get_session()
engine = db.get_mw_engine(project)
db.MediawikiBase.metadata.create_all(engine, checkfirst=True)
self.mwSession = db.get_mw_session(project)
DatabaseTest.tearDown(self)
+ #****************************************************************
+ # create records for enwiki tests
+ #****************************************************************
+ mw_user_dan = MediawikiUser(user_name='Dan')
+ mw_user_evan = MediawikiUser(user_name='Evan')
+ mw_user_andrew = MediawikiUser(user_name='Andrew')
+ mw_user_diederik = MediawikiUser(user_name='Diederik')
+ mw_logging = Logging(log_user_text='Reedy')
+ mw_page = Page(page_namespace=0, page_title='Main_Page')
+ self.mwSession.add_all([
+ mw_user_dan,
+ mw_user_evan,
+ mw_user_andrew,
+ mw_logging,
+ mw_page,
+ ])
+ self.mwSession.commit()
+
+ # edits in between Dan and Evan edits
+ rev_before_1 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_diederik.user_id,
+ rev_comment='before Dan edit 1',
+ rev_len=4, rev_timestamp=datetime(2013, 05, 30),
+ )
+ rev_before_2 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_diederik.user_id,
+ rev_comment='before Dan edit 2',
+ rev_len=0, rev_timestamp=datetime(2013, 06, 30),
+ )
+ rev_before_3 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_diederik.user_id,
+ rev_comment='before Evan edit 1',
+ rev_len=0, rev_timestamp=datetime(2013, 05, 30),
+ )
+ rev_before_4 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_diederik.user_id,
+ rev_comment='before Evan edit 2',
+ rev_len=100, rev_timestamp=datetime(2013, 06, 30),
+ )
+ rev_before_5 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_diederik.user_id,
+ rev_comment='before Evan edit 3',
+ rev_len=140, rev_timestamp=datetime(2013, 07, 23),
+ )
+ self.mwSession.add_all([
+ rev_before_1,
+ rev_before_2,
+ rev_before_3,
+ rev_before_4,
+ rev_before_5,
+ ])
+ self.mwSession.commit()
+
+ # Dan edits
+ rev1 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_dan.user_id,
rev_comment='Dan edit 1',
+ rev_parent_id=rev_before_1.rev_id, rev_len=0,
rev_timestamp=datetime(2013, 06, 01),
+ )
+ rev2 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_dan.user_id,
rev_comment='Dan edit 2',
+ rev_parent_id=rev_before_2.rev_id, rev_len=10,
rev_timestamp=datetime(2013, 07, 01),
+ )
+ # Evan edits
+ rev3 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_evan.user_id,
rev_comment='Evan edit 1',
+ rev_parent_id=rev_before_3.rev_id, rev_len=100,
rev_timestamp=datetime(2013, 06, 01),
+ )
+ rev4 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_evan.user_id,
rev_comment='Evan edit 2',
+ rev_parent_id=rev_before_4.rev_id, rev_len=140,
rev_timestamp=datetime(2013, 07, 01),
+ )
+ rev5 = Revision(
+ rev_page=mw_page.page_id, rev_user=mw_user_evan.user_id,
rev_comment='Evan edit 3',
+ rev_parent_id=rev_before_5.rev_id, rev_len=136,
rev_timestamp=datetime(2013, 07, 24),
+ )
+ self.mwSession.add_all([rev1, rev2, rev3, rev4, rev5])
+ self.mwSession.commit()
+
+ #****************************************************************
+ # create basic test records for non-mediawiki tests
+ #****************************************************************
dan_user = User(username='Dan')
evan_user = User(username='Evan')
web_test_user = User(email='[email protected]')
# create a test cohort
- dan = WikiUser(mediawiki_username='Dan', mediawiki_userid=1,
project='enwiki')
- evan = WikiUser(mediawiki_username='Evan', mediawiki_userid=2,
project='enwiki')
- andrew = WikiUser(mediawiki_username='Andrew', mediawiki_userid=3,
project='enwiki')
- diederik = WikiUser(mediawiki_username='Diederik', mediawiki_userid=4,
project='enwiki')
+ dan = WikiUser(
+ mediawiki_username=mw_user_dan.user_name,
+ mediawiki_userid=mw_user_dan.user_id,
+ project=project
+ )
+ evan = WikiUser(
+ mediawiki_username=mw_user_evan.user_name,
+ mediawiki_userid=mw_user_evan.user_id,
+ project=project
+ )
+ andrew = WikiUser(
+ mediawiki_username=mw_user_andrew.user_name,
+ mediawiki_userid=mw_user_andrew.user_id,
+ project=project
+ )
+ diederik = WikiUser(
+ mediawiki_username=mw_user_diederik.user_name,
+ mediawiki_userid=mw_user_diederik.user_id,
+ project=project
+ )
# create cohorts
test_cohort = Cohort(name='test', enabled=True, public=True)
@@ -166,57 +264,19 @@
])
self.session.commit()
- # create records for enwiki tests
- # TODO: make this safe to execute in any environment
- self.mwSession.add(MediawikiUser(user_id=1, user_name='Dan'))
- self.mwSession.add(MediawikiUser(user_id=2, user_name='Evan'))
- self.mwSession.add(MediawikiUser(user_id=3, user_name='Andrew'))
- self.mwSession.add(Logging(log_id=1, log_user_text='Reedy'))
- self.mwSession.add(Page(page_id=1, page_namespace=0,
page_title='Main_Page'))
- # edits in between Dan and Evan edits
- self.mwSession.add(Revision(
- rev_id=1, rev_page=1, rev_user=4, rev_comment='before Dan edit 1',
- rev_len=4, rev_timestamp=datetime(2013, 05, 30),
- ))
- self.mwSession.add(Revision(
- rev_id=3, rev_page=1, rev_user=4, rev_comment='before Dan edit 2',
- rev_len=0, rev_timestamp=datetime(2013, 06, 30),
- ))
- self.mwSession.add(Revision(
- rev_id=5, rev_page=1, rev_user=4, rev_comment='before Evan edit 1',
- rev_len=0, rev_timestamp=datetime(2013, 05, 30),
- ))
- self.mwSession.add(Revision(
- rev_id=7, rev_page=1, rev_user=4, rev_comment='before Evan edit 2',
- rev_len=100, rev_timestamp=datetime(2013, 06, 30),
- ))
- self.mwSession.add(Revision(
- rev_id=9, rev_page=1, rev_user=4, rev_comment='before Evan edit 3',
- rev_len=140, rev_timestamp=datetime(2013, 07, 23),
- ))
- # Dan edits
- self.mwSession.add(Revision(
- rev_id=2, rev_page=1, rev_user=1, rev_comment='Dan edit 1',
- rev_parent_id=1, rev_len=0, rev_timestamp=datetime(2013, 06, 01),
- ))
- self.mwSession.add(Revision(
- rev_id=4, rev_page=1, rev_user=1, rev_comment='Dan edit 2',
- rev_parent_id=3, rev_len=10, rev_timestamp=datetime(2013, 07, 01),
- ))
- # Evan edits
- self.mwSession.add(Revision(
- rev_id=6, rev_page=1, rev_user=2, rev_comment='Evan edit 1',
- rev_parent_id=5, rev_len=100, rev_timestamp=datetime(2013, 06, 01),
- ))
- self.mwSession.add(Revision(
- rev_id=8, rev_page=1, rev_user=2, rev_comment='Evan edit 2',
- rev_parent_id=7, rev_len=140, rev_timestamp=datetime(2013, 07, 01),
- ))
- self.mwSession.add(Revision(
- rev_id=10, rev_page=1, rev_user=2, rev_comment='Evan edit 3',
- rev_parent_id=9, rev_len=136, rev_timestamp=datetime(2013, 07, 24),
- ))
- self.mwSession.commit()
+ #****************************************************************
+ # keep the test ids around so subclasses can use them
+ #****************************************************************
+ self.test_report_id = report_created.id
+ self.test_user_id = dan_user.id
+ self.test_cohort_id = test_cohort.id
+ self.test_cohort_user_id = dan_owns_test.id
+ self.test_wiki_user_id = dan.id
+ self.test_cohort_wiki_user_id = dan_in_test.id
+ self.test_logging_id = mw_logging.log_id
+ self.test_mediawiki_user_id = mw_user_dan.user_id
+ self.test_page_id = mw_page.page_id
+ self.test_revision_id = rev1.rev_id
def tearDown(self):
@@ -291,7 +351,15 @@
.join(CohortWikiUser)\
.filter(CohortWikiUser.cohort_id == self.cohort.id)
- self.dan_id = wikiusers.filter(WikiUser.mediawiki_username ==
'Dan').one().id
- self.evan_id = wikiusers.filter(WikiUser.mediawiki_username ==
'Evan').one().id
- self.andrew_id = wikiusers.filter(WikiUser.mediawiki_username ==
'Andrew').one().id
- self.diederik_id = wikiusers.filter(WikiUser.mediawiki_username ==
'Diederik').one().id
+ self.dan_id = wikiusers\
+ .filter(WikiUser.mediawiki_username == 'Dan')\
+ .one().mediawiki_userid
+ self.evan_id = wikiusers\
+ .filter(WikiUser.mediawiki_username == 'Evan')\
+ .one().mediawiki_userid
+ self.andrew_id = wikiusers\
+ .filter(WikiUser.mediawiki_username == 'Andrew')\
+ .one().mediawiki_userid
+ self.diederik_id = wikiusers\
+ .filter(WikiUser.mediawiki_username == 'Diederik')\
+ .one().mediawiki_userid
diff --git a/tests/test_controllers/test_cohorts.py
b/tests/test_controllers/test_cohorts.py
index 7700f30..943f215 100644
--- a/tests/test_controllers/test_cohorts.py
+++ b/tests/test_controllers/test_cohorts.py
@@ -3,17 +3,14 @@
import json
from nose.tools import assert_equal, assert_not_equal
from tests.fixtures import WebTest
-from wikimetrics.controllers.cohorts import *
+from wikimetrics.controllers.cohorts import parse_username, normalize_user
class TestCohortsController(WebTest):
def test_index(self):
response = self.app.get('/cohorts/', follow_redirects=True)
- assert_equal(
- response.status_code, 200,
- '/cohorts should get the list of cohorts'
- )
+ assert_equal(response.status_code, 200)
def test_list(self):
response = self.app.get('/cohorts/list', follow_redirects=True)
@@ -26,40 +23,21 @@
)
def test_detail(self):
- response = self.app.get('/cohorts/detail/1', follow_redirects=True)
+ response =
self.app.get('/cohorts/detail/{0}'.format(self.test_cohort_id))
parsed = json.loads(response.data)
- assert_equal(
- response.status_code,
- 200,
- )
- assert_equal(
- len(parsed['wikiusers']),
- 3,
- '/cohorts/detail/1 should return JSON object with key `wikiusers`'
- 'for a list of length 3== `test`, but instead returned:
{0}'.format(parsed)
- )
+ assert_equal(response.status_code, 200)
+ assert_equal(len(parsed['wikiusers']), 3)
def test_full_detail(self):
- response = self.app.get('/cohorts/detail/1?full_detail=true',
follow_redirects=True)
+ response =
self.app.get('/cohorts/detail/{0}?full_detail=true'.format(self.test_cohort_id))
parsed = json.loads(response.data)
- assert_equal(
- response.status_code,
- 200,
- )
- assert_equal(
- len(parsed['wikiusers']),
- 4,
- '/cohorts/detail/1 should return JSON object with key `wikiusers`'
- 'for a list of length 4== `test`, but instead returned:
{0}'.format(parsed)
- )
+ assert_equal(response.status_code, 200)
+ assert_equal(len(parsed['wikiusers']), 4)
def test_not_found(self):
response =
self.app.get('/cohorts/detail/no_way_anybody_names_a_cohort_this_23982739873')
- assert_equal(
- response.status_code,
- 404,
- )
+ assert_equal(response.status_code, 404)
def test_validate_username(self):
# this username has a few problems that the normalize call should
handle
diff --git a/tests/test_metrics/test_bytes_added.py
b/tests/test_metrics/test_bytes_added.py
index 995dd29..0eef4f8 100644
--- a/tests/test_metrics/test_bytes_added.py
+++ b/tests/test_metrics/test_bytes_added.py
@@ -17,6 +17,7 @@
)
results = metric(list(self.cohort), self.mwSession)
+ print results
dan_expected = {
'net_sum': 6,
'absolute_sum': 14,
@@ -48,6 +49,7 @@
assert_true(metric.validate())
results = metric(list(self.cohort), self.mwSession)
+ print results
dan_expected = {
'net_sum': 10,
'absolute_sum': 10,
@@ -72,6 +74,7 @@
assert_true(metric.validate())
results = metric(list(self.cohort), self.mwSession)
+ print results
dan_expected = {
'net_sum': 6,
'absolute_sum': 14,
diff --git a/tests/test_models/test_mappings.py
b/tests/test_models/test_mappings.py
index d026f7a..07a7b8d 100644
--- a/tests/test_models/test_mappings.py
+++ b/tests/test_models/test_mappings.py
@@ -23,50 +23,50 @@
#***********
def test_report(self):
- j = self.session.query(PersistentReport).get(1)
+ j = self.session.query(PersistentReport).get(self.test_report_id)
assert_true(j.status == celery.states.PENDING)
def test_user(self):
- u = self.session.query(User).get(1)
+ u = self.session.query(User).get(self.test_user_id)
assert_true(u.username == 'Dan')
assert_true(u.role == UserRole.GUEST)
def test_wikiuser(self):
- wu = self.session.query(WikiUser).get(1)
+ wu = self.session.query(WikiUser).get(self.test_wiki_user_id)
assert_equals(wu.mediawiki_username, 'Dan')
def test_cohort(self):
- c = self.session.query(Cohort).get(1)
+ c = self.session.query(Cohort).get(self.test_cohort_id)
assert_equals(c.name, 'test')
assert_true(c.public is True)
def test_cohort_user(self):
- cu = self.session.query(CohortUser).get(1)
- assert_equals(cu.user_id, 1)
- assert_equals(cu.cohort_id, 1)
+ cu = self.session.query(CohortUser).get(self.test_cohort_user_id)
+ assert_equals(cu.user_id, self.test_user_id)
+ assert_equals(cu.cohort_id, self.test_cohort_id)
def test_cohort_wikiuser(self):
- cwu = self.session.query(CohortWikiUser).get(1)
- assert_equals(cwu.wiki_user_id, 1)
- assert_equals(cwu.cohort_id, 1)
+ cwu =
self.session.query(CohortWikiUser).get(self.test_cohort_wiki_user_id)
+ assert_equals(cwu.wiki_user_id, self.test_wiki_user_id)
+ assert_equals(cwu.cohort_id, self.test_cohort_id)
#***********
# Mapping tests for mediawiki tables
#***********
def test_mediawiki_logging(self):
- row = self.mwSession.query(Logging).get(1)
+ row = self.mwSession.query(Logging).get(self.test_logging_id)
assert_equals(row.log_user_text, 'Reedy')
def test_mediawiki_user(self):
- row = self.mwSession.query(MediawikiUser).get(2)
- assert_equals(row.user_name, 'Evan')
+ row =
self.mwSession.query(MediawikiUser).get(self.test_mediawiki_user_id)
+ assert_equals(row.user_name, 'Dan')
def test_mediawiki_page(self):
- row = self.mwSession.query(Page).get(1)
+ row = self.mwSession.query(Page).get(self.test_page_id)
assert_equals(row.page_title, 'Main_Page')
def test_mediawiki_revision(self):
- row = self.mwSession.query(Revision).get(2)
+ row = self.mwSession.query(Revision).get(self.test_revision_id)
assert_equals(row.rev_comment, 'Dan edit 1')
#***********
@@ -76,10 +76,10 @@
user_ids = self.session\
.query(WikiUser.mediawiki_userid)\
.join(CohortWikiUser)\
- .filter(CohortWikiUser.cohort_id == 1)\
+ .filter(CohortWikiUser.cohort_id == self.test_cohort_id)\
.all()
- assert_true(len(user_ids) == 4, "Cohort 1 should have 4 wiki users in
it")
+ assert_equal(len(user_ids), 4)
def test_cohort_ownership(self):
cohorts = self.session\
diff --git a/wikimetrics/config/db_config.yaml
b/wikimetrics/config/db_config.yaml
index dfd0624..611b6d1 100644
--- a/wikimetrics/config/db_config.yaml
+++ b/wikimetrics/config/db_config.yaml
@@ -1,5 +1,5 @@
SQL_ECHO : False
-WIKIMETRICS_ENGINE_URL : 'sqlite:///test.db'
+#WIKIMETRICS_ENGINE_URL : 'sqlite:///test.db'
# For testing with mysql locally (useful for manual connection survival tests)
-#WIKIMETRICS_ENGINE_URL :
'mysql://wikimetrics:wikimetrics@localhost/wikimetrics'
+WIKIMETRICS_ENGINE_URL :
'mysql://wikimetrics:wikimetrics@localhost/wikimetrics'
MEDIAWIKI_ENGINE_URL_TEMPLATE : 'sqlite:///{0}.db'
diff --git a/wikimetrics/controllers/metrics.py
b/wikimetrics/controllers/metrics.py
index 95fbc7f..62574c1 100644
--- a/wikimetrics/controllers/metrics.py
+++ b/wikimetrics/controllers/metrics.py
@@ -67,7 +67,7 @@
metric_form = metric_classes[name]()
return render_template(
- 'form_for_metrics.html',
+ 'forms/metric_configuration.html',
form=metric_form,
action=request.url,
)
diff --git a/wikimetrics/controllers/reports.py
b/wikimetrics/controllers/reports.py
index 664fcf1..fbd792c 100644
--- a/wikimetrics/controllers/reports.py
+++ b/wikimetrics/controllers/reports.py
@@ -30,7 +30,7 @@
"""
if request.method == 'GET':
- return render_template('request.html')
+ return render_template('report.html')
else:
parsed = json.loads(request.form['responses'])
metric_reports = []
@@ -100,7 +100,7 @@
@app.route('/reports/status/<task_id>')
def report_status(task_id):
- celery_task = Report.task.AsyncResult(db_report.result_key)
+ celery_task = Report.task.AsyncResult(task_id)
return json_response(status=celery_task.status)
diff --git a/wikimetrics/static/js/reportCreate.js
b/wikimetrics/static/js/reportCreate.js
index 82d4b7c..8c502eb 100644
--- a/wikimetrics/static/js/reportCreate.js
+++ b/wikimetrics/static/js/reportCreate.js
@@ -106,11 +106,14 @@
return cohort.selected();
});
}, viewModel).extend({ throttle: 1 }),
+
metrics: ko.computed(function(){
return this.metrics().filter(function(metric){
return metric.selected();
});
}, viewModel).extend({ throttle: 1 }),
+
+ aggregators: ko.observable([]),
});
// second level computed pieces of the viewModel
diff --git a/wikimetrics/templates/csv_upload.html
b/wikimetrics/templates/csv_upload.html
index d9e7b02..f458c51 100644
--- a/wikimetrics/templates/csv_upload.html
+++ b/wikimetrics/templates/csv_upload.html
@@ -1,6 +1,6 @@
{% extends "layout.html" %}
{% block body %}
-{% include "csv_upload_form.html" %}
+{% include "forms/csv_upload.html" %}
<div>
<h6>File Format</h6>
<p>User Metrics expects a CSV file with the following format (the
username, project header row is not required)</p>
diff --git a/wikimetrics/templates/csv_upload_review.html
b/wikimetrics/templates/csv_upload_review.html
index baa91a0..71bb548 100644
--- a/wikimetrics/templates/csv_upload_review.html
+++ b/wikimetrics/templates/csv_upload_review.html
@@ -50,7 +50,7 @@
</tbody>
</table>
- {% include "csv_upload_form.html" %}
+ {% include "forms/csv_upload.html" %}
</div>
{% endif %}
{% if valid %}
diff --git a/wikimetrics/templates/csv_upload_form.html
b/wikimetrics/templates/forms/csv_upload.html
similarity index 100%
rename from wikimetrics/templates/csv_upload_form.html
rename to wikimetrics/templates/forms/csv_upload.html
diff --git a/wikimetrics/templates/form_for_metrics.html
b/wikimetrics/templates/forms/metric_configuration.html
similarity index 100%
rename from wikimetrics/templates/form_for_metrics.html
rename to wikimetrics/templates/forms/metric_configuration.html
diff --git a/wikimetrics/templates/forms/output_configuration.html
b/wikimetrics/templates/forms/output_configuration.html
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wikimetrics/templates/forms/output_configuration.html
diff --git a/wikimetrics/templates/request.html
b/wikimetrics/templates/report.html
similarity index 100%
rename from wikimetrics/templates/request.html
rename to wikimetrics/templates/report.html
--
To view, visit https://gerrit.wikimedia.org/r/76514
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I8664f0f1b8a3eadeb1f110c4be5209aef393807b
Gerrit-PatchSet: 1
Gerrit-Project: analytics/wikimetrics
Gerrit-Branch: master
Gerrit-Owner: Milimetric <[email protected]>
Gerrit-Reviewer: Milimetric <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits