Yuvipanda has uploaded a new change for review.
https://gerrit.wikimedia.org/r/153963
Change subject: [WIP] Let users star and unstar queries
......................................................................
[WIP] Let users star and unstar queries
Change-Id: If5e976522969e7d6d43569f108c212b76c43eff0
---
M quarry/web/app.py
A quarry/web/models/star.py
M quarry/web/static/css/query/view.css
M quarry/web/static/js/query/view.js
M quarry/web/templates/query/view.html
M tables.sql
6 files changed, 112 insertions(+), 4 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/analytics/quarry/web
refs/changes/63/153963/1
diff --git a/quarry/web/app.py b/quarry/web/app.py
index 64a371e..b20f108 100644
--- a/quarry/web/app.py
+++ b/quarry/web/app.py
@@ -4,6 +4,7 @@
from models.query import Query
from models.queryrevision import QueryRevision
from models.queryrun import QueryRun
+from models.star import Star
import json
import yaml
import time
@@ -114,6 +115,38 @@
)
[email protected]("/api/query/unstar", methods=["POST"])
+def unstar_query():
+ if g.user is None:
+ return "Unauthorized access", 403
+ query = g.session.query(Query).get(request.form['query_id'])
+ if query:
+ star = g.session.query(Star)\
+ .filter(Star.query_id == request.form['query_id'])\
+ .filter(Star.user_id == g.user.id)\
+ .one()
+ g.session.delete(star)
+ g.session.commit()
+ return ""
+ else:
+ return "Query not found", 404
+
+
[email protected]("/api/query/star", methods=["POST"])
+def star_query():
+ if g.user is None:
+ return "Unauthorized access", 403
+ query = g.session.query(Query).get(request.form['query_id'])
+ if query:
+ star = Star()
+ star.user = g.user
+ star.query = query
+ g.session.add(star)
+ g.session.commit()
+ return ""
+ else:
+ return "Query not found", 404
+
@app.route("/query/new")
def new_query():
if g.user is None:
@@ -136,9 +169,15 @@
def query_show(query_id):
query = g.session.query(Query).filter(Query.id == query_id).one()
can_edit = g.user is not None and g.user.id == query.user_id
+ is_starred = False
+ if g.user:
+ is_starred = g.session.query(func.count(Star.id))\
+ .filter(Star.user_id == g.user.id)\
+ .filter(Star.query_id == query_id).scalar() == 1
jsvars = {
'query_id': query.id,
- 'can_edit': can_edit
+ 'can_edit': can_edit,
+ 'is_starred': is_starred
}
if query.latest_rev and query.latest_rev.latest_run:
diff --git a/quarry/web/models/star.py b/quarry/web/models/star.py
new file mode 100644
index 0000000..21069c0
--- /dev/null
+++ b/quarry/web/models/star.py
@@ -0,0 +1,15 @@
+from sqlalchemy import Column, Integer, ForeignKey, Unicode, DateTime
+from sqlalchemy.orm import relationship
+from base import Base
+
+
+class Star(Base):
+ __tablename__ = 'star'
+
+ id = Column(Integer, primary_key=True)
+ user_id = Column(Integer, ForeignKey('user.id'))
+ timestamp = Column(DateTime)
+ query_id = Column(Integer, ForeignKey('query.id'))
+
+ query = relationship('Query', uselist=False)
+ user = relationship('User', uselist=False)
diff --git a/quarry/web/static/css/query/view.css
b/quarry/web/static/css/query/view.css
index 0f6c648..4ef0d85 100644
--- a/quarry/web/static/css/query/view.css
+++ b/quarry/web/static/css/query/view.css
@@ -2,6 +2,23 @@
margin-top: 20px;
}
+.starred .only-starred {
+ display: block;
+}
+
+.starred .only-non-starred {
+ display: none;
+}
+
+.only-starred {
+ display: none;
+}
+
+#title-actions-container button {
+ margin-top: 18px;
+ float: right;
+}
+
.CodeMirror {
font-family: Monaco, Consolas, "Ubuntu Mono", monospace;
height: auto;
diff --git a/quarry/web/static/js/query/view.js
b/quarry/web/static/js/query/view.js
index 0de44d1..7223f99 100644
--- a/quarry/web/static/js/query/view.js
+++ b/quarry/web/static/js/query/view.js
@@ -20,6 +20,22 @@
} );
}
+ $("#un-star-query").click( function() {
+ $.post( "/api/query/unstar", {
+ query_id: vars.query_id
+ }).done(function( data ) {
+ $('#content').removeClass('starred');
+ });
+ });
+
+ $("#star-query").click( function() {
+ $.post( "/api/query/star", {
+ query_id: vars.query_id
+ }).done(function( data ) {
+ $('#content').addClass('starred');
+ });
+ });
+
$('#run-code').click( function() {
$.post( "/api/query/run", {
text: editor.getValue(),
diff --git a/quarry/web/templates/query/view.html
b/quarry/web/templates/query/view.html
index b902d29..4331500 100644
--- a/quarry/web/templates/query/view.html
+++ b/quarry/web/templates/query/view.html
@@ -12,11 +12,23 @@
<script src="/static/js/query/view.js"> </script>
{% endblock %}
{% block content %}
-<div id="content" class="container {% if jsvars.can_edit %}edit{% else
%}no-edit{% endif %}">
+<div id="content" class="container {% if jsvars.can_edit %}edit{% else
%}no-edit{% endif %} {% if jsvars.is_starred %}starred{% endif %}">
<div class="row" id="title-container">
- <h2 id='title'>{{query.title}}</h2>
+ <div class="col-md-10">
+ <h2 id='title'>{{query.title}}</h2>
+ </div>
+ <div class="col-md-2" id="title-actions-container">
+ {% if user %}
+ <button id="un-star-query" type="button" class="btn btn-info
btn-sm only-starred">
+ <span class="glyphicon glyphicon-star"></span> Unstar
+ </button>
+ <button id="star-query" type="button" class="btn btn-info
btn-sm only-non-starred">
+ <span class="glyphicon glyphicon-star-empty"></span> Star
+ </button>
+ {% endif %}
+ </div>
</div>
- <div class="row">
+ <div>
<h3>SQL</h3>
<textarea id="code">{% if latest_rev %}{{ latest_rev.text
}}{%endif%}</textarea>
</div>
diff --git a/tables.sql b/tables.sql
index cccc846..e796094 100644
--- a/tables.sql
+++ b/tables.sql
@@ -35,3 +35,12 @@
task_id VARCHAR(36) BINARY
);
CREATE INDEX query_run_status_index ON query_run(status);
+
+CREATE TABLE star(
+ id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ user_id INT UNSIGNED NOT NULL,
+ query_id INT UNSIGNED NOT NULL,
+ timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+);
+CREATE INDEX star_user_id_index ON star(user_id);
+CREATE INDEX star_query_id_index ON star(query_id);
--
To view, visit https://gerrit.wikimedia.org/r/153963
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: If5e976522969e7d6d43569f108c212b76c43eff0
Gerrit-PatchSet: 1
Gerrit-Project: analytics/quarry/web
Gerrit-Branch: master
Gerrit-Owner: Yuvipanda <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits