Milimetric has submitted this change and it was merged.

Change subject: New changes on survior metric
......................................................................


New changes on survior metric

The survivor metric has changed during implementation.
This patchset will implement the new metric.

Card 701 on mingle is updated.

Implementation now matches card 701.

Added action for /demo/create/survivors/ , to create a scenario for
testing the survivor metric.

Removed pprint and cruft from code.

Fixed flake8 warnings/errors.

Changed survivor namespace to 0 to cope with default demo controller.

Change-Id: I25e2d0604b2bd2e18ae9510459af0ca96c316e9b
---
M README.md
M scripts/00_create_wikimetrics_db
M scripts/debug.py
M tests/fixtures.py
M tests/test_metrics/test_survivors.py
M wikimetrics/config/db_config.yaml
M wikimetrics/controllers/demo.py
M wikimetrics/metrics/form_fields.py
M wikimetrics/metrics/survivors.py
M wikimetrics/models/mediawiki/custom_columns.py
M wikimetrics/models/report_nodes/aggregate_report.py
11 files changed, 258 insertions(+), 195 deletions(-)

Approvals:
  Milimetric: Verified; Looks good to me, approved



diff --git a/README.md b/README.md
index 7fe7125..b9542ce 100644
--- a/README.md
+++ b/README.md
@@ -186,3 +186,4 @@
     def obvious_method(self):
         # no doc string comment on this function because it's obvious
 ````
+
diff --git a/scripts/00_create_wikimetrics_db b/scripts/00_create_wikimetrics_db
index bb1f418..b41202e 100644
--- a/scripts/00_create_wikimetrics_db
+++ b/scripts/00_create_wikimetrics_db
@@ -1,3 +1,3 @@
 create database wikimetrics;
-create user wikimetrics identified by PASSWORD('');
+create user wikimetrics IDENTIFIED BY 'wikimetrics' ;
 grant ALL on wikimetrics.* TO wikimetrics@'localhost';
diff --git a/scripts/debug.py b/scripts/debug.py
index 5eb222c..25a1aab 100755
--- a/scripts/debug.py
+++ b/scripts/debug.py
@@ -15,6 +15,7 @@
 from wikimetrics.metrics import Survivors
 from wikimetrics.configurables import db
 from pprint import pprint
+import calendar
 
 # Mediawiki database
 d = db.get_mw_session("enwiki")
diff --git a/tests/fixtures.py b/tests/fixtures.py
index 22a8767..43fc5b1 100644
--- a/tests/fixtures.py
+++ b/tests/fixtures.py
@@ -2,6 +2,8 @@
 import celery
 import sys
 from datetime import datetime
+from wikimetrics.utils import parse_date, \
+    format_date, parse_pretty_date, format_pretty_date
 from nose.tools import nottest
 
 __all__ = [
@@ -632,59 +634,144 @@
         self.createTestDataMetricPagesCreated()
 
 
-class DatabaseWithSurvivorCohortTest(DatabaseWithCohortTest):
+class DatabaseWithSurvivorCohortTest(unittest.TestCase):
+
+    def __init__(self):
+        self.survivors_namespace = 0
+
+    def acquireDBHandles(self):
+        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)
+
+    def clearWikimetrics(self):
+        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()
+        self.session.query(PersistentReport).delete()
+        self.session.commit()
+        self.session.close()
+
+    def clearMediawiki(self):
+        self.mwSession.query(Logging).delete()
+        self.mwSession.query(Revision).delete()
+        self.mwSession.query(MediawikiUser).delete()
+        self.mwSession.query(Page).delete()
+        self.mwSession.commit()
+        self.mwSession.close()
+
+    def createUsers(self):
+        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')
+        self.mwSession.add_all([mw_user_dan, mw_user_evan,
+                               mw_user_andrew, mw_user_diederik])
+        self.mwSession.commit()
+
+        wu_dan = WikiUser(mediawiki_username='Dan',
+                          mediawiki_userid=mw_user_dan.user_id, 
project='enwiki')
+        wu_evan = WikiUser(mediawiki_username='Evan',
+                           mediawiki_userid=mw_user_evan.user_id, 
project='enwiki')
+        wu_andrew = WikiUser(mediawiki_username='Andrew',
+                             mediawiki_userid=mw_user_andrew.user_id, 
project='enwiki')
+        wu_diederik = WikiUser(mediawiki_username='Diederik',
+                               mediawiki_userid=mw_user_diederik.user_id,
+                               project='enwiki')
+        self.session.add_all([wu_dan, wu_evan, wu_andrew, wu_diederik])
+        self.session.commit()
+
+        self.dan_id = wu_dan.id
+        self.evan_id = wu_evan.id
+        self.andrew_id = wu_andrew.id
+        self.diederik_id = wu_diederik.id
+
+        self.mw_dan_id = mw_user_dan.user_id
+        self.mw_evan_id = mw_user_evan.user_id
+        self.mw_andrew_id = mw_user_andrew.user_id
+        self.mw_diederik_id = mw_user_diederik.user_id
+
+    def createCohort(self):
+        self.cohort = Cohort(name='demo-survivor-cohort', enabled=True, 
public=True)
+        self.session.add(self.cohort)
+        self.session.commit()
+
+        ids = [self.dan_id, self.evan_id, self.andrew_id, self.diederik_id]
+        for wiki_editor_id in ids:
+            print "adding we_id=", wiki_editor_id, " to cohort=", 
self.cohort.id
+            cohort_wiki_editor = CohortWikiUser(
+                cohort_id=self.cohort.id,
+                wiki_user_id=wiki_editor_id,
+            )
+            self.session.add(cohort_wiki_editor)
+            self.session.commit()
 
     # update dan,evan,andrew,diederik user_registration timestamp
     def updateSurvivorRegistrationData(self):
-        registration_date_dan    = datetime.strptime("2013-01-01", "%Y-%m-%d")
-        registration_date_evan   = datetime.strptime("2013-01-02", "%Y-%m-%d")
-        registration_date_andrew = datetime.strptime("2013-01-03", "%Y-%m-%d")
-        self.mwSession.query(MediawikiUser.user_id == self.dan_id) \
+        registration_date_dan    = format_date(datetime(2013, 1, 1))
+        registration_date_evan   = format_date(datetime(2013, 1, 2))
+        registration_date_andrew = format_date(datetime(2013, 1, 3))
+
+        self.mwSession.query(MediawikiUser) \
+            .filter(MediawikiUser.user_id == self.mw_dan_id) \
             .update({"user_registration": registration_date_dan})
-        self.mwSession.query(MediawikiUser.user_id == self.evan_id) \
+
+        self.mwSession.query(MediawikiUser) \
+            .filter(MediawikiUser.user_id == self.mw_evan_id) \
             .update({"user_registration": registration_date_evan})
-        self.mwSession.query(MediawikiUser.user_id == self.andrew_id) \
+
+        self.mwSession.query(MediawikiUser) \
+            .filter(MediawikiUser.user_id == self.mw_andrew_id) \
             .update({"user_registration": registration_date_andrew})
 
     def createPageForSurvivors(self):
-        self.page = Page(page_namespace=304, page_title='SurvivorTestPage')
+        self.page = Page(page_namespace=self.survivors_namespace,
+                         page_title='SurvivorTestPage')
         self.mwSession.add_all([self.page])
         self.mwSession.commit()
 
     def createRevisionsForSurvivors(self):
 
-        new_revisions = []
-
         # create a revision for user with id uid at time t
         def createCustomRevision(uid, t):
+            print "page_id = ", self.page.page_id, "\n"
             r = Revision(
                 rev_page=self.page.page_id,
                 rev_user=uid,
                 rev_comment='Survivor Revision',
                 rev_parent_id=111,
                 rev_len=100,
-                rev_timestamp=t
+                rev_timestamp=format_date(t)
             )
-            new_revisions.append(r)
+            self.mwSession.add(r)
+            self.mwSession.commit()
 
-        createCustomRevision(self.dan_id, datetime(2013, 1, 1))
-        createCustomRevision(self.dan_id, datetime(2013, 1, 2))
-        createCustomRevision(self.dan_id, datetime(2013, 1, 3))
+        createCustomRevision(self.mw_dan_id, datetime(2013, 1, 1))
+        createCustomRevision(self.mw_dan_id, datetime(2013, 1, 2))
+        createCustomRevision(self.mw_dan_id, datetime(2013, 1, 3))
 
-        createCustomRevision(self.evan_id, datetime(2013, 1, 2))
-        createCustomRevision(self.evan_id, datetime(2013, 1, 3))
-        createCustomRevision(self.evan_id, datetime(2013, 1, 4))
+        createCustomRevision(self.mw_evan_id, datetime(2013, 1, 2))
+        createCustomRevision(self.mw_evan_id, datetime(2013, 1, 3))
+        createCustomRevision(self.mw_evan_id, datetime(2013, 1, 4))
 
-        createCustomRevision(self.andrew_id, datetime(2013, 1, 3))
-        createCustomRevision(self.andrew_id, datetime(2013, 1, 4))
-        createCustomRevision(self.andrew_id, datetime(2013, 1, 5))
-        createCustomRevision(self.andrew_id, datetime(2013, 1, 6))
-
-        self.mwSession.add_all(new_revisions)
-        self.mwSession.commit()
+        createCustomRevision(self.mw_andrew_id, datetime(2013, 1, 3))
+        createCustomRevision(self.mw_andrew_id, datetime(2013, 1, 4))
+        createCustomRevision(self.mw_andrew_id, datetime(2013, 1, 5))
+        createCustomRevision(self.mw_andrew_id, datetime(2013, 1, 6))
 
     def setUp(self):
-        DatabaseWithCohortTest.setUp(self)
+        self.acquireDBHandles()
+        self.clearWikimetrics()
+        self.clearMediawiki()
+        self.createUsers()
+        self.createCohort()
         self.updateSurvivorRegistrationData()
         self.createPageForSurvivors()
         self.createRevisionsForSurvivors()
+
+    def runTest(self):
+        pass
diff --git a/tests/test_metrics/test_survivors.py 
b/tests/test_metrics/test_survivors.py
index ab5b1ac..156453e 100644
--- a/tests/test_metrics/test_survivors.py
+++ b/tests/test_metrics/test_survivors.py
@@ -6,83 +6,70 @@
 from wikimetrics.metrics import Survivors
 from wikimetrics.models import Cohort, MetricReport, WikiUser, CohortWikiUser
 from pprint import pprint
+from datetime import datetime
 import sys
 
 
 class SurvivorsTest(DatabaseWithSurvivorCohortTest):
 
-    def test_convert_dates_to_timestamps(self):
+    def test_case1_24h_count1(self):
         m = Survivors(
-            namespaces=[304],
-            start_date=1375660800
-        )
-
-        try:
-            m.convert_dates_to_timestamps()
-        except Exception as e:
-            assert_equal(1, 1, "Exception thrown")
-            assert_equal(str(e), "Problems with start_date")
-
-        m = Survivors(
-            namespaces=[304],
-            end_date=1375660800
-        )
-
-        try:
-            m.convert_dates_to_timestamps()
-        except Exception as e:
-            assert_equal(str(e), "Problems with end_date")
-
-    # registration YES ; survival_days YES ;
-    def test_case_RS(self):
-        m = Survivors(
-            namespaces=[304],
-            survival_days=4,
-            use_registration_date=True,
-        )
-        results = m(list(self.cohort), self.mwSession)
-
-        #pprint(results,sys.stderr)
-        assert_equal(results[self.dan_id]["survivors"], False)
-        assert_equal(results[self.evan_id]["survivors"], False)
-        assert_equal(results[self.andrew_id]["survivors"], True)
-
-    # registration NO ; survival_days YES ;
-    def test_case_rS(self):
-        m = Survivors(
-            namespaces=[304],
-            start_date='2013-01-03',
-            survival_days='2'
+            namespaces=[self.survivors_namespace],
+            survival_hours=1 * 24
         )
         results = m(list(self.cohort), self.mwSession)
 
         pprint(results, sys.stderr)
-        assert_equal(results[self.dan_id]["survivors"], False)
-        assert_equal(results[self.evan_id]["survivors"], True)
-        assert_equal(results[self.andrew_id]["survivors"], True)
+        assert_equal(results[self.mw_dan_id]["survivors"], True)
+        assert_equal(results[self.mw_evan_id]["survivors"], True)
+        assert_equal(results[self.mw_andrew_id]["survivors"] , True)
 
-    # registration YES ; survival_days NO ;
-    def test_case_Rs(self):
+    def test_case1_72h_count1(self):
         m = Survivors(
-            namespaces=[304],
-            use_registration_date=True,
-            end_date='2013-01-06',
+            namespaces=[self.survivors_namespace],
+            survival_hours=3 * 24
         )
         results = m(list(self.cohort), self.mwSession)
 
-        assert_equal(results[self.dan_id]["survivors"], False)
-        assert_equal(results[self.evan_id]["survivors"], False)
-        assert_equal(results[self.andrew_id]["survivors"], True)
+        pprint(results, sys.stderr)
+        assert_equal(results[self.mw_dan_id]["survivors"], False)
+        assert_equal(results[self.mw_evan_id]["survivors"], False)
+        assert_equal(results[self.mw_andrew_id]["survivors"] , True)
 
-    # registration NO  ; survival_days NO ;
-    def test_case_rs(self):
+    def test_case1_24h_count3(self):
         m = Survivors(
-            namespaces=[304],
-            start_date='2013-01-01',
-            end_date='2013-01-04',
+            namespaces=[self.survivors_namespace],
+            survival_hours=1 * 24,
+            number_of_edits=3
         )
         results = m(list(self.cohort), self.mwSession)
 
-        assert_equal(results[self.dan_id]["survivors"], False)
-        assert_equal(results[self.evan_id]["survivors"], True)
-        assert_equal(results[self.andrew_id]["survivors"], True)
+        pprint(results, sys.stderr)
+        assert_equal(results[self.mw_dan_id]["survivors"], False)
+        assert_equal(results[self.mw_evan_id]["survivors"], False)
+        assert_equal(results[self.mw_andrew_id]["survivors"] , True)
+
+    def test_case2_24h_count3_sunset72h(self):
+        m = Survivors(
+            namespaces=[self.survivors_namespace],
+            survival_hours=1 * 24,
+            number_of_edits=3,
+            sunset=3 * 24
+        )
+        results = m(list(self.cohort), self.mwSession)
+
+        pprint(results, sys.stderr)
+        assert_equal(results[self.mw_dan_id]["survivors"], False)
+        assert_equal(results[self.mw_evan_id]["survivors"], False)
+        assert_equal(results[self.mw_andrew_id]["survivors"] , True)
+
+    def test_edgecase(self):
+        m = Survivors(
+            namespaces=[self.survivors_namespace],
+        )
+        results = m(list(self.cohort), self.mwSession)
+
+        pprint(results, sys.stderr)
+        assert_equal(results[self.mw_dan_id]["survivors"], True)
+        assert_equal(results[self.mw_evan_id]["survivors"], True)
+        assert_equal(results[self.mw_andrew_id]["survivors"] , True)
diff --git a/wikimetrics/config/db_config.yaml 
b/wikimetrics/config/db_config.yaml
index 4a22149..2be115e 100644
--- a/wikimetrics/config/db_config.yaml
+++ b/wikimetrics/config/db_config.yaml
@@ -1,4 +1,4 @@
-SQL_ECHO                        : False
+SQL_ECHO                        : True
 #WIKIMETRICS_ENGINE_URL          : 'sqlite:///test.db'
 #MEDIAWIKI_ENGINE_URL_TEMPLATE   : 'sqlite:///{0}.db'
 # For testing with mysql locally (useful for manual connection survival tests)
diff --git a/wikimetrics/controllers/demo.py b/wikimetrics/controllers/demo.py
index 99f6a77..1ebf24e 100644
--- a/wikimetrics/controllers/demo.py
+++ b/wikimetrics/controllers/demo.py
@@ -1,6 +1,9 @@
 from flask import render_template, redirect, request, jsonify
 from flask.ext.login import current_user
 from ..configurables import app, db
+
+from tests.fixtures import DatabaseWithSurvivorCohortTest
+
 from ..models import (
     WikiUser,
     User,
@@ -246,3 +249,31 @@
         return 'OK, wiped out the database and added cohorts only for 
{0}'.format(
             current_user.email
         )
+
+    @app.route('/demo/create/survivors/')
+    def demo_add_survivors():
+        session = db.get_session()
+        user = session.query(User).filter_by(email=current_user.email).one()
+
+        delete_my_cohorts(session)
+
+        st = DatabaseWithSurvivorCohortTest()
+        st.session = session
+        st.mwSession = db.get_mw_session("enwiki")
+
+        st.clearMediawiki()
+        st.createUsers()
+        st.createCohort()
+        st.updateSurvivorRegistrationData()
+        st.createPageForSurvivors()
+        st.createRevisionsForSurvivors()
+
+        current_user_owns_demo = CohortUser(
+            user_id=user.id,
+            cohort_id=st.cohort.id,
+            role=CohortUserRole.OWNER,
+        )
+        session.add(current_user_owns_demo)
+        session.commit()
+
+        return "Modified"
diff --git a/wikimetrics/metrics/form_fields.py 
b/wikimetrics/metrics/form_fields.py
index ef4f94b..fc14080 100644
--- a/wikimetrics/metrics/form_fields.py
+++ b/wikimetrics/metrics/form_fields.py
@@ -74,7 +74,7 @@
             return datetime.strptime(value, self.format)
         except ValueError:
             self.report_invalid()
-    
+
     def process_data(self, value):
         self.data = self.parse_datetime(value)
     
diff --git a/wikimetrics/metrics/survivors.py b/wikimetrics/metrics/survivors.py
index d290e81..236e2ec 100644
--- a/wikimetrics/metrics/survivors.py
+++ b/wikimetrics/metrics/survivors.py
@@ -1,8 +1,9 @@
 from ..utils import thirty_days_ago, today
-from sqlalchemy import func
+from sqlalchemy import func, case
 from metric import Metric
 from form_fields import CommaSeparatedIntegerListField, BetterDateTimeField
 from wtforms.validators import Required
+from sqlalchemy.sql.expression import label, between, and_
 from wtforms import BooleanField, IntegerField
 from wikimetrics.models import Page, Revision, MediawikiUser
 import datetime
@@ -31,10 +32,9 @@
          editor in a time interval'
     )
     
-    start_date            = BetterDateTimeField(default=thirty_days_ago)
-    end_date              = BetterDateTimeField(default=today)
-    survival_days         = IntegerField(default=0)
-    use_registration_date = BooleanField(default=False)
+    number_of_edits       = IntegerField(default=1)
+    survival_hours        = IntegerField(default=0)
+    sunset                = IntegerField(default=0)
     
     namespaces = CommaSeparatedIntegerListField(
         None,
@@ -43,28 +43,18 @@
         description='0, 2, 4, etc.',
     )
 
-    def convert_dates_to_timestamps(self):
-        
-        start_date = None
-        end_date = None
-
-        if type(self.start_date.data) == str:
-            start_date = calendar.timegm(
-                datetime.datetime.strptime(self.start_date.data, 
"%Y-%m-%d").timetuple())
-        elif type(self.start_date.data) == datetime.date:
-            start_date = calendar.timegm(self.start_date.data.timetuple())
-        else:
-            raise Exception("Problems with start_date")
-
-        if type(self.end_date.data) == str:
-            end_date = calendar.timegm(
-                datetime.datetime.strptime(self.end_date.data, 
"%Y-%m-%d").timetuple())
-        elif type(self.end_date.data) == datetime.date:
-            end_date = calendar.timegm(self.end_date.data.timetuple())
-        else:
-            raise Exception("Problems with end_date")
-
-        return start_date, end_date
+    def debug_print(self, q, session, user_ids):
+        r = dict(q.all())
+        s = ""
+        for uid in user_ids:
+            if uid:
+                user_name = session \
+                    .query(MediawikiUser.user_name) \
+                    .filter(MediawikiUser.user_id == uid) \
+                    .first()[0]
+                val_survivor = r[uid] if uid in r else 0
+                s += user_name + " (" + str(uid) + ") ===> " + 
str(val_survivor) + "\n"
+        print s
 
     def __call__(self, user_ids, session):
         """
@@ -76,86 +66,51 @@
             dictionary from user ids to the number of edit found.
         """
 
-        use_registration_date = self.use_registration_date.data
-        survival_days = int(self.survival_days.data)
+        survival_hours = int(self.survival_hours.data)
+        sunset = int(self.sunset.data)
+        number_of_edits = int(self.number_of_edits.data)
 
-        start_date, end_date = self.convert_dates_to_timestamps()
+        partial_query = session \
+            .query(Revision.rev_user, label("rev_count", 
func.count(Revision.rev_id))) \
+            .join(MediawikiUser) \
+            .join(Page) \
+            .filter(Page.page_namespace.in_(self.namespaces.data)) \
+            .filter(Revision.rev_user.in_(user_ids))
 
-        #print "use_registration_date=", use_registration_date
-
-        #start_date = self.start_date
-        #end_date = self.end_date
-
-        #if session.bind.name == 'mysql':
-
-        one_day_seconds = 3600 * 12
-
-        survivors_by_namespace = None
-
-        if use_registration_date:
-            if survival_days > 0:
-                print "\n\n[DBG] Case 1\n\n"
-                # survival_days YES ; registration YES
-
-                q = session \
-                    .query(Revision.rev_user) \
-                    .join(MediawikiUser) \
-                    .join(Page) \
-                    .filter(Page.page_namespace.in_(self.namespaces.data)) \
-                    .filter(func.strftime("%s", Revision.rev_timestamp) -
-                            func.strftime("%s", 
MediawikiUser.user_registration) >=
-                            survival_days * one_day_seconds) \
-                    .group_by(Revision.rev_user)
-
-                survivors_by_namespace = [x[0] for x in q.all()]
-            else:
-                # survival_days NO ; registration YES
-                #print "\n\n[DBG] Case 2\n\n"
-                #print "end_date=", end_date
-                q = session \
-                    .query(Revision.rev_user) \
-                    .join(MediawikiUser) \
-                    .join(Page) \
-                    .filter(Page.page_namespace.in_(self.namespaces.data)) \
-                    .filter(func.strftime("%s", Revision.rev_timestamp) - 
end_date >= 0) \
-                    .group_by(Revision.rev_user)
-
-                survivors_by_namespace = [x[0] for x in q.all()]
+       # sunset is zero, so we use the first case [T+t,today]
+        if sunset == 0:
+            q = partial_query.filter(
+                between(
+                    func.unix_timestamp(Revision.rev_timestamp)
+                    ,
+                    func.unix_timestamp(MediawikiUser.user_registration) +
+                    (survival_hours * 3600)
+                    ,
+                    func.unix_timestamp(func.now()) + 86400
+                )
+            )
+      # otherwise use the sunset [T+t,T+t+s]
         else:
-            if survival_days:
-                print "\n\n[DBG] Case 3\n\n"
-                # survival_days YES ; registration NO
-                q = session \
-                    .query(Revision.rev_user) \
-                    .join(MediawikiUser) \
-                    .join(Page) \
-                    .filter(Page.page_namespace.in_(self.namespaces.data)) \
-                    .filter(func.strftime("%s", Revision.rev_timestamp) - 
start_date >=
-                            (survival_days * one_day_seconds)) \
-                    .group_by(Revision.rev_user)
+            q = partial_query.filter(
+                between(
+                    func.unix_timestamp(Revision.rev_timestamp)
+                    ,
+                    func.unix_timestamp(MediawikiUser.user_registration) +
+                    (survival_hours * 3600)
+                    ,
+                    func.unix_timestamp(MediawikiUser.user_registration) +
+                    ((survival_hours + sunset) * 3600))
+            )
+        q = q.group_by(Revision.rev_user) \
+             .subquery()
+        
+        f = session.query(q.c.rev_user,
+                          case([(q.c.rev_count >= number_of_edits, 1)], 
else_=0))
 
-                survivors_by_namespace = [x[0] for x in q.all()]
+        #self.debug_print(f, session, user_ids)
 
-            else:
-                print "\n\n[DBG] Case 4\n\n"
-                # survival_days NO ; registration NO
-                q = session \
-                    .query(Revision.rev_user, "1") \
-                    .join(MediawikiUser) \
-                    .join(Page) \
-                    .filter(Page.page_namespace.in_(self.namespaces.data)) \
-                    .filter(func.strftime("%s", Revision.rev_timestamp) - 
end_date >= 0) \
-                    .group_by(Revision.rev_user)
-
-                survivors_by_namespace = [x[0] for x in q.all()]
-
-        retval = {}
-
-        pprint(survivors_by_namespace)
-        for user_id in user_ids:
-            if user_id in survivors_by_namespace:
-                retval[user_id] = {'survivors' : True}
-            else:
-                retval[user_id] = {'survivors' : False}
-
-        return retval
+        survivors = dict(f.all())
+        return {
+            user_id: {'survivors': survivors.get(user_id, 0)}
+            for user_id in user_ids
+        }
diff --git a/wikimetrics/models/mediawiki/custom_columns.py 
b/wikimetrics/models/mediawiki/custom_columns.py
index fee34da..2ef5970 100644
--- a/wikimetrics/models/mediawiki/custom_columns.py
+++ b/wikimetrics/models/mediawiki/custom_columns.py
@@ -1,4 +1,4 @@
-from sqlalchemy import TypeDecorator, Unicode
+from sqlalchemy import TypeDecorator, Unicode, Interval
 from datetime import datetime
 from wikimetrics.utils import parse_date, format_date
 
diff --git a/wikimetrics/models/report_nodes/aggregate_report.py 
b/wikimetrics/models/report_nodes/aggregate_report.py
index b7514cf..d2e8019 100644
--- a/wikimetrics/models/report_nodes/aggregate_report.py
+++ b/wikimetrics/models/report_nodes/aggregate_report.py
@@ -64,6 +64,7 @@
     
     def finish(self, result_dicts):
         aggregated_results = dict()
+        task_logger.info(str(result_dicts))
         result_values = [r.values() for r in result_dicts]
         child_results = [result for sublist in result_values for result in 
sublist]
         

-- 
To view, visit https://gerrit.wikimedia.org/r/84756
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I25e2d0604b2bd2e18ae9510459af0ca96c316e9b
Gerrit-PatchSet: 8
Gerrit-Project: analytics/wikimetrics
Gerrit-Branch: master
Gerrit-Owner: Stefan.petrea <ste...@garage-coding.com>
Gerrit-Reviewer: Milimetric <dandree...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to