about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--wqflask/wqflask/__init__.py5
-rw-r--r--wqflask/wqflask/group_manager.py332
-rw-r--r--wqflask/wqflask/search_results.py4
-rw-r--r--wqflask/wqflask/show_trait/show_trait.py14
-rw-r--r--wqflask/wqflask/static/new/css/jupyter_notebooks.css16
-rw-r--r--wqflask/wqflask/static/new/javascript/group_manager.js13
-rw-r--r--wqflask/wqflask/templates/admin/create_group.html9
-rw-r--r--wqflask/wqflask/templates/admin/group_manager.html30
-rw-r--r--wqflask/wqflask/templates/admin/view_group.html55
-rw-r--r--wqflask/wqflask/templates/base.html2
-rw-r--r--wqflask/wqflask/templates/jupyter_notebooks.html4
-rw-r--r--wqflask/wqflask/templates/search_result_page.html2
-rw-r--r--wqflask/wqflask/templates/show_trait_details.html2
13 files changed, 260 insertions, 228 deletions
diff --git a/wqflask/wqflask/__init__.py b/wqflask/wqflask/__init__.py
index fbf1c9f5..05e040ed 100644
--- a/wqflask/wqflask/__init__.py
+++ b/wqflask/wqflask/__init__.py
@@ -10,8 +10,9 @@ from urllib.parse import urlparse
 from utility import formatting
 
 from gn3.authentication import DataRole, AdminRole
-from wqflask.resource_manager import resource_management
 
+from wqflask.group_manager import group_management
+from wqflask.resource_manager import resource_management
 from wqflask.metadata_edits import metadata_edit
 
 from wqflask.api.markdown import glossary_blueprint
@@ -65,8 +66,8 @@ app.register_blueprint(news_blueprint, url_prefix="/news")
 app.register_blueprint(jupyter_notebooks, url_prefix="/jupyter_notebooks")
 
 app.register_blueprint(resource_management, url_prefix="/resource-management")
-
 app.register_blueprint(metadata_edit, url_prefix="/datasets/")
+app.register_blueprint(group_management, url_prefix="/group-management")
 
 @app.before_request
 def before_request():
diff --git a/wqflask/wqflask/group_manager.py b/wqflask/wqflask/group_manager.py
index 04a100ba..3936e36e 100644
--- a/wqflask/wqflask/group_manager.py
+++ b/wqflask/wqflask/group_manager.py
@@ -1,175 +1,157 @@
-import random
-import string
-
-from flask import (Flask, g, render_template, url_for, request, make_response,
-                   redirect, flash)
-
-from wqflask import app
-from wqflask.user_login import send_verification_email, send_invitation_email, basic_info, set_password
-
-from utility.redis_tools import get_user_groups, get_group_info, save_user, create_group, delete_group, add_users_to_group, remove_users_from_group, \
-    change_group_name, save_verification_code, check_verification_code, get_user_by_unique_column, get_resources, get_resource_info
-
-from utility.logger import getLogger
-logger = getLogger(__name__)
-
-
-@app.route("/groups/manage", methods=('GET', 'POST'))
-def manage_groups():
-    params = request.form if request.form else request.args
-    if "add_new_group" in params:
-        return redirect(url_for('add_group'))
-    else:
-        admin_groups, member_groups = get_user_groups(g.user_session.user_id)
-        return render_template("admin/group_manager.html", admin_groups=admin_groups, member_groups=member_groups)
-
-
-@app.route("/groups/view", methods=('GET', 'POST'))
-def view_group():
-    params = request.form if request.form else request.args
-    group_id = params['id']
-    group_info = get_group_info(group_id)
-    admins_info = []
-    user_is_admin = False
-    if g.user_session.user_id in group_info['admins']:
-        user_is_admin = True
-    for user_id in group_info['admins']:
-        if user_id:
-            user_info = get_user_by_unique_column("user_id", user_id)
-            admins_info.append(user_info)
-    members_info = []
-    for user_id in group_info['members']:
-        if user_id:
-            user_info = get_user_by_unique_column("user_id", user_id)
-            members_info.append(user_info)
-
-    # ZS: This whole part might not scale well with many resources
-    resources_info = []
-    all_resources = get_resources()
-    for resource_id in all_resources:
-        resource_info = get_resource_info(resource_id)
-        group_masks = resource_info['group_masks']
-        if group_id in group_masks:
-            this_resource = {}
-            privileges = group_masks[group_id]
-            this_resource['id'] = resource_id
-            this_resource['name'] = resource_info['name']
-            this_resource['data'] = privileges['data']
-            this_resource['metadata'] = privileges['metadata']
-            this_resource['admin'] = privileges['admin']
-            resources_info.append(this_resource)
-
-    return render_template("admin/view_group.html", group_info=group_info, admins=admins_info, members=members_info, user_is_admin=user_is_admin, resources=resources_info)
-
-
-@app.route("/groups/remove", methods=('POST',))
-def remove_groups():
-    group_ids_to_remove = request.form['selected_group_ids']
-    for group_id in group_ids_to_remove.split(":"):
-        delete_group(g.user_session.user_id, group_id)
-
-    return redirect(url_for('manage_groups'))
-
-
-@app.route("/groups/remove_users", methods=('POST',))
-def remove_users():
-    group_id = request.form['group_id']
-    admin_ids_to_remove = request.form['selected_admin_ids']
-    member_ids_to_remove = request.form['selected_member_ids']
-
-    remove_users_from_group(g.user_session.user_id, admin_ids_to_remove.split(
-        ":"), group_id, user_type="admins")
-    remove_users_from_group(g.user_session.user_id, member_ids_to_remove.split(
-        ":"), group_id, user_type="members")
-
-    return redirect(url_for('view_group', id=group_id))
-
-
-@app.route("/groups/add_<path:user_type>", methods=('POST',))
-def add_users(user_type='members'):
-    group_id = request.form['group_id']
-    if user_type == "admins":
-        user_emails = request.form['admin_emails_to_add'].split(",")
-        add_users_to_group(g.user_session.user_id, group_id,
-                           user_emails, admins=True)
-    elif user_type == "members":
-        user_emails = request.form['member_emails_to_add'].split(",")
-        add_users_to_group(g.user_session.user_id, group_id,
-                           user_emails, admins=False)
-
-    return redirect(url_for('view_group', id=group_id))
-
-
-@app.route("/groups/change_name", methods=('POST',))
-def change_name():
-    group_id = request.form['group_id']
-    new_name = request.form['new_name']
-    group_info = change_group_name(g.user_session.user_id, group_id, new_name)
-
-    return new_name
-
-
-@app.route("/groups/create", methods=('GET', 'POST'))
-def add_or_edit_group():
-    params = request.form if request.form else request.args
-    if "group_name" in params:
-        member_user_ids = set()
-        admin_user_ids = set()
-        # ZS: Always add the user creating the group as an admin
-        admin_user_ids.add(g.user_session.user_id)
-        if "admin_emails_to_add" in params:
-            admin_emails = params['admin_emails_to_add'].split(",")
-            for email in admin_emails:
-                user_details = get_user_by_unique_column(
-                    "email_address", email)
-                if user_details:
-                    admin_user_ids.add(user_details['user_id'])
-            #send_group_invites(params['group_id'], user_email_list = admin_emails, user_type="admins")
-        if "member_emails_to_add" in params:
-            member_emails = params['member_emails_to_add'].split(",")
-            for email in member_emails:
-                user_details = get_user_by_unique_column(
-                    "email_address", email)
-                if user_details:
-                    member_user_ids.add(user_details['user_id'])
-            #send_group_invites(params['group_id'], user_email_list = user_emails, user_type="members")
-
-        create_group(list(admin_user_ids), list(
-            member_user_ids), params['group_name'])
-        return redirect(url_for('manage_groups'))
-    else:
-        return render_template("admin/create_group.html")
-
-# ZS: Will integrate this later, for now just letting users be added directly
-
-
-def send_group_invites(group_id, user_email_list=[], user_type="members"):
-    for user_email in user_email_list:
-        user_details = get_user_by_unique_column("email_address", user_email)
-        if user_details:
-            group_info = get_group_info(group_id)
-            # ZS: Probably not necessary since the group should normally always exist if group_id is being passed here,
-            #    but it's technically possible to hit it if Redis is cleared out before submitting the new users or something
-            if group_info:
-                # ZS: Don't add user if they're already an admin or if they're being added a regular user and are already a regular user,
-                #    but do add them if they're a regular user and are added as an admin
-                if (user_details['user_id'] in group_info['admins']) or \
-                   ((user_type == "members") and (user_details['user_id'] in group_info['members'])):
-                    continue
-                else:
-                    send_verification_email(user_details, template_name="email/group_verification.txt",
-                                            key_prefix="verification_code", subject="You've been invited to join a GeneNetwork user group")
-        else:
-            temp_password = ''.join(random.choice(
-                string.ascii_uppercase + string.digits) for _ in range(6))
-            user_details = {
-                'user_id': str(uuid.uuid4()),
-                'email_address': user_email,
-                'registration_info': basic_info(),
-                'password': set_password(temp_password),
-                'confirmed': 0
-            }
-            save_user(user_details, user_details['user_id'])
-            send_invitation_email(user_email, temp_password)
-
-# @app.route()
+import json
+import redis
+import datetime
+
+from flask import current_app
+from flask import Blueprint
+from flask import g
+from flask import render_template
+from flask import request
+from flask import redirect
+from flask import url_for
+from gn3.authentication import get_groups_by_user_uid
+from gn3.authentication import get_user_info_by_key
+from gn3.authentication import create_group
+from wqflask.decorators import login_required
+
+group_management = Blueprint("group_management", __name__)
+
+
+@group_management.route("/groups")
+@login_required
+def display_groups():
+    groups = get_groups_by_user_uid(
+        user_uid=(g.user_session.record.get(b"user_id",
+                                            b"").decode("utf-8") or
+                  g.user_session.record.get("user_id", "")),
+        conn=redis.from_url(
+            current_app.config["REDIS_URL"],
+            decode_responses=True))
+    return render_template("admin/group_manager.html",
+                           admin_groups=groups.get("admin"),
+                           member_groups=groups.get("member"))
+
+
+@group_management.route("/groups/create", methods=("GET",))
+@login_required
+def view_create_group_page():
+    return render_template("admin/create_group.html")
+
+
+@group_management.route("/groups/create", methods=("POST",))
+@login_required
+def create_new_group():
+    conn = redis.from_url(current_app.config["REDIS_URL"],
+                          decode_responses=True)
+    if group_name := request.form.get("group_name"):
+        members_uid, admins_uid = set(), set()
+        admins_uid.add(user_uid := (
+            g.user_session.record.get(
+                b"user_id",
+                b"").decode("utf-8") or
+            g.user_session.record.get("user_id", "")))
+        if admin_string := request.form.get("admin_emails_to_add"):
+            for email in admin_string.split(","):
+                user_info = get_user_info_by_key(key="email_address",
+                                                 value=email,
+                                                 conn=conn)
+                if user_uid := user_info.get("user_id"):
+                    admins_uid.add(user_uid)
+        if member_string := request.form.get("member_emails_to_add"):
+            for email in member_string.split(","):
+                user_info = get_user_info_by_key(key="email_address",
+                                                 value=email,
+                                                 conn=conn)
+                if user_uid := user_info.get("user_id"):
+                    members_uid.add(user_uid)
+
+        # Create the new group:
+        create_group(conn=conn,
+                     group_name=group_name,
+                     member_user_uids=list(members_uid),
+                     admin_user_uids=list(admins_uid))
+        return redirect(url_for('group_management.display_groups'))
+    return redirect(url_for('group_management.create_groups'))
+
+
+@group_management.route("/groups/delete", methods=("POST",))
+@login_required
+def delete_groups():
+    conn = redis.from_url(current_app.config["REDIS_URL"],
+                          decode_responses=True)
+    user_uid = (g.user_session.record.get(b"user_id", b"").decode("utf-8") or
+                g.user_session.record.get("user_id", ""))
+    current_app.logger.info(request.form.get("selected_group_ids"))
+    for group_uid in request.form.get("selected_group_ids", "").split(":"):
+        if group_info := conn.hget("groups", group_uid):
+            group_info = json.loads(group_info)
+            # A user who is an admin can delete things
+            if user_uid in group_info.get("admins"):
+                conn.hdel("groups", group_uid)
+    return redirect(url_for('group_management.display_groups'))
+
+
+@group_management.route("/groups/<group_id>")
+@login_required
+def view_group(group_id: str):
+    conn = redis.from_url(current_app.config["REDIS_URL"],
+                          decode_responses=True)
+    user_uid = (g.user_session.record.get(b"user_id", b"").decode("utf-8") or
+                g.user_session.record.get("user_id", ""))
+
+    resource_info = []
+    for resource_uid, resource in conn.hgetall("resources").items():
+        resource = json.loads(resource)
+        if group_id in (group_mask := resource.get("group_masks")):
+            __dict = {}
+            for val in group_mask.values():
+                __dict.update(val)
+            __dict.update({
+                "id": resource_uid,
+                "name": resource.get("name"),
+            })
+            resource_info.append(__dict)
+    group_info = json.loads(conn.hget("groups",
+                                      group_id))
+    group_info["guid"] = group_id
+
+    return render_template(
+         "admin/view_group.html",
+         group_info=group_info,
+         admins=[get_user_info_by_key(key="user_id",
+                                      value=user_id,
+                                      conn=conn)
+                 for user_id in group_info.get("admins")],
+         members=[get_user_info_by_key(key="user_id",
+                                      value=user_id,
+                                      conn=conn)
+                 for user_id in group_info.get("members")],
+         is_admin = (True if user_uid in group_info.get("admins") else False),
+         resources=resource_info)
+            
+
+@group_management.route("/groups/<group_id>", methods=("POST",))
+def update_group(group_id: str):
+    conn = redis.from_url(current_app.config["REDIS_URL"],
+                          decode_responses=True)
+    user_uid = (g.user_session.record.get(b"user_id", b"").decode("utf-8") or
+                g.user_session.record.get("user_id", ""))
+    group = json.loads(conn.hget("groups", group_id))
+    timestamp = group["changed_timestamp"]
+    timestamp_ = datetime.datetime.utcnow().strftime('%b %d %Y %I:%M%p')
+    if user_uid in group.get("admins"):
+        if name := request.form.get("new_name"):
+            group["name"] = name
+            group["changed_timestamp"] = timestamp_
+        if admins := request.form.get("admin_emails_to_add"):
+            group["admins"] = list(set(admins.split(":") +
+                                       group.get("admins")))
+            group["changed_timestamp"] = timestamp_
+        if members := request.form.get("member_emails_to_add"):
+            print(f"\n+++++\n{members}\n+++++\n")
+            group["members"] = list(set(members.split(":") +
+                                        group.get("members")))
+            group["changed_timestamp"] = timestamp_
+        conn.hset("groups", group_id, json.dumps(group))
+    return redirect(url_for('group_management.view_group',
+                            group_id=group_id))
diff --git a/wqflask/wqflask/search_results.py b/wqflask/wqflask/search_results.py
index 5ca1f9ca..33f9319c 100644
--- a/wqflask/wqflask/search_results.py
+++ b/wqflask/wqflask/search_results.py
@@ -62,8 +62,10 @@ class SearchResultPage:
             self.search_term_exists = True
 
         self.results = []
+        max_result_count = 100000 # max number of results to display
         type = kw.get('type')
         if type == "Phenotypes":     # split datatype on type field
+            max_result_count = 50000
             dataset_type = "Publish"
         elif type == "Genotypes":
             dataset_type = "Geno"
@@ -81,7 +83,7 @@ class SearchResultPage:
 
         self.too_many_results = False
         if self.search_term_exists:
-            if len(self.results) > 50000:
+            if len(self.results) > max_result_count:
                 self.trait_list = []
                 self.too_many_results = True
             else:
diff --git a/wqflask/wqflask/show_trait/show_trait.py b/wqflask/wqflask/show_trait/show_trait.py
index 6020bc16..93f95852 100644
--- a/wqflask/wqflask/show_trait/show_trait.py
+++ b/wqflask/wqflask/show_trait/show_trait.py
@@ -40,10 +40,17 @@ ONE_YEAR = 60 * 60 * 24 * 365
 
 class ShowTrait:
     def __init__(self, user_id, kw):
+        self.admin_status = None
         if 'trait_id' in kw and kw['dataset'] != "Temp":
             self.temp_trait = False
             self.trait_id = kw['trait_id']
             helper_functions.get_species_dataset_trait(self, kw)
+            self.resource_id = get_resource_id(self.dataset,
+                                           self.trait_id)
+            self.admin_status = get_highest_user_access_role(
+                    user_id=user_id,
+                    resource_id=(self.resource_id or ""),
+                    gn_proxy_url=GN_PROXY_URL)
         elif 'group' in kw:
             self.temp_trait = True
             self.trait_id = "Temp_" + kw['species'] + "_" + kw['group'] + \
@@ -71,12 +78,7 @@ class ShowTrait:
                                            name=self.trait_id,
                                            cellid=None)
             self.trait_vals = Redis.get(self.trait_id).split()
-        self.resource_id = get_resource_id(self.dataset,
-                                           self.trait_id)
-        self.admin_status = get_highest_user_access_role(
-                user_id=user_id,
-                resource_id=(self.resource_id or ""),
-                gn_proxy_url=GN_PROXY_URL)
+
         # ZS: Get verify/rna-seq link URLs
         try:
             blatsequence = self.this_trait.blatseq
diff --git a/wqflask/wqflask/static/new/css/jupyter_notebooks.css b/wqflask/wqflask/static/new/css/jupyter_notebooks.css
new file mode 100644
index 00000000..db972a17
--- /dev/null
+++ b/wqflask/wqflask/static/new/css/jupyter_notebooks.css
@@ -0,0 +1,16 @@
+.jupyter-links {
+    padding: 1.5em;
+}
+
+.jupyter-links:nth-of-type(2n) {
+    background: #EEEEEE;
+}
+
+.jupyter-links .main-link {
+    font-size: larger;
+    display: block;
+}
+
+.jupyter-links .src-link {
+    font-size: smaller;
+}
diff --git a/wqflask/wqflask/static/new/javascript/group_manager.js b/wqflask/wqflask/static/new/javascript/group_manager.js
index 4c172cbf..cd56133a 100644
--- a/wqflask/wqflask/static/new/javascript/group_manager.js
+++ b/wqflask/wqflask/static/new/javascript/group_manager.js
@@ -16,23 +16,22 @@ $('#clear_members').click(function(){
 
 
 function add_emails(user_type){
-    var email_address = $('input[name=user_email]').val();
-    var email_list_string = $('input[name=' + user_type + '_emails_to_add]').val().trim()
-    console.log(email_list_string)
+    let email_address = $('input[name=user_email]').val();
+    let email_list_string = $('input[name=' + user_type + '_emails_to_add]').val().trim()
     if (email_list_string == ""){
-        var email_set = new Set();
+        let email_set = new Set();
     } else {
-        var email_set = new Set(email_list_string.split(","))
+        let email_set = new Set(email_list_string.split(","))
     }
     email_set.add(email_address)
 
     $('input[name=' + user_type + '_emails_to_add]').val(Array.from(email_set).join(','))
 
-    var emails_display_string = Array.from(email_set).join('\n')
+    let emails_display_string = Array.from(email_set).join('\n')
     $('.added_' + user_type + 's').val(emails_display_string)
 }
 
 function clear_emails(user_type){
     $('input[name=' + user_type + '_emails_to_add]').val("")
     $('.added_' + user_type + 's').val("")
-}
\ No newline at end of file
+}
diff --git a/wqflask/wqflask/templates/admin/create_group.html b/wqflask/wqflask/templates/admin/create_group.html
index 21ef5653..b1d214ea 100644
--- a/wqflask/wqflask/templates/admin/create_group.html
+++ b/wqflask/wqflask/templates/admin/create_group.html
@@ -6,7 +6,8 @@
         <div class="page-header">
             <h1>Create Group</h1>
         </div>
-        <form action="/groups/create" method="POST">
+        <form action="{{ url_for('group_management.create_new_group') }}"
+              method="POST">
             <input type="hidden" name="admin_emails_to_add" value="">
             <input type="hidden" name="member_emails_to_add" value="">
             <fieldset>
@@ -73,17 +74,11 @@
         </form>
     </div>
 
-
-
 <!-- End of body -->
-
 {% endblock %}
 
 {% block js %}
      <script language="javascript" type="text/javascript" src="{{ url_for('js', filename='DataTables/js/jquery.js') }}"></script>
     <script language="javascript" type="text/javascript" src="/static/new/javascript/group_manager.js"></script>
     <script language="javascript" type="text/javascript" src="{{ url_for('js', filename='js_alt/underscore.min.js') }}"></script>
-
-    <script type="text/javascript" charset="utf-8">
-    </script>
 {% endblock %}
diff --git a/wqflask/wqflask/templates/admin/group_manager.html b/wqflask/wqflask/templates/admin/group_manager.html
index 692a7abc..eedfe138 100644
--- a/wqflask/wqflask/templates/admin/group_manager.html
+++ b/wqflask/wqflask/templates/admin/group_manager.html
@@ -12,8 +12,15 @@
             <h1>Manage Groups</h1>
             {% if admin_groups|length != 0 or member_groups|length != 0 %}
             <div style="display: inline;">
-                <button type="button" id="create_group" class="btn btn-primary" data-url="/groups/create">Create Group</button>
-                <button type="button" id="remove_groups" class="btn btn-primary" data-url="/groups/remove">Remove Selected Groups</button>
+                <a href="{{ url_for('group_management.view_create_group_page') }}" target="_blank">
+                    <button type="button" class="btn btn-primary">
+                        Create Group
+                    </button>
+                </a>
+                <button type="button" id="remove_groups" class="btn btn-primary"
+                        data-url="{{ url_for('group_management.delete_groups') }}">
+                    Remove Selected Groups
+                </button>
             </div>
             {% endif %}
         </div>
@@ -23,7 +30,11 @@
                 {% if admin_groups|length == 0 and member_groups|length == 0 %}
                 <h4>You currently aren't a member or admin of any groups.</h4>
                 <br>
-                <button type="button" id="create_group" class="btn btn-primary" data-url="/groups/create">Create a new group</button>
+                <a href="{{ url_for('group_management.view_create_group_page') }}" target="_blank">
+                    <button type="button" class="btn btn-primary">
+                        Create Group
+                    </button>
+                </a>
                 {% else %}
                 <div style="margin-top: 20px;"><h2>Admin Groups</h2></div>
                 <hr>
@@ -47,11 +58,12 @@
                         <tr>
                             <td><input type="checkbox" name="group_id" value="{{ group.id }}"></td>
                             <td align="right">{{ loop.index }}</td>
-                            <td><a href="/groups/view?id={{ group.id }}">{{ group.name }}</a></td>
+                            {% set group_url = url_for('group_management.view_group', group_id=group.uuid) %}
+                            <td><a href="{{ group_url  }}">{{ group.name }}</a></td>
                             <td align="right">{{ group.admins|length + group.members|length }}</td>
                             <td>{{ group.created_timestamp }}</td>
                             <td>{{ group.changed_timestamp }}</td>
-                            <td>{{ group.id }}</td>
+                            <td>{{ group.uuid }}</td>
                         </tr>
                         {% endfor %}
                     </tbody>
@@ -81,7 +93,8 @@
                         <tr>
                             <td><input type="checkbox" name="read" value="{{ group.id }}"></td>
                             <td>{{ loop.index }}</td>
-                            <td><a href="/groups/view?id={{ group.id }}">{{ group.name }}</a></td>
+                            {% set group_url = url_for('group_management.view_group', group_id=group.uuid) %}
+                            <td><a href="{{ group_url }}">{{ group.name }}</a></td>
                             <td>{{ group.admins|length + group.members|length }}</td>
                             <td>{{ group.created_timestamp }}</td>
                             <td>{{ group.changed_timestamp }}</td>
@@ -119,11 +132,6 @@
                 return $("#groups_form").submit();
             };
 
-            $("#create_group").on("click", function() {
-                url = $(this).data("url")
-                return submit_special(url)
-            });
-
             $("#remove_groups").on("click", function() {
                 url = $(this).data("url")
                 groups = []
diff --git a/wqflask/wqflask/templates/admin/view_group.html b/wqflask/wqflask/templates/admin/view_group.html
index 26692fe8..c88ce0e7 100644
--- a/wqflask/wqflask/templates/admin/view_group.html
+++ b/wqflask/wqflask/templates/admin/view_group.html
@@ -1,26 +1,30 @@
 {% extends "base.html" %}
 {% block title %}View and Edit Group{% endblock %}
 {% block css %}
-    <link rel="stylesheet" type="text/css" href="{{ url_for('css', filename='DataTables/css/jquery.dataTables.css') }}" />
-     <link rel="stylesheet" type="text/css" href="{{ url_for('css', filename='DataTablesExtensions/buttonStyles/css/buttons.dataTables.min.css') }}" />
-    <link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" />
+<link rel="stylesheet" type="text/css" href="{{ url_for('css', filename='DataTables/css/jquery.dataTables.css') }}" />
+<link rel="stylesheet" type="text/css" href="{{ url_for('css', filename='DataTablesExtensions/buttonStyles/css/buttons.dataTables.min.css') }}" />
+<link rel="stylesheet" type="text/css" href="/static/new/css/show_trait.css" />
 {% endblock %}
 {% block content %}
 <!-- Start of body -->
-    <div class="container">
+{% set GROUP_URL = url_for('group_management.view_group', group_id=group_info.guid) %}
+{% set UPDATE_GROUP_URL = url_for('group_management.update_group', group_id=group_info.guid) %}
+<div class="container">
         <div class="page-header">
             <h1>
-                <span id="group_name">{{ group_info.name }}</span>
-                <input type="text" name="new_group_name" style="font-size: 20px; display: none; width: 500px;" class="form-control" placeholder="{{ group_info.name }}"> 
+                <span id="group_name">Name: {{ group_info.name }}</span>
+                <input type="text" name="new_group_name" style="font-size: 20px; display: none; width: 500px;" class="form-control" placeholder="{{ group_info.name }}">
+                {% if is_admin %}
                 <button class="btn btn-default" style="display: inline;" id="change_group_name">Change Group Name</button>
+                {% endif %}
             </h1>
-            {% if user_is_admin == true %}
+            {% if is_admin %}
             <div style="display: inline;">
                 <button type="button" id="remove_users" class="btn btn-danger" data-url="/groups/remove_users">Remove Selected Users from Group</button>
             </div>
             {% endif %}
         </div>
-        <form id="group_form" action="/groups/view" method="POST">
+        <form id="group_form" action="{{ UPDATE_GROUP_URL }}" method="POST">
             <input type="hidden" name="group_id" value="{{ group_info.id }}">
             <input type="hidden" name="selected_admin_ids" value="">
             <input type="hidden" name="selected_member_ids" value="">
@@ -37,6 +41,9 @@
                                 <th>Name</th>
                                 <th>Email Address</th>
                                 <th>Organization</th>
+                                {% if is_admin %}
+                                <th>UID</th>
+                                {% endif %}
                             </tr>
                         </thead>
                         <tbody>
@@ -47,17 +54,20 @@
                                 <td>{% if 'full_name' in admin %}{{ admin.full_name }}{% elif 'name' in admin %}{{ admin.name }}{% else %}N/A{% endif %}</td>
                                 <td>{% if 'email_address' in admin %}{{ admin.email_address }}{% else %}N/A{% endif %}</td>
                                 <td>{% if 'organization' in admin %}{{ admin.organization }}{% else %}N/A{% endif %}</td>
+                                {% if is_admin %}
+                                <td>{{admin.user_id}}</td>
+                                {% endif %}
                             </tr>
                             {% endfor %}
                         </tbody>
                     </table>
-                    {% if user_is_admin == true %}
+                    {% if is_admin %}
                     <div style="margin-top: 20px;">
                             <span>E-mail of user to add to admins (multiple e-mails can be added separated by commas):</span>
                             <input type="text" size="60" name="admin_emails_to_add" placeholder="Enter E-mail(s)" value="">
                     </div>
                     <div style="margin-bottom: 30px; margin-top: 20px;">
-                        <button type="button" id="add_admins" class="btn btn-primary" data-usertype="admin" data-url="/groups/add_admins">Add Admin(s)</button>
+                        <button type="button" id="add_admins" class="btn btn-primary" data-usertype="admin" data-url="{{ UPDATE_GROUP_URL }}">Add Admin(s)</button>
                     </div>
                     {% endif %}
                 </div>
@@ -74,38 +84,50 @@
                                 <th>Name</th>
                                 <th>Email Address</th>
                                 <th>Organization</th>
+                                {% if is_admin %}
+                                <th>UID</th>
+                                {% endif %}
                             </tr>
                         </thead>
                         <tbody>
                             {% for member in members %}
                             <tr>
-                                <td style="text-align: center; padding: 0px 10px 2px 10px;"><input type="checkbox" name="member_id" value="{{ member.user_id }}"></td>
+                                
+                                <td style="text-align: center; padding: 0px 10px 2px 10px;">
+                                    {% if is_admin %}
+                                    <input type="checkbox" name="member_id" value="{{ member.user_id }}">
+                                    {% endif %}
+                                </td>
                                 <td align="right">{{ loop.index }}</td>
                                 <td>{% if 'full_name' in member %}{{ member.full_name }}{% elif 'name' in admin %}{{ admin.name }}{% else %}N/A{% endif %}</td>
                                 <td>{% if 'email_address' in member %}{{ member.email_address }}{% else %}N/A{% endif %}</td>
                                 <td>{% if 'organization' in member %}{{ member.organization }}{% else %}N/A{% endif %}</td>
+                                {% if is_admin %}
+                                <td>{{ member }}</td>
+                                {% endif %}
+
                             </tr>
                             {% endfor %}
                         </tbody>
                     </table>
-                    {% if user_is_admin == true %}
+                    {% if is_admin %}
                     <div style="margin-top: 20px;">
                             <span>E-mail of user to add to members (multiple e-mails can be added separated by commas):</span>
                             <input type="text" size="60" name="member_emails_to_add" placeholder="Enter E-mail(s)" value="">
                     </div>
                     <div style="margin-bottom: 30px; margin-top: 20px;">
-                        <button type="button" id="add_members" class="btn btn-primary" data-usertype="member" data-url="/groups/add_members">Add Member(s)</button>
+                        <button type="button" id="add_members" class="btn btn-primary" data-usertype="member" data-url="{{ GROUP_URL }}">Add Member(s)</button>
                     </div>
                     {% endif %}
                     {% else %}
                     There are currently no members in this group.
-                    {% if user_is_admin == true %}
+                    {% if is_admin %}
                     <div style="margin-top: 20px;">
                             <span>E-mail of user to add to members (multiple e-mails can be added separated by commas):</span>
                             <input type="text" size="60" name="member_emails_to_add" placeholder="Enter E-mail(s)" value="">
                     </div>
                     <div style="margin-bottom: 30px; margin-top: 20px;">
-                        <button type="button" id="add_members" class="btn btn-primary" data-usertype="member" data-url="/groups/add_members">Add Member(s)</button>
+                        <button type="button" id="add_members" class="btn btn-primary" data-usertype="member" data-url="{{ GROUP_URL }}">Add Member(s)</button>
                     </div>
                     {% endif %}
                     {% endif %}
@@ -219,6 +241,7 @@
 
             $("#add_admins, #add_members").on("click", function() {
                 url = $(this).data("url");
+                console.log(url)
                 return submit_special(url)
             });
 
@@ -230,7 +253,7 @@
                     new_name = $('input[name=new_group_name]').val()
                     $.ajax({
                         type: "POST",
-                        url: "/groups/change_name",
+                        url: "{{ GROUP_URL }} ",
                         data: {
                             group_id: $('input[name=group_id]').val(),
                             new_name: new_name
diff --git a/wqflask/wqflask/templates/base.html b/wqflask/wqflask/templates/base.html
index ab8b644f..6e922f24 100644
--- a/wqflask/wqflask/templates/base.html
+++ b/wqflask/wqflask/templates/base.html
@@ -87,7 +87,7 @@
                                   <li><a href="https://systems-genetics.org/">Systems Genetics PheWAS</a></li>
                                   <li><a href="http://ucscbrowser.genenetwork.org/">Genome Browser</a></li>
                                   <li><a href="http://power.genenetwork.org">BXD Power Calculator</a></li>
-                                  <li><a href="url_for('jupyter_notebooks.launcher')">Jupyter Notebook Launcher</a></li>
+                                  <li><a href="{{url_for('jupyter_notebooks.launcher')}}">Jupyter Notebook Launcher</a></li>
                                   <li><a href="http://datafiles.genenetwork.org">Interplanetary File System</a></li>
                                 </ul>
                         </li>
diff --git a/wqflask/wqflask/templates/jupyter_notebooks.html b/wqflask/wqflask/templates/jupyter_notebooks.html
index 4dce0f27..afc95a15 100644
--- a/wqflask/wqflask/templates/jupyter_notebooks.html
+++ b/wqflask/wqflask/templates/jupyter_notebooks.html
@@ -4,6 +4,10 @@
 Jupyter Notebooks
 {%endblock%}
 
+{%block css%}
+<link rel="stylesheet" type="text/css" href="/static/new/css/jupyter_notebooks.css" />
+{%endblock%}
+
 {%block content%}
 
 <div class="container">
diff --git a/wqflask/wqflask/templates/search_result_page.html b/wqflask/wqflask/templates/search_result_page.html
index 95842316..dade6ba5 100644
--- a/wqflask/wqflask/templates/search_result_page.html
+++ b/wqflask/wqflask/templates/search_result_page.html
@@ -176,7 +176,7 @@
                 return params;
             };
 
-            {% if results|count > 0 %}
+            {% if results|count > 0  and not too_many_results %}
             var tableId = "trait_table";
 
             var width_change = 0; //ZS: For storing the change in width so overall table width can be adjusted by that amount
diff --git a/wqflask/wqflask/templates/show_trait_details.html b/wqflask/wqflask/templates/show_trait_details.html
index 3e59a3ee..6b125221 100644
--- a/wqflask/wqflask/templates/show_trait_details.html
+++ b/wqflask/wqflask/templates/show_trait_details.html
@@ -234,7 +234,7 @@
         {% endif %}
         {% endif %}
         <button type="button" id="view_in_gn1" class="btn btn-primary" title="View Trait in GN1" onclick="window.open('http://gn1.genenetwork.org/webqtl/main.py?cmd=show&db={{ this_trait.dataset.name }}&probeset={{ this_trait.name }}', '_blank')">Go to GN1</button>
-        {% if admin_status.get('metadata', DataRole.VIEW) > DataRole.VIEW %}
+        {% if admin_status != None and admin_status.get('metadata', DataRole.VIEW) > DataRole.VIEW %}
         {% if this_trait.dataset.type == 'Publish' %}
         <button type="button" id="edit_resource" class="btn btn-success" title="Edit Resource" onclick="window.open('/datasets/{{ this_trait.dataset.id }}/traits/{{ this_trait.name }}?resource-id={{ resource_id }}', '_blank')">Edit</button>
         {% endif %}