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

Reply via email to