about summary refs log tree commit diff
path: root/wqflask/utility
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask/utility')
-rw-r--r--wqflask/utility/hmac.py2
-rw-r--r--wqflask/utility/redis_tools.py142
-rw-r--r--wqflask/utility/startup_config.py4
-rw-r--r--wqflask/utility/tools.py13
4 files changed, 150 insertions, 11 deletions
diff --git a/wqflask/utility/hmac.py b/wqflask/utility/hmac.py
index d8a0eace..b08be97e 100644
--- a/wqflask/utility/hmac.py
+++ b/wqflask/utility/hmac.py
@@ -3,6 +3,8 @@ from __future__ import print_function, division, absolute_import
 import hmac
 import hashlib
 
+from flask import url_for
+
 from wqflask import app
 
 def hmac_creation(stringy):
diff --git a/wqflask/utility/redis_tools.py b/wqflask/utility/redis_tools.py
index 0754e16f..15841032 100644
--- a/wqflask/utility/redis_tools.py
+++ b/wqflask/utility/redis_tools.py
@@ -1,17 +1,25 @@
 from __future__ import print_function, division, absolute_import
 
+import uuid
 import simplejson as json
 
 import redis # used for collections
-Redis = redis.StrictRedis()
 
 import logging
 
 from flask import (render_template, flash)
 
+from utility import hmac
+
 from utility.logger import getLogger
 logger = getLogger(__name__)
 
+def get_redis_conn():
+    Redis = redis.StrictRedis(port=6380)
+    return Redis
+
+Redis = get_redis_conn()
+
 def is_redis_available():
     try:
         Redis.ping()
@@ -70,11 +78,137 @@ def check_verification_code(code):
     email_address = None
     user_details = None
     email_address = Redis.hget("verification_codes", code)
-    return email_address
 
     if email_address:
         user_details = get_user_by_unique_column('email_address', email_address)
-        return user_details
+        if user_details:
+            return user_details
+        else:
+            return None
+    else:
+        return None
+
+def get_user_groups(user_id):
+    #ZS: Get the groups where a user is an admin or a member and return lists corresponding to those two sets of groups
+    admin_group_ids = []  #ZS: Group IDs where user is an admin
+    user_group_ids = []   #ZS: Group IDs where user is a regular user
+    groups_list = Redis.hgetall("groups")
+    for key in groups_list:
+        group_ob = json.loads(groups_list[key])
+        group_admins = set(group_ob['admins'])
+        group_users = set(group_ob['users'])
+        if user_id in group_admins:
+            admin_group_ids.append(group_ob['id'])
+        elif user_id in group_users:
+            user_group_ids.append(group_ob['id'])
+        else:
+            continue
+
+    return admin_group_ids, user_group_ids
+
+def get_group_info(group_id):
+    group_json = Redis.hget("groups", group_id)
+    group_info = None
+    if group_json:
+        group_info = json.loads(group_json)
+
+    return group_info
+
+def create_group(admin_member_ids, user_member_ids = [], group_name = ""):
+    group_id = str(uuid.uuid4())
+    new_group = {
+        "id"    : group_id,
+        "admins": admin_member_ids,
+        "users" : user_member_ids,
+        "name"  : group_name,
+        "created_timestamp": datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p'),
+        "changed_timestamp": datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p')
+    }
+
+    Redis.hset("groups", group_id, new_group)
+
+    return new_group
+
+def delete_group(user_id, group_id):
+    #ZS: If user is an admin of a group, remove it from the groups hash
+    group_info = get_group_info(group_id)
+    if user_id in group_info["admins"]:
+        Redis.hdel("groups", group_id)
+        return get_user_groups(user_id)
+    else:
+        None
+
+def add_users_to_group(user_id, group_id, user_emails = [], admins = False): #ZS "admins" is just to indicate whether the users should be added to the groups admins or regular users set
+    group_info = get_group_info(group_id)
+    if user_id in group_info["admins"]: #ZS: Just to make sure that the user is an admin for the group, even though they shouldn't be able to reach this point unless they are
+        if admins:
+            group_users = set(group_info["admins"])
+        else:
+            group_users = set(group_info["users"])
+
+        for email in user_emails:
+            user_id = get_user_id("email_address", email)
+            group_users.add(user_id)
+
+        if admins:
+            group_info["admins"] = list(group_users)
+        else:
+            group_info["users"] = list(group_users)
+
+        group_info["changed_timestamp"] = datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p')
+        Redis.hset("groups", group_id, json.dumps(group_info))
+        return group_info
+    else:
+        return None
+
+def remove_users_from_group(user_id, users_to_remove_ids, group_id, user_type = "users"): #ZS: User type is because I assume admins can remove other admins
+    group_info = get_group_info(group_id)
+    if user_id in group_info["admins"]:
+        group_users = set(group_info[user_type])
+        group_users -= set(users_to_remove_ids)
+        group_info[user_type] = list(group_users)
+        group_info["changed_timestamp"] = datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p')
+        Redis.hset("groups", group_id, json.dumps(group_info))
+
+def change_group_name(user_id, group_id, new_name):
+    group_info = get_group_info(group_id)
+    if user_id in group_info["admins"]:
+        group_info["name"] = new_name
+        return group_info
     else:
         return None
-        flash("Invalid code: Password reset code does not exist or might have expired!", "error")
+
+def get_resources():
+    resource_list = Redis.hgetall("resources")
+    return resource_list
+
+def get_resource_id(dataset_type, dataset_id, trait_id = None, all_resources = None):
+    if not all_resources:
+        all_resources = get_resources()
+
+    resource_list = [[key, json.loads(value)] for key, value in all_resources.items()]
+
+    if not trait_id:
+        matched_resources = [resource[0] for resource in resource_list if resource[1]['data']['dataset'] == dataset_id]
+    else:
+        matched_resources = [resource[0] for resource in resource_list if resource[1]['data']['dataset'] == dataset_id and resource[1]['data']['trait'] == trait_id]
+
+    if len(matched_resources):
+        return matched_resources[0]
+    else:
+        return False
+
+def get_resource_info(resource_id):
+    resource_info = Redis.hget("resources", resource_id)
+    return json.loads(resource_info)
+
+def add_resource(resource_info):
+
+    if 'trait' in resource_info['data']:
+        resource_id = hmac.data_hmac('{}:{}'.format(str(resource_info['data']['dataset']), str(resource_info['data']['trait'])))
+    else:
+        resource_id = hmac.data_hmac('{}'.format(str(resource_info['data']['dataset'])))
+
+    Redis.hset("resources", resource_id, json.dumps(resource_info))
+
+    return resource_info
diff --git a/wqflask/utility/startup_config.py b/wqflask/utility/startup_config.py
index 5a62cc50..817284dd 100644
--- a/wqflask/utility/startup_config.py
+++ b/wqflask/utility/startup_config.py
@@ -33,7 +33,7 @@ def app_config():
         if page.status_code != 200:
             raise Exception("API server not found!")
 
-    import utility.elasticsearch_tools as es
-    es.test_elasticsearch_connection()
+    # import utility.elasticsearch_tools as es
+    # es.test_elasticsearch_connection()
 
     print("GN2 is running. Visit %s[http://localhost:%s/%s](%s)" % (BLUE,str(port),ENDC,get_setting("WEBSERVER_URL")))
diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py
index 75bddb24..89d88516 100644
--- a/wqflask/utility/tools.py
+++ b/wqflask/utility/tools.py
@@ -233,7 +233,10 @@ def show_settings():
 # Cached values
 GN_VERSION         = get_setting('GN_VERSION')
 HOME               = get_setting('HOME')
+SERVER_PORT        = get_setting('SERVER_PORT')
 WEBSERVER_MODE     = get_setting('WEBSERVER_MODE')
+GN2_BASE_URL       = get_setting('GN2_BASE_URL')
+GN2_BRANCH_URL     = get_setting('GN2_BRANCH_URL')
 GN_SERVER_URL      = get_setting('GN_SERVER_URL')
 SERVER_PORT        = get_setting_int('SERVER_PORT')
 SQL_URI            = get_setting('SQL_URI')
@@ -267,10 +270,10 @@ if ORCID_CLIENT_ID != 'UNKNOWN' and ORCID_CLIENT_SECRET:
                       ORCID_CLIENT_ID+"&client_secret="+ORCID_CLIENT_SECRET
     ORCID_TOKEN_URL = get_setting('ORCID_TOKEN_URL')
 
-ELASTICSEARCH_HOST = get_setting('ELASTICSEARCH_HOST')
-ELASTICSEARCH_PORT = get_setting('ELASTICSEARCH_PORT')
-import utility.elasticsearch_tools as es
-es.test_elasticsearch_connection()
+# ELASTICSEARCH_HOST = get_setting('ELASTICSEARCH_HOST')
+# ELASTICSEARCH_PORT = get_setting('ELASTICSEARCH_PORT')
+# import utility.elasticsearch_tools as es
+# es.test_elasticsearch_connection()
 
 SMTP_CONNECT = get_setting('SMTP_CONNECT')
 SMTP_USERNAME = get_setting('SMTP_USERNAME')
@@ -289,7 +292,7 @@ JS_GUIX_PATH = get_setting("JS_GUIX_PATH")
 assert_dir(JS_GUIX_PATH)
 assert_dir(JS_GUIX_PATH+'/cytoscape-panzoom')
 
-CSS_PATH = "UNKNOWN"
+CSS_PATH = JS_GUIX_PATH  # The CSS is bundled together with the JS
 # assert_dir(JS_PATH)
 
 JS_TWITTER_POST_FETCHER_PATH = get_setting("JS_TWITTER_POST_FETCHER_PATH",js_path("javascript-twitter-post-fetcher"))