Milimetric has submitted this change and it was merged.
Change subject: moving report nodes in their own directory
......................................................................
moving report nodes in their own directory
Change-Id: If2ebcf6bc26d128b851d5361ea2f352e3528af3e
---
M wikimetrics/models/__init__.py
A wikimetrics/models/persistent_report.py
A wikimetrics/models/report_nodes/__init__.py
A wikimetrics/models/report_nodes/aggregate_report.py
R wikimetrics/models/report_nodes/concat_metrics_report.py
R wikimetrics/models/report_nodes/metric_report.py
R wikimetrics/models/report_nodes/multi_project_metric_report.py
R wikimetrics/models/report_nodes/report.py
R wikimetrics/models/report_nodes/run_report.py
M wikimetrics/static/js/site.js
10 files changed, 101 insertions(+), 73 deletions(-)
Approvals:
Milimetric: Verified; Looks good to me, approved
diff --git a/wikimetrics/models/__init__.py b/wikimetrics/models/__init__.py
index 0d0be3b..a3b2f35 100644
--- a/wikimetrics/models/__init__.py
+++ b/wikimetrics/models/__init__.py
@@ -1,12 +1,10 @@
from mediawiki import *
+from report_nodes import *
+
from cohort import *
from cohort_user import *
from cohort_wikiuser import *
-from concat_metrics_report import *
-from report import *
-from metric_report import *
-from run_report import *
-from multi_project_metric_report import *
+from persistent_report import *
from user import *
from wikiuser import *
diff --git a/wikimetrics/models/persistent_report.py
b/wikimetrics/models/persistent_report.py
new file mode 100644
index 0000000..769324a
--- /dev/null
+++ b/wikimetrics/models/persistent_report.py
@@ -0,0 +1,40 @@
+import celery
+from sqlalchemy import Column, Integer, String, DateTime, Boolean, func
+from sqlalchemy.orm import Session
+from wikimetrics.configurables import db, queue
+
+
+__all__ = ['PersistentReport']
+
+
+class PersistentReport(db.WikimetricsBase):
+ """
+ Stores each report node that runs in a report node tree to the database.
+ Stores the necessary information to fetch the results from Celery as
+ well as to re-run the node.
+ """
+ __tablename__ = 'report'
+
+ id = Column(Integer, primary_key=True)
+ created = Column(DateTime, default=func.now())
+ user_id = Column(Integer)
+ result_key = Column(String(50))
+ status = Column(String(50))
+ name = Column(String(2000))
+ show_in_ui = Column(Boolean)
+ parameters = Column(String(4000))
+
+ def update_status(self):
+ # if we don't have the result key leave as is (PENDING)
+ if self.result_key and self.status not in (celery.states.READY_STATES):
+ # TODO: fix nasty inline import. Can't import up above because of
circular reference
+ from wikimetrics.models.report_nodes import Report
+ celery_task = Report.task.AsyncResult(self.result_key)
+ self.status = celery_task.status
+ existing_session = Session.object_session(self)
+ if not existing_session:
+ existing_session = db.get_session()
+ existing_session.add(self)
+ existing_session.commit()
+ # if the result is still an AsyncResult, leave it as PENDING
+ #if isinstance(celery_task.result, AsyncResult):
diff --git a/wikimetrics/models/report_nodes/__init__.py
b/wikimetrics/models/report_nodes/__init__.py
new file mode 100644
index 0000000..779c573
--- /dev/null
+++ b/wikimetrics/models/report_nodes/__init__.py
@@ -0,0 +1,9 @@
+from aggregate_report import *
+from concat_metrics_report import *
+from metric_report import *
+from multi_project_metric_report import *
+from report import *
+from run_report import *
+
+# ignore flake8 because of F403 violation
+# flake8: noqa
diff --git a/wikimetrics/models/report_nodes/aggregate_report.py
b/wikimetrics/models/report_nodes/aggregate_report.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/wikimetrics/models/report_nodes/aggregate_report.py
diff --git a/wikimetrics/models/concat_metrics_report.py
b/wikimetrics/models/report_nodes/concat_metrics_report.py
similarity index 95%
rename from wikimetrics/models/concat_metrics_report.py
rename to wikimetrics/models/report_nodes/concat_metrics_report.py
index b461027..01fe064 100644
--- a/wikimetrics/models/concat_metrics_report.py
+++ b/wikimetrics/models/report_nodes/concat_metrics_report.py
@@ -1,11 +1,10 @@
-from wikimetrics.configurables import queue
import report
import pprint
+from wikimetrics.configurables import queue
from metric_report import MetricReport
-__all__ = [
- 'ConcatMetricsReport',
-]
+
+__all__ = ['ConcatMetricsReport']
class ConcatMetricsReport(report.ReportNode):
diff --git a/wikimetrics/models/metric_report.py
b/wikimetrics/models/report_nodes/metric_report.py
similarity index 82%
rename from wikimetrics/models/metric_report.py
rename to wikimetrics/models/report_nodes/metric_report.py
index daab240..aabe68b 100644
--- a/wikimetrics/models/metric_report.py
+++ b/wikimetrics/models/report_nodes/metric_report.py
@@ -1,12 +1,11 @@
-import report
-from ..configurables import db
-
-__all__ = [
- 'MetricReport',
-]
+from wikimetrics.configurables import db
+from report import ReportLeaf
-class MetricReport(report.ReportLeaf):
+__all__ = ['MetricReport']
+
+
+class MetricReport(ReportLeaf):
"""
Report type responsbile for running a single metric on a project-
homogenous list of user_ids. Like all reports, the database session
diff --git a/wikimetrics/models/multi_project_metric_report.py
b/wikimetrics/models/report_nodes/multi_project_metric_report.py
similarity index 90%
rename from wikimetrics/models/multi_project_metric_report.py
rename to wikimetrics/models/report_nodes/multi_project_metric_report.py
index 2a03a0e..db21c97 100644
--- a/wikimetrics/models/multi_project_metric_report.py
+++ b/wikimetrics/models/report_nodes/multi_project_metric_report.py
@@ -1,7 +1,7 @@
+import json
from wikimetrics.configurables import queue
from celery.utils.log import get_task_logger
-import report
-import json
+from report import ReportNode
from metric_report import MetricReport
@@ -10,9 +10,9 @@
task_logger = get_task_logger(__name__)
-class MultiProjectMetricReport(report.ReportNode):
+class MultiProjectMetricReport(ReportNode):
"""
- A report responsbile for running a single metric on a potentially
+ A node responsbile for running a single metric on a potentially
project-heterogenous cohort. This just abstracts away the task
of grouping the cohort by project and calling a MetricReport on
each project-homogenous list of user_ids.
diff --git a/wikimetrics/models/report.py
b/wikimetrics/models/report_nodes/report.py
similarity index 81%
rename from wikimetrics/models/report.py
rename to wikimetrics/models/report_nodes/report.py
index f2da94a..53fb307 100644
--- a/wikimetrics/models/report.py
+++ b/wikimetrics/models/report_nodes/report.py
@@ -1,20 +1,18 @@
-from sqlalchemy import Column, Integer, String, DateTime, Boolean, func
-from sqlalchemy.orm import Session
+import time
import celery
from celery import group, chord, current_task
from celery.result import AsyncResult
from celery.utils.log import get_task_logger
from celery.contrib.methods import task_method
from flask.ext.login import current_user
-import time
from wikimetrics.configurables import db, queue
+from ..persistent_report import PersistentReport
__all__ = [
'Report',
'ReportNode',
'ReportLeaf',
- 'PersistentReport'
]
@@ -35,32 +33,6 @@
task_logger = get_task_logger(__name__)
-
-
-class PersistentReport(db.WikimetricsBase):
- __tablename__ = 'report'
-
- id = Column(Integer, primary_key=True)
- created = Column(DateTime, default=func.now())
- user_id = Column(Integer)
- result_key = Column(String(50))
- status = Column(String(50))
- name = Column(String(2000))
- show_in_ui = Column(Boolean)
- parameters = Column(String(4000))
-
- def update_status(self):
- # if we don't have the result key leave as is (PENDING)
- if self.result_key and self.status not in (celery.states.READY_STATES):
- celery_task = Report.task.AsyncResult(self.result_key)
- self.status = celery_task.status
- existing_session = Session.object_session(self)
- if not existing_session:
- existing_session = db.get_session()
- existing_session.add(self)
- existing_session.commit()
- # if the result is still an AsyncResult, leave it as PENDING
- #if isinstance(celery_task.result, AsyncResult):
class Report(object):
@@ -89,7 +61,7 @@
self.result_key = result_key
self.children = children
- # create PersistentReport and store id
+ # store report to database
# note that result_key is always empty at this stage
pj = PersistentReport(user_id=self.user_id,
status=self.status,
diff --git a/wikimetrics/models/run_report.py
b/wikimetrics/models/report_nodes/run_report.py
similarity index 100%
rename from wikimetrics/models/run_report.py
rename to wikimetrics/models/report_nodes/run_report.py
diff --git a/wikimetrics/static/js/site.js b/wikimetrics/static/js/site.js
index 2a66170..9923cb8 100644
--- a/wikimetrics/static/js/site.js
+++ b/wikimetrics/static/js/site.js
@@ -15,6 +15,7 @@
site.redirect(response.redirectTo);
return false;
} else {
+ site.clearMessages();
return true;
}
},
@@ -32,7 +33,8 @@
site.showMessage(message, 'success');
},
showMessage: function (message, category){
- $('.site-messages').children().remove();
+ site.clearMessages();
+
if (!site.messageTemplate){
site.messageTemplate = $('.messageTemplate').html();
}
@@ -42,6 +44,9 @@
.replace('##punctuation##', category !== 'info' ? '!' : '');
$('.site-messages').append(html);
$('body').scrollTop(0);
+ },
+ clearMessages: function (){
+ $('.site-messages').children().remove();
},
redirect: function (url){
@@ -61,33 +66,39 @@
// Data population - usually done with something like Sammy JS
// ***********************************************************
populateCohorts: function(viewModel){
- $.get('/cohorts/list/', function(data){
- viewModel.cohorts(data.cohorts);
- }).fail(site.failure);
+ $.get('/cohorts/list/')
+ .done(site.handleWith(function(data){
+ viewModel.cohorts(data.cohorts);
+ }))
+ .fail(site.failure);
},
populateMetrics: function(viewModel){
- $.get('/metrics/list/', function(data){
- viewModel.metrics(data.metrics);
- }).fail(site.failure);
+ $.get('/metrics/list/')
+ .done(site.handleWith(function(data){
+ viewModel.metrics(data.metrics);
+ }))
+ .fail(site.failure);
},
populateReports: function(viewModel){
- $.get('/reports/list/', function(data){
- reports = viewModel.reports();
- reportsDict = {};
- for(j in reports){
- reportsDict[reports[j].id] = reports[j];
- }
- for(dj in data.reports){
- report = data.reports[dj];
- if (report.id in reportsDict && report.status ===
reportsDict[report.id].status){
- continue;
+ $.get('/reports/list/')
+ .done(site.handleWith(function(data){
+ reports = viewModel.reports();
+ reportsDict = {};
+ for(j in reports){
+ reportsDict[reports[j].id] = reports[j];
}
- // if there's a difference, just replace the whole thing
- viewModel.reports(data.reports);
- return;
- }
- }).fail(site.failure);
+ for(dj in data.reports){
+ report = data.reports[dj];
+ if (report.id in reportsDict && report.status ===
reportsDict[report.id].status){
+ continue;
+ }
+ // if there's a difference, just replace the whole thing
+ viewModel.reports(data.reports);
+ return;
+ }
+ }))
+ .fail(site.failure);
},
};
--
To view, visit https://gerrit.wikimedia.org/r/76559
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: If2ebcf6bc26d128b851d5361ea2f352e3528af3e
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