about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--wqflask/base/data_set.py2
-rw-r--r--wqflask/utility/redis_tools.py72
-rw-r--r--wqflask/wqflask/templates/admin/group_manager.html134
3 files changed, 159 insertions, 49 deletions
diff --git a/wqflask/base/data_set.py b/wqflask/base/data_set.py
index cab708ef..5f08c34c 100644
--- a/wqflask/base/data_set.py
+++ b/wqflask/base/data_set.py
@@ -131,7 +131,7 @@ Publish or ProbeSet. E.g.
                                 ProbeSetFreeze.Name = "{0}"
                             """.format(name)
 
-            results = g.db.execute(geno_query).fetchall()
+            results = g.db.execute(mrna_expr_query).fetchall()
             if len(results):
                 self.datasets[name] = "ProbeSet"
                 Redis.set("dataset_structure", json.dumps(self.datasets))
diff --git a/wqflask/utility/redis_tools.py b/wqflask/utility/redis_tools.py
index 573f9945..16bf911a 100644
--- a/wqflask/utility/redis_tools.py
+++ b/wqflask/utility/redis_tools.py
@@ -96,3 +96,75 @@ def get_user_groups(user_id):
             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
\ No newline at end of file
diff --git a/wqflask/wqflask/templates/admin/group_manager.html b/wqflask/wqflask/templates/admin/group_manager.html
index ea9026a6..50c2a42c 100644
--- a/wqflask/wqflask/templates/admin/group_manager.html
+++ b/wqflask/wqflask/templates/admin/group_manager.html
@@ -6,40 +6,71 @@
 
     <div class="container">
         <div class="page-header">
-
+            <h1>Manage Groups</h1>
         </div>
-        <form>
-            <div class="control-group">
-                <b>Group Name: </b>
-                <div class="input-append">
-                    <input type="text" name="group_name">
-                    <button type="submit" class="btn btn-primary">Save</button>
-                </div>
+        <form action="/manage/groups" method="POST">
+            <div class="container" style="margin-bottom: 30px;">
+                <div><h3>Admin Groups</h3></div>
+                <hr>
+                <table id="admin_groups" class="table table-hover">
+                    <thead>
+                        <tr>
+                            <th></th>
+                            <th>Index</th>
+                            <th>Name</th>
+                            <th># Members</th>
+                            <th>Created</th>
+                            <th>Last Changed</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        {% for group in admin_groups %}
+                        <tr>
+                            <td><input type="checkbox" name="read" value="{{ group.id }}"></td>
+                            <td>{{ loop.index }}</td>
+                            <td>{{ group.name }}</td>
+                            <td>{{ group.admins|length + group.users|length }}</td>
+                            <td>{{ group.created_timestamp }}</td>
+                            <td>{{ group.changed_timestamp }}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+                </table>
+            </div>
+            <hr>
+            <div class="container">
+                <div><h3>User Groups</h3></div>
+                <hr>
+                <table id="user_groups" class="table table-hover">
+                    <thead>
+                        <tr>
+                            <th></th>
+                            <th>Index</th>
+                            <th>Name</th>
+                            <th># Members</th>
+                            <th>Created</th>
+                            <th>Last Changed</th>
+                        </tr>
+                    </thead>
+                    <tbody>
+                        {% for group in user_groups %}
+                        <tr>
+                            <td><input type="checkbox" name="read" value="{{ group.id }}"></td>
+                            <td>{{ loop.index }}</td>
+                            <td>{{ group.name }}</td>
+                            <td>{{ group.admins|length + group.users|length }}</td>
+                            <td>{{ group.created_timestamp }}</td>
+                            <td>{{ group.changed_timestamp }}</td>
+                        </tr>
+                        {% endfor %}
+                    </tbody>
+                </table>
             </div>
-
-            <table id="dataset_list" class="table table-hover">
-                <thead>
-                    <tr>
-                        <th>Read</th>
-                        <th>Type</th>
-                        <th>ID</th>
-                        <th>Name</th>
-                        <th>Full Name</th>
-                    </tr>
-                </thead>
-            {% for dataset in datasets %}
-                <tr>
-                    <td><input type="checkbox" name="read" value="{{ dataset.type }}:{{ dataset.name }}"></td>
-                    <td>{{ dataset.type }}</td>
-                    <td>{{ dataset.id }}</td>
-                    <td>{{ dataset.name }}</td>
-                    <td>{{ dataset.fullname }}</td>
-                </tr>
-            {% endfor %}
-            </table>
         </form>
     </div>
 
+
+
 <!-- End of body -->
 
 {% endblock %}
@@ -47,33 +78,40 @@
 {% block js %}
     <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.js"></script>
     <script language="javascript" type="text/javascript" src="/static/new/packages/DataTables/js/jquery.dataTables.min.js"></script>
-    <script language="javascript" type="text/javascript" src="/static/packages/DT_bootstrap/DT_bootstrap.js"></script>
     <script language="javascript" type="text/javascript" src="/static/packages/TableTools/media/js/TableTools.min.js"></script>
     <script language="javascript" type="text/javascript" src="/static/packages/underscore/underscore-min.js"></script>
 
     <script type="text/javascript" charset="utf-8">
         $(document).ready( function () {
-            console.time("Creating table");
-            $('#dataset_list').dataTable( {
-                "sDom": "Tftipr",
-                "oTableTools": {
-                    "aButtons": [
-                        "copy",
-                        "print",
-                        {
-                            "sExtends":    "collection",
-                            "sButtonText": 'Save <span class="caret" />',
-                            "aButtons":    [ "csv", "xls", "pdf" ]
-                        }
-                    ],
-                    "sSwfPath": "/static/packages/TableTools/media/swf/copy_csv_xls_pdf.swf"
+            $('#admin_groups, #user_groups').dataTable( {
+                "drawCallback": function( settings ) {
+                     $('#admin_groups tr').click(function(event) {
+                         if (event.target.type !== 'checkbox') {
+                             $(':checkbox', this).trigger('click');
+                         }
+                     });
                 },
-                "iDisplayLength": 50,
-                "bLengthChange": true,
+                "columns": [
+                    { "type": "natural" },
+                    { "type": "natural" },
+                    { "type": "natural" },
+                    { "type": "natural" },
+                    { "type": "natural" },
+                    { "type": "natural" }
+                ],
+                "columnDefs": [ {
+                    "targets": 0,
+                    "orderable": false
+                } ],
+                "order": [[1, "asc" ]],
+                "sDom": "Ztr",
+                "iDisplayLength": -1,
+                "autoWidth": true,
                 "bDeferRender": true,
-                "bSortClasses": false
+                "bSortClasses": false,
+                "paging": false,
+                "orderClasses": true
             } );
-            console.timeEnd("Creating table");
         });
     </script>
 {% endblock %}