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

Reply via email to