Erosen has uploaded a new change for review. https://gerrit.wikimedia.org/r/70549
Change subject: adds working version of CohortUser model ...................................................................... adds working version of CohortUser model Change-Id: I1496abb30fbee4e571e158c4f6d46d6e71204d91 --- A cohort_user.py M design/User Metrics Database Model.mwb M tests/fixtures.py M tests/test_models/test_mappings.py M wikimetrics/controllers/cohorts.py M wikimetrics/metrics/metric.py M wikimetrics/models/__init__.py A wikimetrics/models/cohort_user.py M wikimetrics/models/job.py 9 files changed, 131 insertions(+), 13 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/analytics/wikimetrics refs/changes/49/70549/1 diff --git a/cohort_user.py b/cohort_user.py new file mode 100644 index 0000000..4c90799 --- /dev/null +++ b/cohort_user.py @@ -0,0 +1,22 @@ +from sqlalchemy import Column, Integer, ForeignKey +from wikimetrics.configurables import db + +__all__ = [ + 'CohortWikiUser', +] + +class CohortWikiUser(db.WikimetricsBase): + """ + Represents the join table between `cohort` and `wiki_user` + tables. Uses sqlalchemy.declarative to handle db mapping + """ + + __tablename__ = 'cohort_wiki_user' + + id = Column(Integer, primary_key=True) + wiki_user_id = Column(Integer(50), ForeignKey('wiki_user.id')) + cohort_id = Column(Integer(50), ForeignKey('cohort.id')) + + def __repr__(self): + return '<CohortWikiUser("{0}")>'.format(self.id) + diff --git a/design/User Metrics Database Model.mwb b/design/User Metrics Database Model.mwb index 494d643..84db137 100644 --- a/design/User Metrics Database Model.mwb +++ b/design/User Metrics Database Model.mwb Binary files differ diff --git a/tests/fixtures.py b/tests/fixtures.py index ad94db4..7d80b61 100644 --- a/tests/fixtures.py +++ b/tests/fixtures.py @@ -25,7 +25,8 @@ self.session = db.get_session() job = Job() - user = User(username='Dan') + dan_user = User(username='Dan') + evan_user = User(username='Evan') # create a test cohort dan = WikiUser(mediawiki_username='Dan', mediawiki_userid=1, project='enwiki') @@ -33,13 +34,26 @@ andrew = WikiUser(mediawiki_username='Andrew', mediawiki_userid=3, project='enwiki') diederik = WikiUser(mediawiki_username='Diederik', mediawiki_userid=4, project='enwiki') + # create cohorts test_cohort = Cohort(name='test', enabled=True, public=True) private_cohort = Cohort(name='test_private', enabled=True, public=False) + private_cohort2 = Cohort(name='test_private2', enabled=True, public=False) disabled_cohort = Cohort(name='test_disabled', enabled=False, public=True) - self.session.add_all([job, user, dan, evan, andrew, diederik, - test_cohort, private_cohort, disabled_cohort]) + self.session.add_all([ + job, + dan_user, + evan_user, + dan, + evan, + andrew, + diederik, + test_cohort, + private_cohort, + private_cohort2, + disabled_cohort]) self.session.commit() + # create cohort membership dan_in_test = CohortWikiUser(wiki_user_id=dan.id, cohort_id=test_cohort.id) evan_in_test = CohortWikiUser(wiki_user_id=evan.id, cohort_id=test_cohort.id) andrew_in_test = CohortWikiUser(wiki_user_id=andrew.id, cohort_id=test_cohort.id) @@ -51,6 +65,25 @@ diederik_in_test ]) self.session.commit() + + + # create cohort ownership + dan_owns_test = CohortUser(user_id=dan_user.id, cohort_id=test_cohort.id, + role=CohortUserRole.OWNER) + evan_owns_private = CohortUser(user_id=evan_user.id, cohort_id=private_cohort.id, + role=CohortUserRole.OWNER) + evan_owns_private2 = CohortUser(user_id=evan_user.id, cohort_id=private_cohort2.id, + role=CohortUserRole.OWNER) + dan_views_private2 = CohortUser(user_id=evan_user.id, cohort_id=private_cohort2.id, + role=CohortUserRole.VIEWER) + self.session.add_all([ + dan_owns_test, + evan_owns_private, + evan_owns_private2, + dan_views_private2 + ]) + self.session.commit() + # add jobs job_created = Job(user_id=2, classpath='', status=JobStatus.CREATED, result_id=None) @@ -94,6 +127,7 @@ self.session = db.get_session() self.session.query(CohortWikiUser).delete() + self.session.query(CohortUser).delete() self.session.query(WikiUser).delete() self.session.query(Cohort).delete() self.session.query(User).delete() diff --git a/tests/test_models/test_mappings.py b/tests/test_models/test_mappings.py index 89cbb92..d2c4b99 100644 --- a/tests/test_models/test_mappings.py +++ b/tests/test_models/test_mappings.py @@ -19,36 +19,41 @@ def test_wikiuser(self): wu = self.session.query(WikiUser).get(1) - assert_true(wu.mediawiki_username == 'Dan') + assert_equals(wu.mediawiki_username, 'Dan') def test_cohort(self): c = self.session.query(Cohort).get(1) - assert_true(c.name == 'test') + 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) def test_cohort_wikiuser(self): cwu = self.session.query(CohortWikiUser).get(1) - assert_true(cwu.wiki_user_id == 1) - assert_true(cwu.cohort_id == 1) + assert_equals(cwu.wiki_user_id, 1) + assert_equals(cwu.cohort_id, 1) #*********** # Mapping tests for mediawiki tables #*********** def test_mediawiki_logging(self): row = self.mwSession.query(Logging).get(1) - assert_true(row.log_user_text == 'Reedy') + assert_equals(row.log_user_text, 'Reedy') def test_mediawiki_user(self): row = self.mwSession.query(MediawikiUser).get(2) - assert_true(row.user_name == 'Evan') + assert_equals(row.user_name, 'Evan') def test_mediawiki_page(self): row = self.mwSession.query(Page).get(1) - assert_true(row.page_title == 'Main_Page') + assert_equals(row.page_title, 'Main_Page') def test_mediawiki_revision(self): row = self.mwSession.query(Revision).get(1) - assert_true(row.rev_comment == 'Dan edit 1') + assert_equals(row.rev_comment, 'Dan edit 1') #*********** # Join tests @@ -61,3 +66,14 @@ .all() assert_true(len(user_ids) == 4, "Cohort 1 should have 4 wiki users in it") + + def test_cohort_ownership(self): + cohorts = self.session\ + .query(Cohort)\ + .join(CohortUser)\ + .join(User)\ + .filter(CohortUser.role == CohortUserRole.OWNER)\ + .filter(User.username == 'Evan')\ + .all() + print cohorts + assert_equal(len(cohorts), 2, "User Evan should own 2 cohorts") diff --git a/wikimetrics/controllers/cohorts.py b/wikimetrics/controllers/cohorts.py index 4e6b6a7..dcd0adb 100644 --- a/wikimetrics/controllers/cohorts.py +++ b/wikimetrics/controllers/cohorts.py @@ -23,3 +23,10 @@ cohorts = db_session.query(Cohort)\ .filter_by(enabled = True, public = True).all() return jsonify(cohorts = cohorts) + +@app.route('/cohorts/detail/<int:id>') +def cohort_detail(id): + db_session = db.get_session() + cohort = db_session.query(Cohort)\ + .filter_by(enabled = True, public = True).get(id) + return jsonify(cohort) diff --git a/wikimetrics/metrics/metric.py b/wikimetrics/metrics/metric.py index a8da71b..4ab4ba9 100644 --- a/wikimetrics/metrics/metric.py +++ b/wikimetrics/metrics/metric.py @@ -11,6 +11,12 @@ Child implementations should be callable and should take in users and return the metric computation results for each user. """ + + id = None # unique identifier for client-side use + label = None # this will be displayed as the title of the metric-specific + # tab in the request form + description = None # basic description of what the metric does + def __call__(self, user_ids, session): """ This is the __call__ signature any child implementations should follow. @@ -22,4 +28,6 @@ Returns: dictionary from user ids to the metric results. """ + + return {user: None for user in user_ids} diff --git a/wikimetrics/models/__init__.py b/wikimetrics/models/__init__.py index c960c96..5c2b146 100644 --- a/wikimetrics/models/__init__.py +++ b/wikimetrics/models/__init__.py @@ -1,5 +1,6 @@ from mediawiki import * from cohort import * +from cohort_user import * from cohort_wikiuser import * from concat_metrics_job import * from job import * diff --git a/wikimetrics/models/cohort_user.py b/wikimetrics/models/cohort_user.py new file mode 100644 index 0000000..14f3293 --- /dev/null +++ b/wikimetrics/models/cohort_user.py @@ -0,0 +1,30 @@ +from sqlalchemy import Column, Integer, ForeignKey, VARCHAR +from wikimetrics.configurables import db + +__all__ = [ + 'CohortUserRole', + 'CohortUser' +] + + +class CohortUserRole(object): + OWNER = 'OWNER' + VIEWER = 'VIEWER' + +class CohortUser(db.WikimetricsBase): + """ + Represents the join table between `cohort` and `user` + tables which stores cohort permissions. Uses + sqlalchemy.declarative to handle db mapping + """ + + __tablename__ = 'cohort_user' + + id = Column(Integer, primary_key=True) + user_id = Column(Integer(50), ForeignKey('user.id')) + cohort_id = Column(Integer(50), ForeignKey('cohort.id')) + role = Column(VARCHAR(45)) + + def __repr__(self): + return '<CohortUser("{0}")>'.format(self.id) + diff --git a/wikimetrics/models/job.py b/wikimetrics/models/job.py index 0269a6f..e1d76b7 100644 --- a/wikimetrics/models/job.py +++ b/wikimetrics/models/job.py @@ -28,8 +28,8 @@ class JobStatus(object): - CREATED = 'CREATED' - STARTED = 'STARTED' + CREATED = 'CREATED' + STARTED = 'STARTED' FINISHED = 'FINISHED' class Job(db.WikimetricsBase): -- To view, visit https://gerrit.wikimedia.org/r/70549 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I1496abb30fbee4e571e158c4f6d46d6e71204d91 Gerrit-PatchSet: 1 Gerrit-Project: analytics/wikimetrics Gerrit-Branch: master Gerrit-Owner: Erosen <ero...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits