aboutsummaryrefslogtreecommitdiff
path: root/wqflask/wqflask/collect.py
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask/wqflask/collect.py')
-rwxr-xr-x[-rw-r--r--]wqflask/wqflask/collect.py241
1 files changed, 199 insertions, 42 deletions
diff --git a/wqflask/wqflask/collect.py b/wqflask/wqflask/collect.py
index 48b4b4da..a446a710 100644..100755
--- a/wqflask/wqflask/collect.py
+++ b/wqflask/wqflask/collect.py
@@ -36,6 +36,7 @@ from wqflask.database import db_session
from wqflask import model
from utility import Bunch, Struct
+from utility.formatting import numify
from wqflask import user_manager
@@ -43,56 +44,164 @@ from wqflask import user_manager
from base import trait
+def get_collection():
+ if g.user_session.logged_in:
+ return UserCollection()
+ else:
+ return AnonCollection()
+ #else:
+ # CauseError
+
+class AnonCollection(object):
+ """User is not logged in"""
+ def __init__(self):
+ self.anon_user = user_manager.AnonUser()
+ self.key = "anon_collection:v4:{}".format(self.anon_user.anon_id)
+
+ def add_traits(self, params, collection_name):
+ assert collection_name == "Default", "Unexpected collection name for anonymous user"
+ print("params[traits]:", params['traits'])
+ traits = process_traits(params['traits'])
+ print("traits is:", traits)
+ print("self.key is:", self.key)
+ len_before = len(Redis.smembers(self.key))
+ Redis.sadd(self.key, *list(traits))
+ Redis.expire(self.key, 60 * 60 * 24 * 3)
+ print("currently in redis:", Redis.smembers(self.key))
+ len_now = len(Redis.smembers(self.key))
+ report_change(len_before, len_now)
+
+ def remove_traits(self, params):
+ traits_to_remove = params.getlist('traits[]')
+ print("traits_to_remove:", traits_to_remove)
+ len_before = len(Redis.smembers(self.key))
+ Redis.srem(self.key, traits_to_remove)
+ len_now = len(Redis.smembers(self.key))
+ print("Went from {} to {} members in set.".format(len(self.collection_members), len(members_now)))
+
+ # 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))
+
+ def get_traits(self):
+ traits = Redis.smembers(self.key)
+ print("traits:", traits)
+ return traits
+
+class UserCollection(object):
+ """User is logged in"""
+
+ def add_traits(self, 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")
+ # Doesn't exist so we'll create it
+ if not uc:
+ return create_new("Default")
+ else:
+ uc = model.UserCollection.query.get(params['existing_collection'])
+ members = uc.members_as_set() #set(json.loads(uc.members))
+ len_before = len(members)
+
+ traits = process_traits(params['traits'])
+
+ members_now = list(members | traits)
+ len_now = len(members_now)
+ uc.members = json.dumps(members_now)
+
+ uc.changed_timestamp = datetime.datetime.utcnow()
+
+ db_session.commit()
+
+ print("added to existing, now set is:" + str(uc.members))
+ report_change(len_before, len_now)
+
+ # Probably have to change that
+ return redirect(url_for('view_collection', uc_id=uc.id))
+
+ def remove_traits(self, params):
+
+ #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))
+
+def report_change(len_before, len_now):
+ new_length = len_now - len_before
+ if new_length:
+ print("We've added {} to your collection.".format(
+ numify(new_length, 'new trait', 'new traits')))
+ flash("We've added {} to your collection.".format(
+ numify(new_length, 'new trait', 'new traits')))
+ else:
+ print("No new traits were added.")
+
+
@app.route("/collections/add")
def collections_add():
- user_collections = g.user_session.user_ob.user_collections
- print("user_collections are:", user_collections)
- return render_template("collections/add.html",
- traits=request.args['traits'],
- user_collections = user_collections,
- )
+ traits=request.args['traits']
+
+ if g.user_session.logged_in:
+ user_collections = g.user_session.user_ob.user_collections
+ print("user_collections are:", user_collections)
+ return render_template("collections/add.html",
+ traits=traits,
+ user_collections = user_collections,
+ )
+ else:
+ return render_template("collections/add_anonymous.html",
+ traits=traits
+ )
@app.route("/collections/new")
def collections_new():
- print("request.args in collections_new are:", request.args)
- if "create_new" in request.args:
- return create_new()
- elif "add_to_existing" in request.args:
- return add_to_existing()
- elif "continue" in request.args:
- return unnamed()
- else:
- CauseAnError
-
-
-def unnamed():
- return "unnamed"
-
-def add_to_existing():
params = request.args
- print("---> params are:", params.keys())
- print(" type(params):", type(params))
- uc = model.UserCollection.query.get(params['existing_collection'])
- members = set(json.loads(uc.members))
-
- traits = process_traits(params['traits'])
+ print("request.args in collections_new are:", params)
- uc.members = json.dumps(list(members | traits))
+ if "anonymous_add" in params:
+ AnonCollection().add_traits(params, "Default")
+ return redirect(url_for('view_collection'))
- uc.changed_timestamp = datetime.datetime.utcnow()
+ collection_name = params['new_collection']
- db_session.commit()
+ if "create_new" in params:
+ print("in create_new")
+ return create_new(collection_name)
+ elif "add_to_existing" in params:
+ print("in add to existing")
+ return UserCollection().add_traits(params, collection_name)
+ else:
+ print("ELSE")
+ CauseAnError
- return "added to existing, now set is:" + str(uc.members)
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:
+ print("trait is:", trait)
data, _separator, hmac = trait.rpartition(':')
data = data.strip()
print("data is:", data)
@@ -101,10 +210,10 @@ def process_traits(unprocessed_traits):
traits.add(str(data))
return traits
-def create_new():
+def create_new(collection_name):
params = request.args
uc = model.UserCollection()
- uc.name = params['new_collection']
+ uc.name = collection_name
print("user_session:", g.user_session.__dict__)
uc.user = g.user_session.user_id
unprocessed_traits = params['traits']
@@ -123,20 +232,66 @@ def create_new():
@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
print("params in view collection:", params)
- uc_id = params['uc_id']
- uc = model.UserCollection.query.get(uc_id)
- traits = json.loads(uc.members)
+
+ if "uc_id" in params:
+ uc_id = params['uc_id']
+ uc = model.UserCollection.query.get(uc_id)
+ traits = json.loads(uc.members)
+ print("traits are:", traits)
+ else:
+ traits = AnonCollection().get_traits()
print("in view_collection traits are:", traits)
@@ -144,12 +299,13 @@ def view_collection():
json_version = []
for atrait in traits:
+ print("atrait is:", atrait)
name, dataset_name = atrait.split(':')
trait_ob = trait.GeneralTrait(name=name, dataset_name=dataset_name)
trait_ob.get_info()
trait_obs.append(trait_ob)
-
+
json_version.append(trait_ob.jsonable())
#json_version.append(dict(name=trait_ob.name,
# description=trait_ob.description_display,
@@ -159,9 +315,10 @@ def view_collection():
# lrs_location=trait_ob.LRS_location_repr))
# dis=trait_ob.description))
#json_version.append(trait_ob.__dict__th)
-
- collection_info = dict(trait_obs=trait_obs,
- uc = uc)
+
+ #collection_info = dict(trait_obs=trait_obs,
+ # uc = uc)
+ collection_info = dict(trait_obs=trait_obs)
if "json" in params:
print("json_version:", json_version)
return json.dumps(json_version)