From 2ceaf7332e30fa099fea2c997c48e4882210d97d Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Fri, 12 Feb 2021 04:22:47 -0600
Subject: [PATCH 01/40] fixed overlay turn on on click submit

---
 app/static/scripts/function.js | 10 ++++++++--
 app/templates/auth/SignUp.html | 28 +++++++++++++++++++++++++---
 2 files changed, 33 insertions(+), 5 deletions(-)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index d3ee135..449331b 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -1,5 +1,11 @@
-function displayloading() {
-	$('#myModal').modal('show');
+function displayloading1() {
+        $('#myModal1').modal('show');
+        request_account()
+}
+
+function displayloading2() {
+        $('#myModal1').modal('hide');
+	$('#myModal2').modal('show');
 }
 
 function request_account() {
diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index 1ada7d2..049bfda 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -18,7 +18,7 @@
 
         socket.on( 'creating account', function( msg ) {
            document.getElementById("error").innerText = "";
-           displayloading();
+           displayloading2();
         });
 
         socket.on( 'account ready', function( msg ) {
@@ -26,6 +26,11 @@
           window.location.replace('{{ referrer }}');
         });
 
+        socket.on( 'account error', function( msg ) {
+          $('#myModal').modal('hide');
+          window.location.replace("www.google.com")
+         });
+
         socket.on( 'Account creation failed', function( msg ) {
           document.getElementById("error").innerText = "Registration Failed. Please try again.";
         });
@@ -107,7 +112,7 @@
             <textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea>
         </div>
 
-         <input class="btn btn-primary btn-block" id="submit" name="submit" type="button" value="Submit" onclick="request_account()">
+         <input class="btn btn-primary btn-block" id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()">
 
           <div>
             <strong id="error" style="color: #be051b; text-align: center;"></strong>
@@ -117,7 +122,24 @@
     </div>
     </div>
 
-    <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
+
+    <div class="modal fade" id="myModal1" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
+        <div class="modal-dialog modal-sm" role="document">
+            <div class="modal-content">
+                <div class="modal-header">
+                    <h4 class="modal-title" id="myModalLabel">Account Request Received!</h4>
+                </div>
+                <div class="modal-body">
+                    <span>Communicating this information to the server</span>
+                    <img src="{{ url_for('static', filename='img/loading.gif') }}" width="40px">
+                </div>
+            </div>
+        </div>
+    </div>
+
+
+
+    <div class="modal fade" id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
         <div class="modal-dialog modal-sm" role="document">
             <div class="modal-content">
                 <div class="modal-header">
-- 
GitLab


From 33535540ad040b7cc11eacbff916c892eea15677 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Fri, 26 Feb 2021 09:53:33 -0600
Subject: [PATCH 02/40] handle timeout on client end

---
 app/static/scripts/function.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index 449331b..5d02c7b 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -1,6 +1,8 @@
 function displayloading1() {
         $('#myModal1').modal('show');
         request_account()
+        setTimeout(function(){ x.value="20 seconds" }, 20000);
+        window.location.assign("www.google.com"); 
 }
 
 function displayloading2() {
-- 
GitLab


From 7843fd76df7d47a019815a1113ad4f8f15bfe233 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Fri, 26 Feb 2021 09:56:39 -0600
Subject: [PATCH 03/40] add error page

---
 app/__init__.py | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/app/__init__.py b/app/__init__.py
index 28010cd..b50f431 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -52,6 +52,10 @@ def create_app(config_name):
                                referrer=session['return_url'], cancel_url=vars.default_referrer)
 
 
+    @app.route('/error')
+    def error():
+        return 'ERROR: '
+
     # misc page error catching
     @app.errorhandler(403)
     def forbidden(error):
-- 
GitLab


From b43300f9e5ff138f243d2919dd6648746040d443 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Fri, 26 Feb 2021 09:59:13 -0600
Subject: [PATCH 04/40] add error page

---
 app/templates/errors/error.html | 55 +++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 app/templates/errors/error.html

diff --git a/app/templates/errors/error.html b/app/templates/errors/error.html
new file mode 100644
index 0000000..32933b0
--- /dev/null
+++ b/app/templates/errors/error.html
@@ -0,0 +1,55 @@
+<html class="gr__rc_uab_edu">
+<title>User Registration Error</title>
+<head>
+<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
+<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd" crossorigin="anonymous"></script>
+<script src="{{ url_for('static', filename='scripts/function.js') }}"></script>
+
+<script>
+
+
+</script>
+
+  <style type="text/css">
+    .important { color: #336699; }
+  </style>
+    <link rel="shortcut icon" type="image/x-icon" href="/public/favicon.ico">
+<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/application.css') }}">
+<link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/app2.css') }}">
+
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<style>
+.navbar-inverse {
+  background-color: rgb(0,99,65);
+}
+
+</style>
+</head>
+
+
+<body data-gr-c-s-loaded="true">
+
+
+<div class="container content" role="main" style="width: 625px">
+
+    <div style="position:relative;">
+  <img alt="logo" height="auto" width="100%" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/cheaha-logo-a605de0aecd3006b82a5ee30a6d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png') }}">
+  <a href="https://tinyurl.com/cheahaAL" target="_blank">
+    <div style="float:left;position:absolute;display:block;left:310px;top:-6px;padding:10px 20px;"> </div>
+  </a>
+</div>
+
+<footer>
+  <div class="container-fluid">
+    <div class="row">
+      <div class="col-md-6 col-sm-6">
+	    <a href="https://osc.github.io/Open-OnDemand/">
+	      <img class="footer-logo" alt="Powered by Open OnDemand" height="40" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/OpenOnDemand_powered_by_RGB-cb3aad5ff5350c7994f250fb334ddcc72e343233ce99eb71fda93beddd76a847.svg') }}">
+        </a>
+      </div>
+    </div>
+  </div><!-- /.container -->
+</footer>
+</body>
+</html>
-- 
GitLab


From 149f314b62b99aae3cb5a392f952bebd45a5662a Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Fri, 26 Feb 2021 10:01:13 -0600
Subject: [PATCH 05/40] fix overlay issue

---
 app/templates/auth/SignUp.html | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index 049bfda..f9c2350 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -22,13 +22,13 @@
         });
 
         socket.on( 'account ready', function( msg ) {
-          $('#myModal').modal('hide');
+          $('#myModal2').modal('hide');
           window.location.replace('{{ referrer }}');
         });
 
         socket.on( 'account error', function( msg ) {
-          $('#myModal').modal('hide');
-          window.location.replace("www.google.com")
+          $('#myModal2').modal('hide');
+          window.location.replace('{{ error_page }}');
          });
 
         socket.on( 'Account creation failed', function( msg ) {
-- 
GitLab


From 6afd388450400692422f1e445fcf7a75d4772a6d Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Mon, 1 Mar 2021 11:07:23 -0600
Subject: [PATCH 06/40] added registration failed page

---
 app/templates/errors/registration_failed.html | 5 +----
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/app/templates/errors/registration_failed.html b/app/templates/errors/registration_failed.html
index 8386d4b..8e50615 100644
--- a/app/templates/errors/registration_failed.html
+++ b/app/templates/errors/registration_failed.html
@@ -7,8 +7,5 @@
 <body>
 
     <h2>Something went right...</h2>
-    <p>
-       Redirecting back to sign-in page in 5 seconds.
-    </p>
 </body>
-</html>
\ No newline at end of file
+</html>
-- 
GitLab


From 2b20027dcd5ab1c1f6522e4b2a8c678aeab5e1b2 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Mon, 1 Mar 2021 11:08:57 -0600
Subject: [PATCH 07/40] timeout code

---
 tasks.py | 22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/tasks.py b/tasks.py
index fe371fb..b815bcd 100644
--- a/tasks.py
+++ b/tasks.py
@@ -3,6 +3,9 @@ import time
 from flask_socketio import SocketIO
 import subprocess
 import vars
+import sys
+
+sys.path.append('/cm/shared/rabbitmq_agents/')
 import rc_util
 
 from gevent import monkey
@@ -31,6 +34,19 @@ def celery_create_account(json, session):
     send_msg('creating account', room)
     print(username)
     rc_util.add_account(username, email, fullname, reason)
-    rc_util.consume(username)
-    print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tAccount successfully created for ' + username)
-    send_msg('account ready', room)
+    print('sent account info')
+
+#       rc_util.consume(username)
+#       print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tAccount successfully created for ' + username)
+#       send_msg('account ready', room)
+#    return 
+
+#rc_util.add_account(args.username, email=args.email, full=args.full_name, reason=args.reason)
+#print(f'Account for {args.username} requested.')
+
+# Set initial timeout timer
+    signal.signal(signal.SIGALRM, timeout_handler)
+    signal.setitimer(signal.ITIMER_REAL, timeout)
+
+    print('Waiting for completion...')
+    rc_util.consume(args.username, routing_key=f'complete.{args.username}', callback=callback) 
-- 
GitLab


From 7949b1be6d9bd5019a32ebba249f68a441b18910 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Mon, 1 Mar 2021 11:10:22 -0600
Subject: [PATCH 08/40] added overlay relace on sending account_create to
 celery

---
 app/static/scripts/function.js | 2 --
 1 file changed, 2 deletions(-)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index 5d02c7b..449331b 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -1,8 +1,6 @@
 function displayloading1() {
         $('#myModal1').modal('show');
         request_account()
-        setTimeout(function(){ x.value="20 seconds" }, 20000);
-        window.location.assign("www.google.com"); 
 }
 
 function displayloading2() {
-- 
GitLab


From b2cb60ed725724d444d8590f44f571ef6e23e76f Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Mon, 8 Mar 2021 14:50:41 -0600
Subject: [PATCH 09/40] Delete rabbit_config.py

---
 rabbit_config.py | 6 ------
 1 file changed, 6 deletions(-)
 delete mode 100644 rabbit_config.py

diff --git a/rabbit_config.py b/rabbit_config.py
deleted file mode 100644
index 70081fc..0000000
--- a/rabbit_config.py
+++ /dev/null
@@ -1,6 +0,0 @@
-Exchange = 'RegUsr'
-User = 'reggie'
-Password = 'reggie'
-VHost = '/'
-Server = 'ohpc'
-Port = 5672
-- 
GitLab


From 79c24e0e0387855bd4ea9201613ae594fe6e7085 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Mon, 8 Mar 2021 14:50:44 -0600
Subject: [PATCH 10/40] Delete rc_rmq.py

---
 rc_rmq.py | 116 ------------------------------------------------------
 1 file changed, 116 deletions(-)
 delete mode 100644 rc_rmq.py

diff --git a/rc_rmq.py b/rc_rmq.py
deleted file mode 100644
index 37afa3f..0000000
--- a/rc_rmq.py
+++ /dev/null
@@ -1,116 +0,0 @@
-import json
-import pika
-import socket
-import rabbit_config as rcfg
-
-class RCRMQ(object):
-
-    USER = 'guest'
-    PASSWORD = 'guest'
-    HOST = 'localhost'
-    PORT = 5672
-    VHOST = '/'
-    EXCHANGE = ''
-    EXCHANGE_TYPE = 'direct'
-    QUEUE = None
-    DURABLE = True
-    ROUTING_KEY = None
-    DEBUG = False
-
-    def __init__(self, config=None, debug=False):
-        if config:
-            if 'exchange' in config:
-                self.EXCHANGE = config['exchange']
-            if 'exchange_type' in config:
-                self.EXCHANGE_TYPE = config['exchange_type']
-
-        hostname = socket.gethostname().split(".", 1)[0]
-
-        self.HOST = rcfg.Server if hostname != rcfg.Server else "localhost"
-        self.USER = rcfg.User
-        self.PASSWORD = rcfg.Password
-        self.VHOST = rcfg.VHost
-        self.PORT = rcfg.Port
-        self.DEBUG = debug
-
-        if self.DEBUG:
-            print("""
-            Created RabbitMQ instance with:
-              Exchange name: {},
-              Exchange type: {},
-              Host: {},
-              User: {},
-              VHost: {},
-              Port: {}
-            """.format(self.EXCHANGE, self.EXCHANGE_TYPE, self.HOST, self.USER, self.VHOST, self.PORT))
-
-        self._consumer_tag = None
-        self._connection = None
-        self._consuming = False
-        self._channel = None
-        self._parameters = pika.ConnectionParameters(
-                self.HOST,
-                self.PORT,
-                self.VHOST,
-                pika.PlainCredentials(self.USER, self.PASSWORD))
-
-    def connect(self):
-        if self.DEBUG:
-            print("Connecting...\n" + "Exchange: " + self.EXCHANGE + " Exchange type: " + self.EXCHANGE_TYPE)
-
-        self._connection = pika.BlockingConnection(self._parameters)
-        self._channel = self._connection.channel()
-        self._channel.exchange_declare(
-                exchange=self.EXCHANGE,
-                exchange_type=self.EXCHANGE_TYPE,
-                durable=True)
-
-    def bind_queue(self):
-        self._channel.queue_declare(queue=self.QUEUE, durable=self.DURABLE)
-        self._channel.queue_bind(exchange=self.EXCHANGE,
-                queue=self.QUEUE,
-                routing_key=self.ROUTING_KEY)
-
-    def disconnect(self):
-        self._channel.close()
-        self._connection.close()
-        self._connection = None
-
-    def delete_queue(self):
-        self._channel.queue_delete(self.QUEUE)
-
-    def publish_msg(self, obj):
-        if 'routing_key' in obj:
-            self.ROUTING_KEY = obj['routing_key']
-
-        if self._connection is None:
-            self.connect()
-
-        self._channel.basic_publish(exchange=self.EXCHANGE,
-                routing_key=self.ROUTING_KEY,
-                body=json.dumps(obj['msg']))
-
-    def start_consume(self, obj):
-        if 'queue' in obj:
-            self.QUEUE = obj['queue']
-            self.ROUTING_KEY = obj['routing_key'] if 'routing_key' in obj else self.QUEUE
-        if 'durable' in obj:
-            self.DURABLE = obj['durable']
-
-        if self.DEBUG:
-            print("Queue: " + self.QUEUE + "\nRouting_key: " + self.ROUTING_KEY)
-
-        if self._connection is None:
-            self.connect()
-
-        self.bind_queue()
-
-        self._consumer_tag = self._channel.basic_consume(self.QUEUE,obj['cb'])
-        self._consuming = True
-        try:
-            self._channel.start_consuming()
-        except KeyboardInterrupt:
-            self._channel.stop_consuming()
-
-    def stop_consume(self):
-        self._channel.basic_cancel(self._consumer_tag)
-- 
GitLab


From 3e61295a26daf053a0ee8140468000b0591beb47 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Mon, 8 Mar 2021 14:50:47 -0600
Subject: [PATCH 11/40] Delete rc_util.py

---
 rc_util.py | 72 ------------------------------------------------------
 1 file changed, 72 deletions(-)
 delete mode 100644 rc_util.py

diff --git a/rc_util.py b/rc_util.py
deleted file mode 100644
index 0e7c4c1..0000000
--- a/rc_util.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import logging
-import argparse
-from rc_rmq import RCRMQ
-import json
-
-rc_rmq = RCRMQ({'exchange': 'RegUsr', 'exchange_type': 'topic'})
-tasks = {'ohpc_account': None, 'ood_account': None, 'slurm_account': None}
-logger_fmt = '%(asctime)s [%(module)s] - %(message)s'
-
-def add_account(username, email, full='', reason=''):
-  rc_rmq.publish_msg({
-    'routing_key': 'request.' + username,
-    'msg': {
-      "username": username,
-      "email": email,
-      "fullname": full,
-      "reason": reason
-    }
-  })
-  rc_rmq.disconnect()
-
-def worker(ch, method, properties, body):
-    msg = json.loads(body)
-    task = msg['task']
-    tasks[task] = msg['success']
-    print("Got msg: {}({})".format(msg['task'], msg['success']))
-
-    # Check if all tasks are done
-    done = True
-    for key, status in tasks.items():
-        if not status:
-            print("{} is not done yet.".format(key))
-            done = False
-    if done:
-        rc_rmq.stop_consume()
-        rc_rmq.delete_queue()
-
-def consume(username, callback=worker, debug=False):
-    if debug:
-        sleep(5)
-    else:
-        rc_rmq.start_consume({
-            'queue': username,
-            'routing_key': 'confirm.' + username,
-            'cb': callback
-        })
-        rc_rmq.disconnect()
-
-    return { 'success' : True }
-
-def get_args():
-    # Parse arguments
-    parser = argparse.ArgumentParser()
-    parser.add_argument('-v', '--verbose', action='store_true', help='verbose output')
-    parser.add_argument('-n', '--dry-run', action='store_true', help='enable dry run mode')
-    return parser.parse_args()
-
-def get_logger(args=None):
-    if args is None:
-        args = get_args()
-
-    logger_lvl = logging.WARNING
-
-    if args.verbose:
-        logger_lvl = logging.DEBUG
-
-    if args.dry_run:
-        logger_lvl = logging.INFO
-
-    logging.basicConfig(format=logger_fmt, level=logger_lvl)
-    return logging.getLogger(__name__)
-
-- 
GitLab


From 58653950d0fe51cde342076a4a07409d89271d07 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Tue, 9 Mar 2021 16:30:06 -0600
Subject: [PATCH 12/40] WIP:added callback function

---
 tasks.py | 18 ++++--------------
 1 file changed, 4 insertions(+), 14 deletions(-)

diff --git a/tasks.py b/tasks.py
index b815bcd..2a1ccc6 100644
--- a/tasks.py
+++ b/tasks.py
@@ -16,6 +16,9 @@ celery = Celery('flask_user_reg', broker=broker_url)
 
 socketio = SocketIO(message_queue=vars.message_queue)
 
+def callback():
+    rc_util.rc_rmq.stop_consume()
+    rc_util.rc_rmq.delete_queue()
 
 def send_msg(event, room):
    print("Post '{}' to room '{}'".format(event,room))
@@ -35,18 +38,5 @@ def celery_create_account(json, session):
     print(username)
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
-
-#       rc_util.consume(username)
-#       print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tAccount successfully created for ' + username)
-#       send_msg('account ready', room)
-#    return 
-
-#rc_util.add_account(args.username, email=args.email, full=args.full_name, reason=args.reason)
-#print(f'Account for {args.username} requested.')
-
-# Set initial timeout timer
-    signal.signal(signal.SIGALRM, timeout_handler)
-    signal.setitimer(signal.ITIMER_REAL, timeout)
-
     print('Waiting for completion...')
-    rc_util.consume(args.username, routing_key=f'complete.{args.username}', callback=callback) 
+    rc_util.consume(username, routing_key=f'complete.{username}', callback=callback) 
-- 
GitLab


From c95fc66707fb7b95ef41d247025a5d8d77221520 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Tue, 9 Mar 2021 16:32:40 -0600
Subject: [PATCH 13/40] changed variable names to match naming convention of
 REMOTE_USER

---
 vars.py | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/vars.py b/vars.py
index 4124988..a45bbfe 100644
--- a/vars.py
+++ b/vars.py
@@ -1,9 +1,9 @@
-id = ''
-password = '' 
-key = ''
-broker_url =  'amqp://' + id + ':' + password + '@ohpc:5672/'
+id = 'reggie'
+password = 'reggie' 
+key = '1234'
+broker_url =  'amqp://' + id + ':' + password + '@master:5672/'
 message_queue =  broker_url + 'socketio'
 default_referrer = "/pun/sys/dashboard"
 username_key = ["REMOTE_USER"]
-fullname_key = ["HTTP_DISPLAYNAME"]
-email_key = ["HTTP_MAIL"] 
+fullname_key = ["REMOTE_USER_DISPLAYNAME"]
+email_key = ["REMOTE_USER_MAIL"] 
-- 
GitLab


From ff4505b0d539883e8a3223b3c4a053095abf54b5 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Wed, 10 Mar 2021 01:32:20 -0600
Subject: [PATCH 14/40] added callback function with error print to command
 line

---
 tasks.py | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/tasks.py b/tasks.py
index 2a1ccc6..d9b1bb3 100644
--- a/tasks.py
+++ b/tasks.py
@@ -4,6 +4,7 @@ from flask_socketio import SocketIO
 import subprocess
 import vars
 import sys
+import json
 
 sys.path.append('/cm/shared/rabbitmq_agents/')
 import rc_util
@@ -16,7 +17,18 @@ celery = Celery('flask_user_reg', broker=broker_url)
 
 socketio = SocketIO(message_queue=vars.message_queue)
 
-def callback():
+def callback(channel, method, properties, body):
+    msg = json.loads(body)
+    username = msg['username']
+
+    if msg['success']:
+        print(f'Account for {username} has been created.')
+    else:
+        print(f"There's some issue while creating account for {username}")
+        errmsg = msg.get('errmsg', [])
+        for err in errmsg:
+            print(err)
+
     rc_util.rc_rmq.stop_consume()
     rc_util.rc_rmq.delete_queue()
 
@@ -39,4 +51,5 @@ def celery_create_account(json, session):
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
     print('Waiting for completion...')
-    rc_util.consume(username, routing_key=f'complete.{username}', callback=callback) 
+    rc_util.consume(username, routing_key=f'complete.{username}', callback=callback)
+    send_msg('account ready', room) 
-- 
GitLab


From b84cd7e28e7a5c66eda21c539fc15efdcaa01c24 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Thu, 11 Mar 2021 01:30:10 -0600
Subject: [PATCH 15/40] code cleanup- removed unused imports and rearranged
 import statements to match convention

---
 tasks.py | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/tasks.py b/tasks.py
index d9b1bb3..d96da27 100644
--- a/tasks.py
+++ b/tasks.py
@@ -1,17 +1,14 @@
-from celery import Celery
-import time
-from flask_socketio import SocketIO
-import subprocess
 import vars
 import sys
 import json
+import time
+
+from celery import Celery
+from flask_socketio import SocketIO
 
 sys.path.append('/cm/shared/rabbitmq_agents/')
 import rc_util
 
-from gevent import monkey
-monkey.patch_all(subprocess=True)
-
 broker_url = vars.broker_url
 celery = Celery('flask_user_reg', broker=broker_url)
 
-- 
GitLab


From a7358eec02cf896c29bb3bce883d7088897952d3 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Thu, 11 Mar 2021 02:07:29 -0600
Subject: [PATCH 16/40] added timeout function

---
 tasks.py | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/tasks.py b/tasks.py
index d96da27..6001440 100644
--- a/tasks.py
+++ b/tasks.py
@@ -2,6 +2,7 @@ import vars
 import sys
 import json
 import time
+import signal
 
 from celery import Celery
 from flask_socketio import SocketIO
@@ -13,6 +14,7 @@ broker_url = vars.broker_url
 celery = Celery('flask_user_reg', broker=broker_url)
 
 socketio = SocketIO(message_queue=vars.message_queue)
+timeout = 60
 
 def callback(channel, method, properties, body):
     msg = json.loads(body)
@@ -33,6 +35,9 @@ def send_msg(event, room):
    print("Post '{}' to room '{}'".format(event,room))
    socketio.emit(event, room=room)
 
+def timeout_handler(signum, frame):
+    print("Process timeout, there's might some issue with agents")
+    rc_util.rc_rmq.stop_consume()
 
 @celery.task
 def celery_create_account(json, session):
@@ -47,6 +52,12 @@ def celery_create_account(json, session):
     print(username)
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
+    
+    # Set initial timeout timer
+    signal.signal(signal.SIGALRM, timeout_handler)
+    signal.setitimer(signal.ITIMER_REAL, timeout)
+
+
     print('Waiting for completion...')
     rc_util.consume(username, routing_key=f'complete.{username}', callback=callback)
     send_msg('account ready', room) 
-- 
GitLab


From 431f54d542fd6b7d4f56cb69f927152ccd5f9c25 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Thu, 11 Mar 2021 16:21:01 -0600
Subject: [PATCH 17/40] Added factory function/wrapper function around callback
 to be able to send message via room Changed account error message from
 send_msg to use socket.emit and send the error message to the UI Removed
 account timeout while testing, to ensure error's caused are only due to
 rabbitmq account create error and not timeout from client to server

---
 tasks.py | 44 ++++++++++++++++++++++----------------------
 1 file changed, 22 insertions(+), 22 deletions(-)

diff --git a/tasks.py b/tasks.py
index 6001440..6b5973a 100644
--- a/tasks.py
+++ b/tasks.py
@@ -16,24 +16,27 @@ celery = Celery('flask_user_reg', broker=broker_url)
 socketio = SocketIO(message_queue=vars.message_queue)
 timeout = 60
 
-def callback(channel, method, properties, body):
-    msg = json.loads(body)
-    username = msg['username']
-
-    if msg['success']:
-        print(f'Account for {username} has been created.')
-    else:
-        print(f"There's some issue while creating account for {username}")
-        errmsg = msg.get('errmsg', [])
-        for err in errmsg:
-            print(err)
-
-    rc_util.rc_rmq.stop_consume()
-    rc_util.rc_rmq.delete_queue()
+def gen_f(room):
+    def callback(channel, method, properties, body):
+        msg = json.loads(body)
+        username = msg['username']
+
+        if msg['success']:
+            print(f'Account for {username} has been created.')
+            send_msg('account ready', room)
+        else:
+            print(f"There's some issue while creating account for {username}")
+            errmsg = msg.get('errmsg', [])
+            for err in errmsg:
+                print(err)
+            socketio.emit('account error', errmsg, room= room)
+
+        rc_util.rc_rmq.stop_consume()
+        rc_util.rc_rmq.delete_queue()
+    return callback
 
 def send_msg(event, room):
-   print("Post '{}' to room '{}'".format(event,room))
-   socketio.emit(event, room=room)
+    socketio.emit(event, room=room)
 
 def timeout_handler(signum, frame):
     print("Process timeout, there's might some issue with agents")
@@ -53,11 +56,8 @@ def celery_create_account(json, session):
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
     
-    # Set initial timeout timer
-    signal.signal(signal.SIGALRM, timeout_handler)
-    signal.setitimer(signal.ITIMER_REAL, timeout)
-
 
     print('Waiting for completion...')
-    rc_util.consume(username, routing_key=f'complete.{username}', callback=callback)
-    send_msg('account ready', room) 
+    #print(callback(self.EXCHANGE, self.EXCHANGE,self.EXCHANGE,self.EXCHANGE))
+    rc_util.consume(username, routing_key=f'complete.{username}', callback=gen_f(room))    
+    #send_msg('account ready', room) 
-- 
GitLab


From 2e1b4ac335162ff17f237e2ce23eb257349a4b58 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Thu, 11 Mar 2021 16:25:02 -0600
Subject: [PATCH 18/40] added app route error page

---
 app/__init__.py | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/app/__init__.py b/app/__init__.py
index b50f431..cf68fb1 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -56,6 +56,11 @@ def create_app(config_name):
     def error():
         return 'ERROR: '
 
+    @app.route('/error_account')
+    def error_account_create():    
+        return render_template('errors/error.html', title='account creation failed')
+
+
     # misc page error catching
     @app.errorhandler(403)
     def forbidden(error):
-- 
GitLab


From fefcf1a8958eef635dd390d084a1a91c184a2f66 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Thu, 11 Mar 2021 16:52:52 -0600
Subject: [PATCH 19/40] redir to error.html page on receiving socket account
 error

---
 app/templates/auth/SignUp.html | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index f9c2350..d67308b 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -27,12 +27,9 @@
         });
 
         socket.on( 'account error', function( msg ) {
-          $('#myModal2').modal('hide');
-          window.location.replace('{{ error_page }}');
-         });
-
-        socket.on( 'Account creation failed', function( msg ) {
-          document.getElementById("error").innerText = "Registration Failed. Please try again.";
+          console.log(msg);
+          $('#myModal2').modal('hide'); 
+          window.location.replace('/register/error_account');
         });
 
     });
-- 
GitLab


From 35edb35d92c3d1405612e875de314360f4608f71 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Fri, 2 Apr 2021 09:19:37 -0500
Subject: [PATCH 20/40] replaced logo with new logo

---
 ...d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png | Bin 10581 -> 18903 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/app/static/img/cheaha-logo-a605de0aecd3006b82a5ee30a6d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png b/app/static/img/cheaha-logo-a605de0aecd3006b82a5ee30a6d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png
index 3472668aa4cf3857431874b1bc6f10f18ad1e107..e0211007879fc0bf2619ac1c50f8a15033431f73 100644
GIT binary patch
literal 18903
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

delta 10394
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
DZFR&h

-- 
GitLab


From 07f5591a546ac4a881d53720dfae48e30f52d404 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Fri, 2 Apr 2021 09:23:48 -0500
Subject: [PATCH 21/40] replaced logo with new logo

---
 ...d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png | Bin 18903 -> 5968 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/app/static/img/cheaha-logo-a605de0aecd3006b82a5ee30a6d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png b/app/static/img/cheaha-logo-a605de0aecd3006b82a5ee30a6d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png
index e0211007879fc0bf2619ac1c50f8a15033431f73..884b448de16d2ad760f2d440ad86020d2a0df3eb 100644
GIT binary patch
literal 5968
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

literal 18903
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

-- 
GitLab


From 6fddb9ded4800abd01ef3ffb165bf0bdabf470fe Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Fri, 2 Apr 2021 09:25:17 -0500
Subject: [PATCH 22/40] added timeout function on client end

---
 tasks.py | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/tasks.py b/tasks.py
index 6b5973a..b28dbbb 100644
--- a/tasks.py
+++ b/tasks.py
@@ -14,7 +14,7 @@ broker_url = vars.broker_url
 celery = Celery('flask_user_reg', broker=broker_url)
 
 socketio = SocketIO(message_queue=vars.message_queue)
-timeout = 60
+timeout = 30
 
 def gen_f(room):
     def callback(channel, method, properties, body):
@@ -40,7 +40,9 @@ def send_msg(event, room):
 
 def timeout_handler(signum, frame):
     print("Process timeout, there's might some issue with agents")
+    socketio.emit('account error', errmsg, room= room)
     rc_util.rc_rmq.stop_consume()
+    rc_util.rc_rmq.delete_queue()
 
 @celery.task
 def celery_create_account(json, session):
@@ -52,11 +54,11 @@ def celery_create_account(json, session):
 
     print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue')
     send_msg('creating account', room)
+    signal.signal(signal.SIGALRM, timeout_handler)
+    signal.setitimer(signal.ITIMER_REAL, timeout)
     print(username)
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
-    
-
     print('Waiting for completion...')
     #print(callback(self.EXCHANGE, self.EXCHANGE,self.EXCHANGE,self.EXCHANGE))
     rc_util.consume(username, routing_key=f'complete.{username}', callback=gen_f(room))    
-- 
GitLab


From c3a3ce144a570f6108182d38b8e9e7d9c7a00ac7 Mon Sep 17 00:00:00 2001
From: Krish Moodbidri <krish94@uab.edu>
Date: Tue, 6 Apr 2021 06:48:44 -0500
Subject: [PATCH 23/40] cheaha logo svg format

---
 logo_svg.svg | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 logo_svg.svg

diff --git a/logo_svg.svg b/logo_svg.svg
new file mode 100644
index 0000000..88508a1
--- /dev/null
+++ b/logo_svg.svg
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 157"><title>Supercomputer-logo</title><image width="300" height="157" xlink:href="data:image/png;base64,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"/></svg>
\ No newline at end of file
-- 
GitLab


From 1a4daf1e9b83fba51f531d65f9c3f79574684563 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Tue, 6 Apr 2021 06:50:59 -0500
Subject: [PATCH 24/40] changed RC to UAB RC header

---
 app/templates/auth/SignUp.html | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index d67308b..fb9ba86 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -58,7 +58,7 @@
     <div class="container-fluid">
       <div class="navbar-header">
 	<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-9" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button>
-	<a class="navbar-brand" href="/">Research Computing</a>
+	<a class="navbar-brand" href="/"> UAB Research Computing</a>
       </div>
       <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-9">
 	<ul class="nav navbar-nav">
@@ -89,7 +89,7 @@
 <!--   <h2>Hello, <span id="username">{{ user }}</span>!</h2> -->
 
     <h2>Hi, </h2>
-    <div id="user-input">
+    <p> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. Please fill in all the details as this helps us understand our user base. Contact support@listserv.uab.edu for any assistance in creating your account.  </p>    <div id="user-input">
     
     <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
       <div class="form-group">
@@ -109,8 +109,8 @@
             <textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea>
         </div>
 
-         <input class="btn btn-primary btn-block" id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()">
-
+         <input class="btn btn-primary btn-block" id="cancel" name="cancel" type="button" value="Cancel" onclick="location.href = 'https://docs.uabgrid.uab.edu/wiki/cheaha'">
+          <input class="btn btn-primary btn-block" id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()">
           <div>
             <strong id="error" style="color: #be051b; text-align: center;"></strong>
         </div>
-- 
GitLab


From fd371ca936f8d52c31b270ba40889ed9a7e65bf5 Mon Sep 17 00:00:00 2001
From: root <root@login001.cm.cluster>
Date: Wed, 7 Apr 2021 05:20:56 -0500
Subject: [PATCH 25/40] added cheaha new logo and resized it to relative 15%

---
 app/static/img/logo_svg.svg    | 1 +
 app/templates/auth/SignUp.html | 4 ++--
 2 files changed, 3 insertions(+), 2 deletions(-)
 create mode 100644 app/static/img/logo_svg.svg

diff --git a/app/static/img/logo_svg.svg b/app/static/img/logo_svg.svg
new file mode 100644
index 0000000..88508a1
--- /dev/null
+++ b/app/static/img/logo_svg.svg
@@ -0,0 +1 @@
+<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 300 157"><title>Supercomputer-logo</title><image width="300" height="157" xlink:href="data:image/png;base64,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"/></svg>
\ No newline at end of file
diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index fb9ba86..eec858c 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -77,10 +77,10 @@
     </div>
   </nav>
 </header>
-<div class="container content" role="main" style="width: 625px">
+<div class="container content" role="main" style="width: 85%">
 
     <div style="position:relative;">
-  <img alt="logo" height="auto" width="100%" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/cheaha-logo-a605de0aecd3006b82a5ee30a6d0cb8cd9bf8b7e836296cc293eac746a4c2b11.png') }}">
+  <img alt="logo" height="auto" width="15%" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/logo_svg.svg') }}">
   <a href="https://tinyurl.com/cheahaAL" target="_blank">
     <div style="float:left;position:absolute;display:block;left:310px;top:-6px;padding:10px 20px;"> </div>
   </a>
-- 
GitLab


From 8c81a52ec19caefea8593b33902440199ef612b3 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 9 Apr 2021 08:03:27 -0500
Subject: [PATCH 26/40] changed button color

---
 app/templates/auth/SignUp.html | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index eec858c..f53ef88 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -46,6 +46,9 @@
 <style>
 .navbar-inverse {
   background-color: rgb(0,99,65);
+
+button{
+  margin: 13px;
 }
 
 </style>
@@ -109,11 +112,11 @@
             <textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea>
         </div>
 
-         <input class="btn btn-primary btn-block" id="cancel" name="cancel" type="button" value="Cancel" onclick="location.href = 'https://docs.uabgrid.uab.edu/wiki/cheaha'">
-          <input class="btn btn-primary btn-block" id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()">
-          <div>
-            <strong id="error" style="color: #be051b; text-align: center;"></strong>
-        </div>
+
+<div class="row">
+        <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="location.href='https://docs.uabgrid.uab.edu/wiki/cheaha'">Cancel</button>
+        <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()"> Create Account</button>
+</div>
 
     </form>
     </div>
-- 
GitLab


From 511f71e71fd6cbd1de36974582ac9a543d54fef9 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 9 Apr 2021 08:14:31 -0500
Subject: [PATCH 27/40] reduced input field size for user input values

---
 app/templates/auth/SignUp.html | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index f53ef88..4cb6742 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -95,29 +95,28 @@ button{
     <p> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. Please fill in all the details as this helps us understand our user base. Contact support@listserv.uab.edu for any assistance in creating your account.  </p>    <div id="user-input">
     
     <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
-      <div class="form-group">
+       <div class="col-md-7 col-sm-7 my-col">
           <label for="username" class="control-label">Blazer Id:</label>&#9;<input id="username" class="form-control"
                                                              placeholder="Enter Username" required><br>
       </div>
-        <div class="form-group">
+         <div class="col-md-7 col-sm-7 my-col">
           <label for="fullname" class="control-label">Full Name:</label>&#9;<input id="fullname" class="form-control"
                                                              placeholder="Enter Full Name" required><br>
         </div>
-        <div class="form-group">
+         <div class="col-md-7 col-sm-7 my-col">
           <label for="email" class="control-label">Email:</label>&#9;<input id="email" class="form-control"
                                                       placeholder="Enter Email" required><br>
         </div>
-        <div class="form-group">
+         <div class="col-md-7 col-sm-7 my-col">
           <label for="reason" class="control-label">Reason for Requesting Account:</label><br>
             <textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea>
         </div>
 
-
-<div class="row">
+<br>
+ <div class="col-md-7 col-sm-7 my-col">
         <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="location.href='https://docs.uabgrid.uab.edu/wiki/cheaha'">Cancel</button>
         <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()"> Create Account</button>
 </div>
-
     </form>
     </div>
     </div>
-- 
GitLab


From 8cd2e49032c5203ea8d38bf95bc01302e43af76e Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 9 Apr 2021 09:30:59 -0500
Subject: [PATCH 28/40] added margin space for buttons

---
 app/templates/auth/SignUp.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index 4cb6742..1b6d9a2 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -46,7 +46,7 @@
 <style>
 .navbar-inverse {
   background-color: rgb(0,99,65);
-
+}
 button{
   margin: 13px;
 }
-- 
GitLab


From 8199916a5d261872e88c31fde526b48534853e36 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 9 Apr 2021 09:59:36 -0500
Subject: [PATCH 29/40] removed unwanted code

---
 app/templates/auth/SignUp.html | 1 -
 1 file changed, 1 deletion(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index 1b6d9a2..23806e3 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -17,7 +17,6 @@
         });
 
         socket.on( 'creating account', function( msg ) {
-           document.getElementById("error").innerText = "";
            displayloading2();
         });
 
-- 
GitLab


From 37d6036394d88c3e805e80755a816e14b286aa1c Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Thu, 22 Apr 2021 05:03:28 -0500
Subject: [PATCH 30/40] removed sigalarm code

---
 tasks.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/tasks.py b/tasks.py
index b28dbbb..e714a9b 100644
--- a/tasks.py
+++ b/tasks.py
@@ -54,8 +54,6 @@ def celery_create_account(json, session):
 
     print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue')
     send_msg('creating account', room)
-    signal.signal(signal.SIGALRM, timeout_handler)
-    signal.setitimer(signal.ITIMER_REAL, timeout)
     print(username)
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
-- 
GitLab


From 86ab9dca7f3e51206f99ecd60a01816e09dccb4f Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Thu, 22 Apr 2021 05:08:49 -0500
Subject: [PATCH 31/40] added linting and added code to re-render the web-page

---
 app/static/scripts/function.js | 45 ++++++++++++++++++++--------------
 1 file changed, 27 insertions(+), 18 deletions(-)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index 449331b..b69f782 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -21,23 +21,32 @@ function refresh() {
     document.location.reload(true);
 }
 
+function myFunction(msg) {
+    document.getElementById("form-wrapper").innerHTML = "<br> <h1> <strong>Error!</strong> A problem occurred while creating your account </h1> <h3> contact <a href = 'mailto: krish94@hotmail.com'>Research Computing team</a> to report this  </h3>" 
+    document.getElementById("form-wrapper").innerHTML += msg;
+}
+function myFunction1() {
+    var myobj = document.getElementById("demo");
+    myobj.remove();
+    document.getElementById('form-wrapper').innerHTML = "<br> <h1> <strong>Account create cancelled</strong> Close the browser tab to end this session </h1> <h3> contact <a href = 'mailto: krish94@hotmail.com'>Research Computing team</a> for any questions</h3>"}
+
 function autofill_form(username, fullname, email) {
-        let username_input = document.getElementById("username");
-        let fullname_input = document.getElementById("fullname");
-        let email_input = document.getElementById("email");
-
-        if ((username.localeCompare("None")) !== 0) {
-            username_input.value = username;
-            username_input.disabled = "true";
-        }
-
-        if ((fullname.localeCompare("None")) !== 0) {
-            fullname_input.value = fullname;
-            fullname_input.disabled = "true";
-        }
-
-        if ((email.localeCompare("None")) !== 0) {
-            email_input.value = email;
-            email_input.disabled = "true";
-        }
+    let username_input = document.getElementById("username");
+    let fullname_input = document.getElementById("fullname");
+    let email_input = document.getElementById("email");
+
+    if ((username.localeCompare("None")) !== 0) {
+        username_input.value = username;
+        username_input.disabled = "true";
+    }
+
+    if ((fullname.localeCompare("None")) !== 0) {
+        fullname_input.value = fullname;
+        fullname_input.disabled = "true";
+     }
+
+     if ((email.localeCompare("None")) !== 0) {
+         email_input.value = email;
+         email_input.disabled = "true";
+     }
 }
-- 
GitLab


From 7cf1035844c602a1270a122ab95b73d5304671b7 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Thu, 22 Apr 2021 07:48:29 -0500
Subject: [PATCH 32/40] added linting and removed unused code

---
 app/static/scripts/function.js |  20 ++--
 app/templates/auth/SignUp.html | 172 +++++++++++++++------------------
 2 files changed, 85 insertions(+), 107 deletions(-)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index b69f782..74d9b15 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -1,10 +1,9 @@
 function displayloading1() {
-        $('#myModal1').modal('show');
-        request_account()
+        $('#overlayModal').modal('show');
 }
 
 function displayloading2() {
-        $('#myModal1').modal('hide');
+        $('#overlayModal').modal('hide');
 	$('#myModal2').modal('show');
 }
 
@@ -17,19 +16,12 @@ function request_account() {
     })
 }
 
-function refresh() {
-    document.location.reload(true);
+function renderDom(title, message, error_msg) {
+    document.getElementById("form-wrapper").innerHTML = "<h2>" + title + "<br>";
+    document.getElementById("form-wrapper").innerHTML += "<h3>" + message + "<br>"; 
+    document.getElementById("form-wrapper").innerHTML += "<p>" + error_msg;
 }
 
-function myFunction(msg) {
-    document.getElementById("form-wrapper").innerHTML = "<br> <h1> <strong>Error!</strong> A problem occurred while creating your account </h1> <h3> contact <a href = 'mailto: krish94@hotmail.com'>Research Computing team</a> to report this  </h3>" 
-    document.getElementById("form-wrapper").innerHTML += msg;
-}
-function myFunction1() {
-    var myobj = document.getElementById("demo");
-    myobj.remove();
-    document.getElementById('form-wrapper').innerHTML = "<br> <h1> <strong>Account create cancelled</strong> Close the browser tab to end this session </h1> <h3> contact <a href = 'mailto: krish94@hotmail.com'>Research Computing team</a> for any questions</h3>"}
-
 function autofill_form(username, fullname, email) {
     let username_input = document.getElementById("username");
     let fullname_input = document.getElementById("fullname");
diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index 23806e3..74b88dd 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -28,29 +28,23 @@
         socket.on( 'account error', function( msg ) {
           console.log(msg);
           $('#myModal2').modal('hide'); 
-          window.location.replace('/register/error_account');
+          renderDom("Account create error", "contact rc team", msg);
         });
 
     });
 </script>
 
-  <style type="text/css">
-    .important { color: #336699; }
-  </style>
-    <link rel="shortcut icon" type="image/x-icon" href="/public/favicon.ico">
+<link rel="shortcut icon" type="image/x-icon" href="/public/favicon.ico">
 <link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/application.css') }}">
 <link rel="stylesheet" media="all" href="{{ url_for('static', filename='style/app2.css') }}">
 
 <meta name="viewport" content="width=device-width, initial-scale=1">
 <style>
-.navbar-inverse {
-  background-color: rgb(0,99,65);
-}
-button{
-  margin: 13px;
-}
-
+  .navbar-inverse { background-color: rgb(0,99,65); }
+  button{ margin: 13px;
+  .important { color: #336699; }}
 </style>
+
 </head>
 
 
@@ -59,107 +53,99 @@ button{
   <nav class="navbar navbar-inverse navbar-static-top">
     <div class="container-fluid">
       <div class="navbar-header">
-	<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-9" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button>
-	<a class="navbar-brand" href="/"> UAB Research Computing</a>
+        <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-9" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button>
+        <a class="navbar-brand" href="/"> UAB Research Computing</a>
       </div>
       <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-9">
-	<ul class="nav navbar-nav">
-
-	</ul>
-	<div class="navbar-right">
-	  <ul class="nav navbar-nav">
-	    <li>
-	    <a target="_blank" href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted">
-	      <i class="fas fa-info-circle fa-fw"></i> Online Documentation
-	    </a></li>
-	    <li>
-	  </li></ul>
-	</div>
+        <div class="navbar-right">
+          <ul class="nav navbar-nav">
+          <li>
+            <a target="_blank" href="https://docs.uabgrid.uab.edu/wiki/Cheaha_GettingStarted">
+              <i class="fas fa-info-circle fa-fw"></i> Online Documentation
+            </a>
+          </li>
+          </ul>
+        </div>
       </div>
     </div>
   </nav>
 </header>
-<div class="container content" role="main" style="width: 85%">
 
-    <div style="position:relative;">
-  <img alt="logo" height="auto" width="15%" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/logo_svg.svg') }}">
-  <a href="https://tinyurl.com/cheahaAL" target="_blank">
-    <div style="float:left;position:absolute;display:block;left:310px;top:-6px;padding:10px 20px;"> </div>
-  </a>
-</div>
-
-<!--   <h2>Hello, <span id="username">{{ user }}</span>!</h2> -->
-
-    <h2>Hi, </h2>
-    <p> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. Please fill in all the details as this helps us understand our user base. Contact support@listserv.uab.edu for any assistance in creating your account.  </p>    <div id="user-input">
-    
-    <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
-       <div class="col-md-7 col-sm-7 my-col">
-          <label for="username" class="control-label">Blazer Id:</label>&#9;<input id="username" class="form-control"
-                                                             placeholder="Enter Username" required><br>
-      </div>
-         <div class="col-md-7 col-sm-7 my-col">
-          <label for="fullname" class="control-label">Full Name:</label>&#9;<input id="fullname" class="form-control"
-                                                             placeholder="Enter Full Name" required><br>
-        </div>
-         <div class="col-md-7 col-sm-7 my-col">
-          <label for="email" class="control-label">Email:</label>&#9;<input id="email" class="form-control"
-                                                      placeholder="Enter Email" required><br>
-        </div>
-         <div class="col-md-7 col-sm-7 my-col">
-          <label for="reason" class="control-label">Reason for Requesting Account:</label><br>
+<div class="container content" role="main" style="width: 100%">
+  <div class="col-md-2 col-sm-2 my-col">
+    <img alt="logo" height="auto" width="80%"  src="{{ url_for('static', filename='img/logo_svg.svg') }}">
+    <a href="https://tinyurl.com/cheahaAL" target="_blank"></a>
+  </div>
+
+  <div class="col-md-10 col-sm-10 my-col">
+    <div id="form-wrapper">
+    <h2> Self Registration form </h2>
+      <p> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. <br>Please fill in all the details as this helps us understand our user base. <br>Contact support@listserv.uab.edu for any assistance in creating your account.</p>    
+      <div id="user-input">    
+        <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
+          <div class="col-md-7 col-sm-7 my-col">
+            <label for="username" class="control-label">Blazer Id:</label>&#9;<input id="username" class="form-control" placeholder="Enter Username" required><br>
+          </div>
+          <div class="col-md-7 col-sm-7 my-col">
+            <label for="fullname" class="control-label">Full Name:</label>&#9;<input id="fullname" class="form-control" placeholder="Enter Full Name" required><br>
+          </div>
+          <div class="col-md-7 col-sm-7 my-col">
+            <label for="email" class="control-label">Email:</label>&#9;<input id="email" class="form-control" placeholder="Enter Email" required><br>
+          </div>
+          <div class="col-md-7 col-sm-7 my-col">
+            <label for="reason" class="control-label">Reason for Requesting Account:</label><br>
             <textarea class="form-control" id="reason" name="reason" placeholder="Enter Reason for Account Request" required></textarea>
-        </div>
-
-<br>
- <div class="col-md-7 col-sm-7 my-col">
-        <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="location.href='https://docs.uabgrid.uab.edu/wiki/cheaha'">Cancel</button>
-        <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1()"> Create Account</button>
-</div>
-    </form>
+          </div>
+          <br>
+          <div class="col-md-7 col-sm-7 my-col">
+            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account cancel','close browser', '')">Cancel</button> 
+            <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();request_account()"> Create Account</button>
+          </div>
+        </form>
+      </div>
     </div>
+  </div>
+</div>  
+
+<div class="modal fade" id="overlayModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
+  <div class="modal-dialog modal-sm" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h4 class="modal-title" id="myModalLabel">Account Request Received!</h4>
+      </div>
+      <div class="modal-body">
+        <span>Communicating this information to the server</span>
+        <img src="{{ url_for('static', filename='img/loading.gif') }}" width="40px">
+      </div>
     </div>
+  </div>
+</div>
 
-
-    <div class="modal fade" id="myModal1" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
-        <div class="modal-dialog modal-sm" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="modal-title" id="myModalLabel">Account Request Received!</h4>
-                </div>
-                <div class="modal-body">
-                    <span>Communicating this information to the server</span>
-                    <img src="{{ url_for('static', filename='img/loading.gif') }}" width="40px">
-                </div>
-            </div>
-        </div>
+<div class="modal fade" id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
+  <div class="modal-dialog modal-sm" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h4 class="modal-title" id="myModalLabel">Account Request Received!</h4>
+      </div>
+      <div class="modal-body">
+        <span>Please wait while we create your account. This may take up to 5-10 minutes.</span>
+        <img src="{{ url_for('static', filename='img/loading.gif') }}" width="40px">
+      </div>
     </div>
+  </div>
+</div>
 
-
-
-    <div class="modal fade" id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" data-backdrop="static" data-keyboard="false">
-        <div class="modal-dialog modal-sm" role="document">
-            <div class="modal-content">
-                <div class="modal-header">
-                    <h4 class="modal-title" id="myModalLabel">Account Request Received!</h4>
-                </div>
-                <div class="modal-body">
-                    <span>Please wait while we create your account. This may take up to 5-10 minutes.</span>
-                    <img src="{{ url_for('static', filename='img/loading.gif') }}" width="40px">
-                </div>
-            </div>
-        </div>
-    </div>
 <footer>
   <div class="container-fluid">
     <div class="row">
       <div class="col-md-6 col-sm-6">
-	    <a href="https://osc.github.io/Open-OnDemand/">
-	      <img class="footer-logo" alt="Powered by Open OnDemand" height="40" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/OpenOnDemand_powered_by_RGB-cb3aad5ff5350c7994f250fb334ddcc72e343233ce99eb71fda93beddd76a847.svg') }}">
+        <a href="https://osc.github.io/Open-OnDemand/">
+	  <img class="footer-logo" alt="Powered by Open OnDemand" height="40" style="margin-bottom: 20px" src="{{ url_for('static', filename='img/OpenOnDemand_powered_by_RGB-cb3aad5ff5350c7994f250fb334ddcc72e343233ce99eb71fda93beddd76a847.svg') }}">
         </a>
       </div>
     </div>
-  </div><!-- /.container -->
+  </div>
 </footer>
+
 </body>
 </html>
-- 
GitLab


From 0598349b1f08dc8ccbc50b9fdc186b911236c03f Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Thu, 22 Apr 2021 11:02:29 -0500
Subject: [PATCH 33/40] added button to print error message

---
 app/static/scripts/function.js | 7 ++++++-
 app/templates/auth/SignUp.html | 2 +-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index 74d9b15..24ab04b 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -19,7 +19,12 @@ function request_account() {
 function renderDom(title, message, error_msg) {
     document.getElementById("form-wrapper").innerHTML = "<h2>" + title + "<br>";
     document.getElementById("form-wrapper").innerHTML += "<h3>" + message + "<br>"; 
-    document.getElementById("form-wrapper").innerHTML += "<p>" + error_msg;
+    if (error_msg !== null ) {
+      var error_button = document.createElement("BUTTON");
+      error_button.innerHTML = 'Read Error Message';
+      document.getElementById("form-wrapper").appendChild(error_button);
+      error_button.onclick = function(){document.getElementById("form-wrapper").innerHTML += "<br>" +error_msg} 
+    }
 }
 
 function autofill_form(username, fullname, email) {
diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index 74b88dd..f468233 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -98,7 +98,7 @@
           </div>
           <br>
           <div class="col-md-7 col-sm-7 my-col">
-            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account cancel','close browser', '')">Cancel</button> 
+            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account cancel','close browser', null)">Cancel</button> 
             <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();request_account()"> Create Account</button>
           </div>
         </form>
-- 
GitLab


From e35ad880534f548e57efd7aa98210d74e251dcb0 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 23 Apr 2021 02:15:18 -0500
Subject: [PATCH 34/40] removed extra whitespaces and additional lines

---
 run.py | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/run.py b/run.py
index 1232ae6..226a79f 100644
--- a/run.py
+++ b/run.py
@@ -7,9 +7,7 @@ import vars
 
 from flask import session
 from flask_socketio import SocketIO, join_room
-
 from app import create_app
-
 from gevent import monkey
 monkey.patch_all(subprocess=True)
 
@@ -18,18 +16,14 @@ app = create_app(config_name)
 app.config['SECRET_KEY'] = vars.key
 socketio = SocketIO(app, message_queue= vars.message_queue)
 
-
-
 @socketio.on('join_room')
 def on_room(json):
-
     room = str(session['uid'])
     referrer = json['referrer']
     join_room(room)
     print('\t\t\t|-----Room ID: ' + room)
     print('\t\t\t|-----Referrer: ' + referrer)
 
-
 @socketio.on('request account')
 def request_account(json, methods=['GET', 'POST']):
     print (time.strftime("%m-%d-%Y_%H:%M:%S") + '\tQueue request received: ' + str(json))
@@ -41,6 +35,5 @@ def request_account(json, methods=['GET', 'POST']):
         print(time.strftime("%m-%d-%Y_%H:%M:%S") + "\tError in account creation: ", e)
         socketio.emit("Account creation failed", room)
 
-
 if __name__ == '__main__':
     socketio.run(app, host='0.0.0.0')
-- 
GitLab


From e8392a66f03cdccc63ddc6776cc6e76efc25103a Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 23 Apr 2021 02:17:28 -0500
Subject: [PATCH 35/40] removed comments

---
 tasks.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/tasks.py b/tasks.py
index e714a9b..7f5402d 100644
--- a/tasks.py
+++ b/tasks.py
@@ -58,6 +58,4 @@ def celery_create_account(json, session):
     rc_util.add_account(username, email, fullname, reason)
     print('sent account info')
     print('Waiting for completion...')
-    #print(callback(self.EXCHANGE, self.EXCHANGE,self.EXCHANGE,self.EXCHANGE))
     rc_util.consume(username, routing_key=f'complete.{username}', callback=gen_f(room))    
-    #send_msg('account ready', room) 
-- 
GitLab


From b74d0e6f24a272fa5347e76f3b33c66c740d7e50 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 23 Apr 2021 07:09:00 -0500
Subject: [PATCH 36/40] removed extra whitespaces and extral lines

---
 app/static/scripts/function.js | 21 +++++++++------------
 1 file changed, 9 insertions(+), 12 deletions(-)

diff --git a/app/static/scripts/function.js b/app/static/scripts/function.js
index 24ab04b..ae406d7 100644
--- a/app/static/scripts/function.js
+++ b/app/static/scripts/function.js
@@ -1,10 +1,10 @@
 function displayloading1() {
-        $('#overlayModal').modal('show');
+    $('#overlayModal').modal('show');
 }
 
 function displayloading2() {
-        $('#overlayModal').modal('hide');
-	$('#myModal2').modal('show');
+    $('#overlayModal').modal('hide');
+    $('#myModal2').modal('show');
 }
 
 function request_account() {
@@ -17,13 +17,13 @@ function request_account() {
 }
 
 function renderDom(title, message, error_msg) {
-    document.getElementById("form-wrapper").innerHTML = "<h2>" + title + "<br>";
-    document.getElementById("form-wrapper").innerHTML += "<h3>" + message + "<br>"; 
+    document.getElementById("form-wrapper").innerHTML = "<h3>" + title + "</h3><br>";
+    document.getElementById("form-wrapper").innerHTML += "<p>" +  message + "</p><br>";
     if (error_msg !== null ) {
-      var error_button = document.createElement("BUTTON");
-      error_button.innerHTML = 'Read Error Message';
-      document.getElementById("form-wrapper").appendChild(error_button);
-      error_button.onclick = function(){document.getElementById("form-wrapper").innerHTML += "<br>" +error_msg} 
+        var error_button = document.createElement("BUTTON");
+        error_button.innerHTML = 'Read Error Message';
+        document.getElementById("form-wrapper").appendChild(error_button);
+        error_button.onclick = function(){document.getElementById("form-wrapper").innerHTML += "<br>" +error_msg} 
     }
 }
 
@@ -31,17 +31,14 @@ function autofill_form(username, fullname, email) {
     let username_input = document.getElementById("username");
     let fullname_input = document.getElementById("fullname");
     let email_input = document.getElementById("email");
-
     if ((username.localeCompare("None")) !== 0) {
         username_input.value = username;
         username_input.disabled = "true";
     }
-
     if ((fullname.localeCompare("None")) !== 0) {
         fullname_input.value = fullname;
         fullname_input.disabled = "true";
      }
-
      if ((email.localeCompare("None")) !== 0) {
          email_input.value = email;
          email_input.disabled = "true";
-- 
GitLab


From 8418b6694d3305d4c7d911cb9b618a58b8e6eddc Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Fri, 23 Apr 2021 10:16:59 -0500
Subject: [PATCH 37/40] changed message text

---
 app/templates/auth/SignUp.html | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index f468233..dc95ad6 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -28,7 +28,7 @@
         socket.on( 'account error', function( msg ) {
           console.log(msg);
           $('#myModal2').modal('hide'); 
-          renderDom("Account create error", "contact rc team", msg);
+          renderDom("Account Create Error", "Error while creating your account. We've been notified about this", msg);
         });
 
     });
@@ -79,8 +79,8 @@
 
   <div class="col-md-10 col-sm-10 my-col">
     <div id="form-wrapper">
-    <h2> Self Registration form </h2>
-      <p> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. <br>Please fill in all the details as this helps us understand our user base. <br>Contact support@listserv.uab.edu for any assistance in creating your account.</p>    
+    <h2> Self Registration Form </h2>
+      <p style="font-size:110%;"> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. Please fill in all the details as this helps us understand our user base. Contact <a href="mailto:someone@yoursite.com">Research Computing</a>  for any assistance in creating your account.</p>    
       <div id="user-input">    
         <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
           <div class="col-md-7 col-sm-7 my-col">
@@ -98,7 +98,7 @@
           </div>
           <br>
           <div class="col-md-7 col-sm-7 my-col">
-            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account cancel','close browser', null)">Cancel</button> 
+            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account  Creation Cancelled','Close browser to end session', null)">Cancel</button> 
             <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();request_account()"> Create Account</button>
           </div>
         </form>
-- 
GitLab


From e9fcbe985b7fce925cf05d4ac13e2ecc95889a4c Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Thu, 6 May 2021 09:03:26 -0500
Subject: [PATCH 38/40] changed rc_util function calls to match rabbitmq agent
 modification

---
 tasks.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/tasks.py b/tasks.py
index 7f5402d..6888829 100644
--- a/tasks.py
+++ b/tasks.py
@@ -51,11 +51,12 @@ def celery_create_account(json, session):
     email= json['email']
     fullname= json['fullname']
     reason= json['reason']
+    queuename= rc_util.encode_name(username)
 
     print(time.strftime("%m-%d-%Y_%H:%M:%S") + '\tUser ' + username + ' added to queue')
     send_msg('creating account', room)
     print(username)
-    rc_util.add_account(username, email, fullname, reason)
+    rc_util.add_account(username, queuename, email, fullname, reason)
     print('sent account info')
     print('Waiting for completion...')
-    rc_util.consume(username, routing_key=f'complete.{username}', callback=gen_f(room))    
+    rc_util.consume(queuename, routing_key=f'complete.{queuename}', callback=gen_f(room))    
-- 
GitLab


From de3fd8aed34a46fb3d6849e46cb13651b999bb82 Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Thu, 6 May 2021 14:44:31 -0500
Subject: [PATCH 39/40] sending text message for welcome message, error message
 and cancel message as a variable from messages.py

---
 app/__init__.py                | 16 +++++++---------
 app/templates/auth/SignUp.html |  6 +++---
 messages.py                    |  3 +++
 3 files changed, 13 insertions(+), 12 deletions(-)
 create mode 100644 messages.py

diff --git a/app/__init__.py b/app/__init__.py
index cf68fb1..c99094c 100644
--- a/app/__init__.py
+++ b/app/__init__.py
@@ -3,17 +3,17 @@
 # local imports
 from __future__ import print_function
 import vars
-
+import messages
 # third-party imports
 import uuid
-from flask import Flask, redirect, url_for, request, render_template, flash, session
+from flask import Flask, redirect, url_for, request, render_template, flash, session, send_from_directory
 from flask_bootstrap import Bootstrap
 import random
 import os
 import json
 
 def create_app(config_name):
-    app = Flask(__name__) # initialization of the flask app
+    app = Flask(__name__, static_folder='static') # initialization of the flask app
     Bootstrap(app) # allowing app to use bootstrap
 
     def get_authorized_user():
@@ -49,12 +49,10 @@ def create_app(config_name):
         return render_template('auth/SignUp.html', room_id=session['uid'],
                                username=session['user'].get('username'),
                                fullname=session['user'].get('fullname'), email=session['user'].get('email'),
-                               referrer=session['return_url'], cancel_url=vars.default_referrer)
-
-
-    @app.route('/error')
-    def error():
-        return 'ERROR: '
+                               referrer=session['return_url'], cancel_url=vars.default_referrer,
+                               welcome_msg=messages.welcome_message,
+                               cancel_msg=messages.cancel_message,
+                               error_msg=messages.error_message)
 
     @app.route('/error_account')
     def error_account_create():    
diff --git a/app/templates/auth/SignUp.html b/app/templates/auth/SignUp.html
index dc95ad6..7c450cb 100644
--- a/app/templates/auth/SignUp.html
+++ b/app/templates/auth/SignUp.html
@@ -28,7 +28,7 @@
         socket.on( 'account error', function( msg ) {
           console.log(msg);
           $('#myModal2').modal('hide'); 
-          renderDom("Account Create Error", "Error while creating your account. We've been notified about this", msg);
+          renderDom("Account Create Error", "{{ error_msg }}", msg);
         });
 
     });
@@ -80,7 +80,7 @@
   <div class="col-md-10 col-sm-10 my-col">
     <div id="form-wrapper">
     <h2> Self Registration Form </h2>
-      <p style="font-size:110%;"> Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. Please fill in all the details as this helps us understand our user base. Contact <a href="mailto:someone@yoursite.com">Research Computing</a>  for any assistance in creating your account.</p>    
+    <p style="font-size:110%;"> {{ welcome_msg |safe }}</p>
       <div id="user-input">    
         <form id="signup" data-toggle="validator" role="form" action="." method="post" onsubmit="">
           <div class="col-md-7 col-sm-7 my-col">
@@ -98,7 +98,7 @@
           </div>
           <br>
           <div class="col-md-7 col-sm-7 my-col">
-            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account  Creation Cancelled','Close browser to end session', null)">Cancel</button> 
+            <button class="btn btn-danger btn-md" id="cancel" name="cancel" type="button" onClick="renderDom('Account  Creation Cancelled','{{ cancel_msg |safe }}', null)">Cancel</button> 
             <button class="btn btn-primary btn-md"  id="submit" name="submit" type="button" value="Submit" onclick="displayloading1();request_account()"> Create Account</button>
           </div>
         </form>
diff --git a/messages.py b/messages.py
new file mode 100644
index 0000000..8895350
--- /dev/null
+++ b/messages.py
@@ -0,0 +1,3 @@
+welcome_message = "Welcome to UAB's Reseach Computing cluster. The information below will be used to create your account. Please fill in all the details as this helps us understand our user base. Contact <a href='mailto:someone@yoursite.com'>Research Computing</a>  for any assistance in creating your account."
+cancel_message = "Close browser to end session. Contact <a href="'mailto:someone@yoursite.com'">Research Computing</a> for any assistance in creating your account."
+error_message = "Error while creating your account. We've been notified about this. Contact <a href="'mailto:someone@yoursite.com'">Research Computing</a>  for any assistance in creating your account."
-- 
GitLab


From 4344d56239c5d16ea52a7256c9bc5f54bb3344da Mon Sep 17 00:00:00 2001
From: Krish <krish94@uab.edu>
Date: Mon, 10 May 2021 13:12:14 -0500
Subject: [PATCH 40/40] delete vars.py file

---
 vars.py | 9 ---------
 1 file changed, 9 deletions(-)
 delete mode 100644 vars.py

diff --git a/vars.py b/vars.py
deleted file mode 100644
index a45bbfe..0000000
--- a/vars.py
+++ /dev/null
@@ -1,9 +0,0 @@
-id = 'reggie'
-password = 'reggie' 
-key = '1234'
-broker_url =  'amqp://' + id + ':' + password + '@master:5672/'
-message_queue =  broker_url + 'socketio'
-default_referrer = "/pun/sys/dashboard"
-username_key = ["REMOTE_USER"]
-fullname_key = ["REMOTE_USER_DISPLAYNAME"]
-email_key = ["REMOTE_USER_MAIL"] 
-- 
GitLab