aboutsummaryrefslogtreecommitdiff
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 %}