aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam2013-12-31 08:52:23 +0000
committerSam2013-12-31 08:52:23 +0000
commita9f63aadeeedb7c28bbcd16396c8c6e7d5cbbfd0 (patch)
treeaca928b31c4f0d7b9efac51a76b427690089fd76
parent957ec58b605af421947335197ed09eddf72479a0 (diff)
downloadgenenetwork2-a9f63aadeeedb7c28bbcd16396c8c6e7d5cbbfd0.tar.gz
Finished code to remove a trait or multiple traits from a collection
Wrote code to make buttons a little cleaner and more obvious when dealing with collections (they now enable themselves when traits that can be added or removed to/from a collection are selected)
-rw-r--r--wqflask/wqflask/collect.py58
-rw-r--r--wqflask/wqflask/model.py6
-rw-r--r--wqflask/wqflask/static/new/javascript/search_results.coffee61
-rw-r--r--wqflask/wqflask/static/new/javascript/search_results.js76
-rw-r--r--wqflask/wqflask/templates/collections/add.html2
-rw-r--r--wqflask/wqflask/templates/collections/view.html12
6 files changed, 203 insertions, 12 deletions
diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py
index 2bf5b602..29b73130 100644
--- a/wqflask/wqflask/collect.py
+++ b/wqflask/wqflask/collect.py
@@ -67,8 +67,8 @@ def collections_new():
return create_new(collection_name)
elif "add_to_existing" in params:
return add_traits(params, collection_name)
- elif "default" in params:
- return add_traits(params, "default")
+ elif "Default" in params:
+ return add_traits(params, "Default")
else:
CauseAnError
@@ -78,14 +78,14 @@ def collections_new():
def add_traits(params, collection_name):
print("---> params are:", params.keys())
print(" type(params):", type(params))
- if collection_name=="default":
- uc = g.user_session.user_ob.get_collection_by_name("default")
+ if collection_name=="Default":
+ uc = g.user_session.user_ob.get_collection_by_name("Default")
# Doesn't exist so we'll create it
if not uc:
- return create_new("default")
+ return create_new("Default")
else:
uc = model.UserCollection.query.get(params['existing_collection'])
- members = set(json.loads(uc.members))
+ members = uc.members_as_set() #set(json.loads(uc.members))
len_before = len(members)
traits = process_traits(params['traits'])
@@ -111,7 +111,8 @@ def add_traits(params, collection_name):
def process_traits(unprocessed_traits):
print("unprocessed_traits are:", unprocessed_traits)
- unprocessed_traits = unprocessed_traits.split(",")
+ if isinstance(unprocessed_traits, basestring):
+ unprocessed_traits = unprocessed_traits.split(",")
traits = set()
for trait in unprocessed_traits:
data, _separator, hmac = trait.rpartition(':')
@@ -144,13 +145,54 @@ def create_new(collection_name):
@app.route("/collections/list")
def list_collections():
params = request.args
- user_collections = g.user_session.user_ob.user_collections
+ user_collections = list(g.user_session.user_ob.user_collections)
+ print("user_collections are:", user_collections)
return render_template("collections/list.html",
params = params,
user_collections = user_collections,
)
+@app.route("/collections/remove", methods=('POST',))
+def remove_traits():
+ params = request.form
+ print("params are:", params)
+ uc_id = params['uc_id']
+ uc = model.UserCollection.query.get(uc_id)
+ traits_to_remove = params.getlist('traits[]')
+ print("traits_to_remove are:", traits_to_remove)
+ traits_to_remove = process_traits(traits_to_remove)
+ print("\n\n after processing, traits_to_remove:", traits_to_remove)
+ all_traits = uc.members_as_set()
+ print(" all_traits:", all_traits)
+ members_now = all_traits - traits_to_remove
+ print(" members_now:", members_now)
+ print("Went from {} to {} members in set.".format(len(all_traits), len(members_now)))
+ uc.members = json.dumps(list(members_now))
+ uc.changed_timestamp = datetime.datetime.utcnow()
+ db_session.commit()
+
+ # We need to return something so we'll return this...maybe in the future
+ # we can use it to check the results
+ return str(len(members_now))
+
+
+
+@app.route("/collections/delete", methods=('POST',))
+def delete_collection():
+ params = request.form
+ uc_id = params['uc_id']
+ uc = model.UserCollection.query.get(uc_id)
+ # Todo: For now having the id is good enough since it's so unique
+ # But might want to check ownership in the future
+ collection_name = uc.name
+ db_session.delete(uc)
+ db_session.commit()
+ flash("We've deletet the collection: {}.".format(collection_name), "alert-info")
+
+ return redirect(url_for('list_collections'))
+
+
@app.route("/collections/view")
def view_collection():
params = request.args
diff --git a/wqflask/wqflask/model.py b/wqflask/wqflask/model.py
index 192aedd0..e588e78a 100644
--- a/wqflask/wqflask/model.py
+++ b/wqflask/wqflask/model.py
@@ -10,6 +10,8 @@ from flask.ext.sqlalchemy import SQLAlchemy
from wqflask import app
+import sqlalchemy
+
from sqlalchemy import (Column, Integer, String, Table, ForeignKey, Unicode, Boolean, DateTime,
Text, Index)
from sqlalchemy.orm import relationship, backref
@@ -153,3 +155,7 @@ class UserCollection(Base):
def num_members(self):
print("members are:", json.loads(self.members))
return len(json.loads(self.members))
+
+
+ def members_as_set(self):
+ return set(json.loads(self.members))
diff --git a/wqflask/wqflask/static/new/javascript/search_results.coffee b/wqflask/wqflask/static/new/javascript/search_results.coffee
index 34989a77..84cf7f0a 100644
--- a/wqflask/wqflask/static/new/javascript/search_results.coffee
+++ b/wqflask/wqflask/static/new/javascript/search_results.coffee
@@ -1,4 +1,8 @@
$ ->
+ # These are also used by collections view
+ # So the name search_results in the filename is misleading
+
+ checked_traits = null
select_all = ->
console.log("selected_all")
@@ -17,6 +21,59 @@ $ ->
console.log("checked is:", traits)
$.colorbox({href:"/collections/add?traits=#{traits}"})
+ removed_traits = ->
+ # After we've removed the traits from the database we get rid of them in the table
+ console.log('in removed_traits with checked_traits:', checked_traits)
+ checked_traits.closest("tr").fadeOut()
+
+
+ change_buttons = ->
+ buttons = ["#add", "#remove"]
+ num_checked = $('.trait_checkbox:checked').length
+ console.log("num_checked is:", num_checked)
+ if (num_checked == 0)
+ for button in buttons
+ $(button).prop("disabled", true)
+ else
+ for button in buttons
+ $(button).prop("disabled", false)
+
+
+ if (num_checked > 1)
+ console.log("in loop")
+ for item in buttons
+ console.log(" processing item:", item)
+ text = $(item).html()
+ if text.indexOf("Records") == -1
+ text = text.replace("Record", "Records")
+ $(item).html(text)
+ else
+ console.log("in loop")
+ for item in buttons
+ console.log(" processing item:", item)
+ text = $(item).html()
+ text = text.replace("Records", "Record")
+ $(item).html(text)
+
+
+ # remove is only used by collections view
+ remove = ->
+ checked_traits = $("#trait_table input:checked")
+ traits = checked_traits.map(->
+ return $(this).val()).get()
+ console.log("checked length is:", traits.length)
+ console.log("checked is:", traits)
+ uc_id = $("#uc_id").val()
+ console.log("uc.id is:", uc_id)
+ # Todo: Consider adding a failure message
+ $.ajax(
+ type: "POST"
+ url: "/collections/remove"
+ data:
+ uc_id: uc_id
+ traits: traits
+ success: removed_traits
+ )
@@ -24,3 +81,7 @@ $ ->
$("#deselect_all").click(deselect_all)
$("#invert").click(invert)
$("#add").click(add)
+ $("#remove").click(remove)
+
+ $('.trait_checkbox').click(change_buttons)
+ $('.btn').click(change_buttons)
diff --git a/wqflask/wqflask/static/new/javascript/search_results.js b/wqflask/wqflask/static/new/javascript/search_results.js
index 3efaca8b..477c9b94 100644
--- a/wqflask/wqflask/static/new/javascript/search_results.js
+++ b/wqflask/wqflask/static/new/javascript/search_results.js
@@ -2,7 +2,8 @@
(function() {
$(function() {
- var add, deselect_all, invert, select_all;
+ var add, change_buttons, checked_traits, deselect_all, invert, remove, removed_traits, select_all;
+ checked_traits = null;
select_all = function() {
console.log("selected_all");
return $(".trait_checkbox").prop('checked', true);
@@ -24,10 +25,81 @@
href: "/collections/add?traits=" + traits
});
};
+ removed_traits = function() {
+ console.log('in removed_traits with checked_traits:', checked_traits);
+ return checked_traits.closest("tr").fadeOut();
+ };
+ change_buttons = function() {
+ var button, buttons, item, num_checked, text, _i, _j, _k, _l, _len, _len1, _len2, _len3, _results, _results1;
+ buttons = ["#add", "#remove"];
+ num_checked = $('.trait_checkbox:checked').length;
+ console.log("num_checked is:", num_checked);
+ if (num_checked === 0) {
+ for (_i = 0, _len = buttons.length; _i < _len; _i++) {
+ button = buttons[_i];
+ $(button).prop("disabled", true);
+ }
+ } else {
+ for (_j = 0, _len1 = buttons.length; _j < _len1; _j++) {
+ button = buttons[_j];
+ $(button).prop("disabled", false);
+ }
+ }
+ if (num_checked > 1) {
+ console.log("in loop");
+ _results = [];
+ for (_k = 0, _len2 = buttons.length; _k < _len2; _k++) {
+ item = buttons[_k];
+ console.log(" processing item:", item);
+ text = $(item).html();
+ if (text.indexOf("Records") === -1) {
+ text = text.replace("Record", "Records");
+ _results.push($(item).html(text));
+ } else {
+ _results.push(void 0);
+ }
+ }
+ return _results;
+ } else {
+ console.log("in loop");
+ _results1 = [];
+ for (_l = 0, _len3 = buttons.length; _l < _len3; _l++) {
+ item = buttons[_l];
+ console.log(" processing item:", item);
+ text = $(item).html();
+ text = text.replace("Records", "Record");
+ _results1.push($(item).html(text));
+ }
+ return _results1;
+ }
+ };
+ remove = function() {
+ var traits, uc_id;
+ checked_traits = $("#trait_table input:checked");
+ traits = checked_traits.map(function() {
+ return $(this).val();
+ }).get();
+ console.log("checked length is:", traits.length);
+ console.log("checked is:", traits);
+ uc_id = $("#uc_id").val();
+ console.log("uc.id is:", uc_id);
+ return $.ajax({
+ type: "POST",
+ url: "/collections/remove",
+ data: {
+ uc_id: uc_id,
+ traits: traits
+ },
+ success: removed_traits
+ });
+ };
$("#select_all").click(select_all);
$("#deselect_all").click(deselect_all);
$("#invert").click(invert);
- return $("#add").click(add);
+ $("#add").click(add);
+ $("#remove").click(remove);
+ $('.trait_checkbox').click(change_buttons);
+ return $('.btn').click(change_buttons);
});
}).call(this);
diff --git a/wqflask/wqflask/templates/collections/add.html b/wqflask/wqflask/templates/collections/add.html
index c87203b1..faee4f78 100644
--- a/wqflask/wqflask/templates/collections/add.html
+++ b/wqflask/wqflask/templates/collections/add.html
@@ -10,7 +10,7 @@
<legend>Use your default collection</legend>
<span class="help-block">Choose this if you're in a hurry or don't plan on using the collection again.</span>
<span class="help-block"><em></em>If you are unsure this is probably the option you want.</em></span>
- <button type="submit" name="default" class="btn">Continue</button>
+ <button type="submit" name="Default" class="btn">Continue</button>
</fieldset>
<hr />
diff --git a/wqflask/wqflask/templates/collections/view.html b/wqflask/wqflask/templates/collections/view.html
index 79eeac26..7f588e84 100644
--- a/wqflask/wqflask/templates/collections/view.html
+++ b/wqflask/wqflask/templates/collections/view.html
@@ -9,8 +9,17 @@
<div class="page-header">
<h1>Your Collection</h1>
<h2>{{ uc.name }}</h2>
+
+ <form action="/collections/delete" method="post">
+ <input type="hidden" name="uc_id" id="uc_id" value="{{ uc.id }}" />
+ <input type="submit"
+ class="btn btn-small btn-danger"
+ value="Delete this collection" />
+ </form>
</div>
+
+
<div class="bs-docs-example">
<table class="table table-hover" id='trait_table'>
<thead>
@@ -58,7 +67,8 @@
<button class="btn" id="select_all"><i class="icon-ok"></i> Select All</button>
<button class="btn" id="deselect_all"><i class="icon-remove"></i> Deselect All</button>
<button class="btn" id="invert"><i class="icon-resize-vertical"></i> Invert</button>
- <button class="btn" id="add"><i class="icon-plus-sign"></i> Add</button>
+ <button class="btn" id="add" disabled="disabled"><i class="icon-plus-sign"></i> Add Record to Other Collection</button>
+ <button class="btn" id="remove" disabled="disabled"><i class="icon-minus-sign"></i> Remove Record</button>
<button class="btn btn-primary pull-right"><i class="icon-download icon-white"></i> Download Table</button>
</div>
</div>