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,iVBORw0KGgoAAAANSUhEUgAAASwAAACdCAYAAAAOnEURAAAACXBIWXMAAAsSAAALEgHS3X78AAAgAElEQVR4Xu2dfZAc5X3nP30VUi5cLq3FH7hipzQDzYtUEG2dkxMkddHgEUYrMFoW+0hAghUmxkQmWtspRK441OJyPsSVzRKCMQ6GXRAYAizLmwSJxsziM0h3RxXCLgmRQTtbVlLHH8hsuaxLna76uT+epzW9vd1Pd8/0zHbvPp8qaWbneeaZ7v49z/d5nt/zZgkhMCwe/t2OjX1C0O+6Fq4A1wUhLN69+/l63HcNhrxjGcEqPn/0n68sCWENuy6DrmC1EBAULFeAEBx0XcZcYY0d+e7Ex3HpGgx5wwhWgVn7nStLrovjCm4QwsJ18YQpSrBUHAvhcp8rcBqjRrgMxcEIVgH5wq4v9bmu5QjBtpZIpRYsXMGMKxg8et/EO3G/aTDkASNYBeLS//alPiEYcQUjrmstawlQ24Kl4lhbmvc/Nxb3+wbDQmMEqwAMfO+KPiVSI0KwTIkMGsGacV2r6ROsflewTCNYCMH4zN8+Nxx3LQbDQmIEK8dccd8Vfa7LiGpVLTslUtGCNe4KnP+x84VmMK0Ltl/VLwQjrssNEYIFiIMIKjMPGL+WIZ8YwcohG++/XHX9rBHXVS0jv0jNF6xxISznzTvnC1WQlX95Vb8rrDHhsjpEsEAwa0Gl+YDxaxnyhxGsHHH19y9XXT9U189SXbpIwRp3XZyf3vFiMy5tP+d9e6hPuIy5go0hgoUFIMSW5vefH9MmZDD0GCNYOeHLP9gwIlzLkV0/T6QiBWvcdS2n/lfphCqIPTLkuIIdEYIFMN78/vPDmiQMhp5iBGuB+ZMfbhh2BY4rWCHmjOyFCta4EDj7bnupGZduUs7aNjToutaYECwLESwQ4iBQaT44afxahgXHCNYCcd2PBoZdgSNca4XnS9II1pQrGHnt2y93xa9UuvXqfiEYA7E6RLAAZi0hKtM/eKErv28wJMUIVo+5fmxgWMjZ6SvmiFS4YE25Ls6eb75cj0u3U1Z84+o+EGMINoYIFpZ83TL9gxfGwlMwGLqPEawecePj64ddF8cV1gr/lIIIwZoSAufFv3ilHpdu1qzYOuRYsCNCsECI8emHXhwO/7bB0F2MYHWZP3tivez6CVaETdoMCNaUK3Ce39p7ofJT2jo0iBBjwLIQwQI4CKIy/dBLxq9l6ClGsLrELU9dVnEFY67yUQnhzZkKFawpV+A8+/U99bh0e0Xpz6/qB8YQYjXMEyxAzFqCytEfvmT8WoaeYQQrY77xzBcramHyWjWyh0awpoRrOU99LT9C5af051f1qZbWxhDBwhIAYsvRH748FvZ9gyFrlpRg7dxXLQGDQD9QCgS/o/5N7lhXS93V2TbxxYrrIoUqMMEzRLBmXMHIE1/dOxmXbh4o3TI4agmxDQgTLBCMH/27l4cjvm4wZMaSEKyd+6oVwAHW6mOe4iBQB+pCUHcujRawb01eWhHCclzB2lOje9GCNeMKy3lseO9YVHp5pfz1jcPAKEIsk5/MESxQ6xCPPvxKarE3GJKyqAVr575qHzAGbIyJGokSninXtepCUP8vA/vqALe9dGlFjvqx1tu+RSNYM0LgPLL51TH9r+Wb8tc39iPEJLAiRLBAMAuicvThPcavZegKi1awdu6rSqcxrI6JqsUvPN574VoHXcHqOTslhAvWjOtazt9dV2yh8lO++co+YBLE2hDBQgnZlg9+tGcsOhWDoT0WpWApsaoDy2KixhIhWKcEKkKwZoTAefBPXhuLS7+olG/+0qgl2BYhWIAY/+BHe4c1SRgMqVl0gpVArGaRLa864Plb+tW/CrDCH7lNwRoXgklXUH/oT19btD6ds772pWEQo/jWIfoEC4Scr/XBI68u2mdg6C2LSrCUc32SaLHaCYzqRgHVSGIFOZpYEcEdPpMJll/oDrpCOu8f2fxqIUYF03DW167oRzAJYkWIYAFiFkHlg0dfza1fa9XQmj5khQXS9qi/+3zR6shR5PqhiQNGgBeIRSNYO/dVh4FHI4JngcEd62r1iPBInH+s9ruCiutaFaH2j0opWP5RQlxhTQmXuiuoP/HVvfW43y8CZ/3ZFX0gJhGsDREsEGAhtjQe7X0XeeXVF5UsKCHoAxEUpRKBFnUCZpGVonNo4kAzJq4hYxaFYCUQq8qOdbVMavi/2rOuIlyr4goGXbVrZ0rB8k8cnRWuVXeFFLBnv17s0bWzbrp8FMS2CMECGG88+tqwJolUnH/Nv6+oHykhRAnos4QSJSWeCKF2nzj1X1bMIkVrNC6iITsKL1i9FKsgf/nCpX2uoCKEVZGtsNYhpgkFK7iWcMYV1F1XdiFf/ItXmnHXkDfOumnDsCUYBbEsRLBA7a/VGPuHyG7VuZu+IFtD8vv9lmwdlRCUQPQhWI2/JSfTBfxLiNR/3RMsj/FDEweG4yIZsqHQgrVzX3UMuCEi+CBSrHrmb7j12S+WRKv7WHEFK1IK1tyWmrBmXJdJoVpgr3375Z7dSyec/dUN/cgu4ooQwQKYRYgR2VUTAP0I0QeULJ8vzHvVTJ8gB4IFRrR6RmEFK29iFcbNP76s5LrWoGyFUXFduU97CsHyvQfXtQ4q8Zr8yfaX6nG/v5Cc/dWBPqQzfm2IYPmEJCA4OmHqrmAdRI4aN9W/j5FOdpC+rgrR+Q3gBWDYOOS7SyEFqwhiFcbw+Pp+V1gV4TLoqsXRKQUr+H7KlQ78yZ/9pxe70u3tlLNvXD+KYNsCC9aU+vsd5ooShyYO1EnIqqE1JWCU6JUTB4GKEa3uUSjBUkttJoleEzgOjORRrML404cHKkK1wFzB6jYEyz9SOavEqy4Ek//zrvgjv3rF2VvWD1uIUXz7a2UkWDMgmur7dQBLKFESNA8/+6YMy5hVQ2vGiKkwjWh1h8IIlhKrOtFLbcZ3rKsNR4Tlni//YEOfGn2suC6DQrAipWD53oM7x4Fv1d+9+/lm3DV0E3vLZf3AJEKsAJII1kEEH4P42BK8o4Sqrl7fOfLUGwsqCKuG1owA90YEG9HqEoUQrMUuVmFc+TeXl1xhVVxX+b+UAz+FYPlaaxauQPq/XOqusOpHvtv7053tLZf1IRdPr9UI1pb3H//JWEQSuWLV0JphokeojWh1gdwLVoJFzDt3rKs5EWGLhsu+e0W/b/Sx4rrWspSC5RM4C+Fy0FXLh47eN1GP+/0ssYe/OIoQ2zQtrPH3d/9kOOr7ecKIVm/JtWAlWBe4Zce62lhE2KKm8l+vlOLlUnG9LW7SCZYMb7XWppBTEeozPTim3r7h0mHLv79WeJew8v4Tr+e+sBvR6h25FSwjVun4w7s2DirxqgjB6jYEC+UfwpLzpOpIn1O9+eBkU/vjbXLODZe29teaL1ig9td6/4l61wW0U2JEawYYPDRxIPf3kXdyKVg791UHkd3AMLGaRY4EjoWEGYA/uHNjn9taPlQRQn8QRohgBbtqM5YUsDpCTE4/9GJmrYVzrl8nR36FWAuRo4RbjjxZH4tOJR/EiNYssqVlRKsDcidYC7nUZrHye7dfVXJbk1cHXWEtSylYvvlNAuQxX3VLjtrVj/6w8xn452yujoKarzVfsAAxfuTJqeHoFPKBEa3ukivBMmLVG8779lC/UN1HV7CxDcHCJyQg/V91BPWjD7d/puI5m6tyvlbM/lpHfrywUxriWDW0RufOMKLVAbkRrJ37qrp5LTPI7WGMkbtA6darK0JQAVFBsLYNwfK/znotLwT1Dx7Zm8pm527+QqL9tY489UaqdHuNEa3ukAvBKupSm8XIiq1DfRZUEKKCfI06SDV+yUxLYCYtpA+s8ehrTWJQuzVo99cCseXIUz8d0ySz4BjRyp4FFywjVvmmdMtgHzBotQRshQxJLFgg8C9+nkE57y2o/9P4P0ba9tzrLhklYn8t9Tvj7z390+Go7+cBI1rZsqCCZcSqeJRvvrIEVEAMWrIbuSxESOb8HRCsU6+q63kQKWD1f3q8NkmAc6+rDIftr+X7nYNA5b2n/3tu80kC0Ro5NHFgLCTMEGBBBGspLrVZrKg93SsgBtFvkSy/MF+w5nxuIaaQPrDJ93e//g7AeddW+gnsrzXnd+S8scp7f/+z3LZUYkQLYIsRrXh6LlhGrBY3Z920oWK1BGx1G4LlF7pZWtMn3kHgoPbXCggWCDELjLz39z8bI6cY0eqcngqWEaulxdk3DvQhRx4rFqICrE4pWMwRJrmdzPzRQ//3hbjv8DNvjpBT1Ak9daLLgBEtDT0TLLXUZpLoU0q+uWNdbTQizLAIsLdcVvKNPlYs35KchIIV/rn/+/J1CsHg4WffzKVfy4hW+/REsMy6QEMYai1hhdY0imUZCZbXGhs8/OxbufRrGdFqj64LlhErQ1LO2Vztt6Tvq0KYryqdYAFiFiFGDj+3f4wcYkQrPV0VrASLmId3rJs/lJ0Gp1Z9HNgQFy8Mp1o7Iy6OYeE497pLKrSmT6xuQ7BAiJnDz+0vkYJe5qkEonXfoYkDufXJ9ZrfiovQIc9HfJ7lusAzgOVxkQzF4/0nXq8jCzPnXbu2D3lyTQUYJPmJzStWXX1R36Hn9qfxZ/UsTx2aOPDxqqE1FaJFa9uqoTV95hgxyb+Ji9AFshQrwxLhyJNTHx/58dTkkR+/MXLkqTdKQBnYgjx4ZFb7ZeiPCV9Q1OZ+FeRk6TBuUAdfLHm63cIKYhYxGzLhyFM/bSLdDWMA5/+HP+qn1QKr0HJDHKR1vmBuUaLVrzmR54ZVQ2tY6i2tbgvWlO/9x0ifVZqmucGQCDXL/R3kuYGs/PIfVgAOP7e/Hv2t/HFo4sDwqqE1EC1aHy9ln1ZXBWvHulolLo7B0A0OP/tmPS5OXokRrVx3b7tNV0cJ84BTq+4BBkLDqjUr7HODQUev8lRE93D20MSBvpDoS4KFcLobDIYEKH/VeODjqPmMSwIjWAZDjlGidUng35Klqz4sg8HQOYcmDtTj4iwVTAvLYDAUBiNYBoOhMBjBMhgMhcEIlsFgKAxGsAwGQ2EwgmUwGAqDESyDwVAYjGAZDIbCYATLYDAUho5nuju1ahm4C7CBc4FPAKcHogngV8CHQBPY5VRr/q1ncoVTq64FbqJ1T58CTgtEOwH8K/A+8BZwv1OtTbOAOLXqbci9oC5E2uDTQHAx7kng18jrbgAPL6QtfNdcAs4k/Fl71+zlnyedam03BaKoeQryZaO2d2vw7Xvd7layJ4AJp1rb7P/QqVXfAi4KxN3rVGvt7bGdYmV9Bvd0DJnJ7omLmBUqMw0D5zNfnJJyEtgHbO1FAcnwmt8Gbu+14C72PAX5tVFqwVI38tfMV9h2OQHc7KmxU6t+xHzjdlWw1D3tYH7LsF2OA0NZGSkMVWNP0H5BCEMAr7b7rOPo0jUD7Aeu7YXYwuLNU5B/G6XyYanWzy6yEyuQBn1MGRiyf1BaVObbRXYZC+Q9vO67p0xR11wn+2dlAQNOrfoblXEzQ7U0Xif7awbZIj/i1Kqb4iL2giLmKSiGjRILllOrHmJ+Vy0rLOBu9cB6hrqn0JoyAyxgV6cGCtLla/Y4HVk4Mrl2ZddNtN+1SMJpyIovk2tuly7bpyt5Copjo0SCpVpWK+Pi+TiBbML6/53QfkM+qLZvpE3i7kkw/z6Oc+owvEQ8llVrRdXccdfsJ+zaT2q/0cIig2tXmTOJXb1nvR/YG/i3X4XFkck1d0icfXKVp6BYNoodJXRq1e8R37ISwAHg+TjnoEpvPfGGXShOIA/P0I5kOq3R0TiHqoX0CaQ6YDOIem5xNbdnhwd0IzTq2m8FvgJ8Lioe8tr3AJ/UxInjoZjw48C4U619Kyae/5lfQ7RbIpPnnTG5zFM+CmMjrdNd/fgR9D6rtpxpSmF3oy8wHl1xugcQwGgSowRxkg1EbI8T8ygS2mEvbYzyqdr1IfT+lraev3ouuzRR2k23DLyCvtK7tx1bJmEx5CmPotkorkt4F/oHttup1i5OW0gAnGptyqnWfhc4HBe3B5wAzk778DxUpjkPfbd3uyYsDp0dBNIOG9q0w26nWvskejus04TpuFUT1lZBAHCqtWmnWluF/ppv0IT1grznKY9C2ShOsK7RhO11AnOo2kHd1LG4eF3kJHBBO4Xdj/r+BqJ9EctVrdMOOjs8kYUdgMuJLhynOe0NiES1nk+2WxD8qLwTdc3L2/WTZEAR8pRHoWwUKViqqxBVqx/P4mZ8JHH4dYs7Os1YHo70T7yqiXKXJiyUBHbIQqy8wnGzJkpFEzYPRz/8vk8Tlhad/yWLFkg75DpPeRTRRroW1rWasHFNWGqUURaia3jC6dAHEMJWTZitCYtCZwed7yE1jnTUR430fDbi8yg+owmra8JSobpcUS2QCyM+7yZFyFMehbORTrBKEZ+LdvvlMehqkW4ROWLTLqpmjWoCnxvxuY4og57sQsEAOSoYhuWkmz9zflRAF677VxGfZzlxMylFyFMehbORTrDOjPg86oc75YW4CF2gHhehTWYiPv9UxOc6ogz6YcTnnfKaJux3NGFBPiJ8vlGSuTppORDxeTdmbMdRj4vQJlnmKY/C2Ug3D+vTEZ9H/XBHONXalFOrxkXLlC7UIh5Nwodz21nSFGXQn0d83hFOtbZb42CvAImeWVa+taJRkDwFFNNGOsGyNGHdIsoB1xWRNBgMxSJ2pnsv6WLtZDAYFgFx87AMBoMhN+SqhWVYuoTMCfoXpws7VhraJw82MoJVXAacWjXNCv9c4Fsc+3lgBZphbZ/z/zhq2+AuTakx+MizjYxgGXqCWoLxIO3t0rEcuWPIRU6tOgK8B9zidHn3zaVGEWxkfFiGruO0dkhtpyAEsZDp1FW6hgwoio1MC8vQNVTX4heknM2cggGnVv0N8G5cREM4RbORaWEZukk3C4LH6cRvMGmIplA2Mi2s4nIYGIuLlDGJJ/CqrkBcQRDAPyNn7deBZ4K7HCi/yhrkLPs1pFzKYYimiDYyglVcmnmdaKsysG5HToFc7B67Q6py2k6hlgSpLswDyG22F2I1xqKgqDYygmXoBndrwgRwfbvzd1Th2aAKXJIWgiGcQtrI+LAM3eDzmrC2C4IfVatfQPJTgAxzKaSNjGAZMkXVqlE7CBzOoiB4qJr8jrh4hrkU2Ua56hJq5mzU8+qvMcxjjSZsTBPWFk61do9Tq+4gw27HEqCwNtIJliBjh1kCdE7ApSpYUXaI2q+sY5zovb4PJJi5XIkK6GKl8y4ZDZsvESpRAXm3kU6wfkX48KROndvG6fz0j8VKlB062Ro3jqi94rfThS2AM6Bbu+AasiMTG+l8WFFb8HarZv+KJqyuCVvs9NQOmtaVwbDg6ASrGfG55chj07NmWBP2jCZssfN2xOeW095ZgXFcFRXQaXfBSXeIRRq60upfiuTdRjrB0h0hpTu/LjWqOxh1gseJuIlri5yHNWFDmrDUKDtEZSzdCcR+6pow3ZFlbaFGvLo2s3qRUteE5dpG0QepSudqVCY9PeNV2G8Q7eDPo8+kZyg7RJ1ikkc76FrD67vgq8xsCH4JUVgbxc3DmtCEDWTRJXFq1UNEH5cNGR8WWlB0opQrOzj6M/Qs4BdZFYgE12wIocg20gqWI48B0nUFNjm16i/buTmnVl3r1Kofod9/Z3+CYfRFT0I7vNWBHX6J3g6HU9pBF/d0ZIFo21fi1KqbEuQdg55C2sgSQmgjqIuOq8EFcofBsTjHrCMd9uuJvxEBnB3nv1Ktiw2aKJ8ielav9sBIp1o7QxceheqmRc0pa+s3824HP0o4PyB+Ht8xpD/lzrj0HekH2U763QD2Bv6+EDWBUfOsF32eKqqNYgULThkwjdqeAP418NknSDfTdXOSJQIxhuwIp1qLM2YonVyT7jcXyA7b48QvDCWI34yLFyCq4CXJ/KknOkc9607sF0ee8lQRbRTnwwLwuiSx4uHjdOQN+P+lKSS7k4jVUmOB7JBarAAceRDB4bh4AYLX6v2LYzcZTUxcShTRRokEC+YUlvgmWfucRLasCneEdq9Qz+ZeumsHgWxZdWQHp1pbBeyPi9cBAri30+tcyhTNRokFC04VlktIr8pJ2A+cZ1pW8aiasVt2OIz0WbXVsgriVGsXIwU2sy1GFMeAS5wuHim1VCiSjVLv1uDI0aJVysF2N9LBlqpf6uMksA/Y5aQbhVrydMEObwO3d8MOKsN+S/nghkjXLfXjDSp8J6RiO0CbPh5DcWyUyOkehxrBuhYoAWci17kFC89J4NfItXFN4EnTmsoWnx28UZZc2kGJ7E2AjVzEHTXqdhw5cPBzzBZDPSWvNspEsAwGg6EXpPJhGQwGw0JiBMtgMBQGI1gGg6EwGMEyGAyFIfW0BoPBUFzsUvkj9XZPozmdyWTOXmIEy2BYWnjLaNpahL3QmC6hwWAoDEawDAZDYTCCZTAYCkMqH5ZdKpeBu5AHMZ5Ja6q+QG4d8T7wQKM53dOlHmmxS+Wwjca8ezgA7Go0p9teU6fSvxu5pMG/POY4GT8j32/9HnB6ozmtXU8YsKF/u5kTwAzwdjvOWJXuA8hlQf684d3z843mdCbLNgLPdzlyudGHQD3q2u1S+XHm5tsTyGu7v5Pr8t33GlrLV7zlTx3npbwRsPNnaeVtL/+82mhOd7zYOfBclwPbG83pexIvzVEGv45kC2yPIw0VmhHsUnnOj8YVMj9JvxsWTz2EV4jfZRPk7hHXNprTiXfaVAVpN8n2sD4ODCXJzFH3bJfKbxE4TVf3LO1SeQ9yl9G4530S+NukGS9FuseBbUnF2i6Vb0PtJe+z35PoTxA+3GhOr/L+sEvl7wHfIHqHUAh8J4zgtajPkt733kZzWreDKRD+G0nx5ZHt/nKnrjHJguPjjea01hGf4n5PAnckqQginmuY1mxvNKfvSdQlVAlsIv5CPZYDu9QN5gK7VN4EHCGZWIEsFL9QhSQWlf7rJBMrkM/odVWgUmGXymW7VP4NCY/+VvE/QmZcC5mh9gKbG81pS2WUzeqzk8jC/U1l90h81+Glexwp2BVfutuR4i+Q9/x4XLphKDv8AnnPh5EZ2PuNe2nteb9SCbkn6N6OmqfuFziLuduprExzTYHn+f/QP0uAAbtU/ihpXsob6n5/yVw73wucpck/u9I8Uw+7VD5ES2uOIdPci2ytxi9+VgUx+MPHkSe5/Fz9/RngYuDzzK3JTgLnBVspdsJWUhhJvxuMR+tBehxHPQTkLhM24bVwkppnE/AYcwXd22bjVeB/E/2MBHC9rtURci8niNj+I+x5qMLldX1ja3uVaTxhn1NjB+L9htZ1aNO1Zetzjy/+vY2YFpztq32R93wacGPYs/IJ2qnrQRawyJay+s4RVBex0Zz+ZDCOL67/Wo4hK6a0z1LbkrO70MLSxIu9dg9f/hHAqM5u9vxezO6GxsUQeK6ezY4BmxohvY8kPqz/GPg77gL8zbk7wjLKAuGJxF5ga0QGDmuKLrdL5cej7lkZ6JHAd44Bf6wpJH6DWsAjdqn8sxTPyiuUJ4GngTujvmvLVq4nVlrbeTSa06tUQZvViNVbtK4jNt1Gc3rKLpUvoCUqI3ap/EJYptQwr/LzaDSnp+1SeYLWnvcDxFyX+s7T6jun26VyOaENPotsUcV2bX3PciWyJfe9OKHOE4H8o61YQT5TwH/P19ml8sMJ7TxAjJAm6RL6T2Q+kSBjbgbOBvbrlH4BEMhMtkGT6TcD1zN/++FrQqJ7PECg5dZoTv+urmA1ZC3r3y30NGQ6adjbaE7/dqM5vVkjVmtp+S/2x9nOT6M5varRnL44LEyl63VHDydNV12nlxkt4EFN9CA3JxCTO33vk16X/2Ttr0TGmstoXMENcDmtPPUNXcQ8oey8Xv25N809qzx+knR2jm31JRGsVE1TOFUoQzP7AhJbOwCoOKOBj0+zZbdvDqq1tJ4WAvj9YLwILmfulrT+dOLYHWdYxd2+91keQe5P9/LIWCGomtbbQ3ylndCvk9B2fkFrRsXz00hW88+hkbKFpK7rVfVnaF7KKXejfJ4J81uQp9XrSiV+WpL8RhLB8rc2TrfbcKTlgSQZ3kNlyBPMJazA38VcQX8vQSsAOJWJ9/k+suyEDviELQeQ/jKQrY1E15WQTtO93ff+rshYi4utvvdZVh7dxLPz29pYEah8esq3poublCSC9V7g7012qXwoaeEqMMGad01InM8zl7GQODqeDPydWatU1WheV9Wr3TtGtQ68dNvNyFO0WpcVTdRFgxJ2rxIMy0u5ImDn53VxY/hn9XqhNlZCkgjWd0I+W4kc9ha2HK7dU6BmblKCYvKpkDhn+v9opPTZhbT6zg2N2B7+QvFCZKz0/I7vvd//k5aGeg0d7VykvKteP6GNlQ/+rfcmbb4O4M0kyMTOsaOEjeb0brtUvozoE4eXIx27A3ap/BhyqsDt7fgG8oS6b3/3N2zKw5wDJO350w/S8um4CCmoeG8ytkXFe9Nhuk1kxZfkEM7FgneQaCaFt8ucGmyzW1vStINX0Wdi5yQtLK8vupnoY6o9LOToUd3O0aTRApF6gMNg6AHLO/inW2GQmtgWlofqvuy2W+vwLkQ/q3vALpX3JPH8GwyG/NJIOYm1myQWLA/VDTjVFbDlTNWrmD+DG6Rore2w67AghPjkwk7FDc44r+ToXuuoOVgZ26BONumW1Gtcq30xUVKvwRHoPFKnZedNaUbZu0miLqGORnP6nkZz+uJGc/q3kevIgn6cTIYzF4Dg0POvQ+IEC9vGkDgLxYHWW26KjJWerNK11euH2liLixXqtQgi7bfzZZGxekzHguVH+br8c2ygAEO4EQQnuvkN6PFz5pJm8mdXCUwdCE6/aJss0g1MuWhrakTRUBNkvdZ4MN/kjizs3A0SCVbS2cjQ3hBo0ikRSWbLRpH0NwDUHLPgSE5wmgO0Fm16rEzzOz3AE4PEM8oT0mm6/pny/uU0ixn/0quwvJRHvInNifbxN7MAAAP+SURBVGaq94JYwVI+qg/UaywhNxbW5A92G2Nn/ioh6GTk8bEkYqLijAQ+PhnWh1e1kH9NIMiFzIkKsS237ejknuLwt3bfiIwVQsw9+NN9JTJWCPb8dYjtzJRfUOyUqz3suUu4jmv8Qf/ivUmSVz26KCZbaZXVCV3EKJKWhaTEChbw18jh9l12qfxWggsIGiOsyf8r5jIQlQl8hfoxOpu/YiH3YtoTdQ/qGoLbxEBrTVQY/oWtILs6R+IEXoUfQd77W7q47aIEda/683MpC9ortlxxP49Auon3klLP3RNoQcp1iDlik51upccrtPJUsFV+ioCQxVbicEqsulLpNeaugVyetnJV+SLxnnJJ0I4Sqgv0j/xdBBy1S+VjyH543RdWAdYF4p9shK9728P8iaib7FL5GqTAeYLmbY/qIWh/rpI3ojeAvIek+2Edi7gHQBrVLpVvZ25G9DYw24EcUa2rz6P2xLrILpVva6c7HUejOb3Bbu1ntMkulc/QTTWxA9vfRF2XStfbDytJul7B8iqd0SK2rhSHkSs9zk/zLJEtyjgbe3ttrbdjRufs1nZI/ycqTgjevnCJlsooO3tbxQyo95frbKfu+wFaO4XchZzH2TFawQpcrJ/PqX/eBYUhgBvDAhrN6c12qTzE/BbTaUTvonkCuTVJPSI8jg3MLTDeDH0dJ4A/jolDozl9j10qfwbZlfQLqieQcb9zGHgmJk4n/D7wv1D3bJfK/xfpn3jSKxC27IJcy9xKZ3dMAfPvbzWghHEPcGr/I7s17WUNrWezu5Fyx4M80WjtcZXmWcZuw6y4H1n5WUg3xrXo0z6OtO/R8OTm0UCW58/Zap6kqkweJGI//0ZgTy9kD2LOPUOkrffqKvy0xHYJ1UP2byebhBPEb+dyM8nmowjkTX+y0f6cH68bcwHzfU5R7AcuSNoKUAXwEmQNmZSTyJ03VyX9nXZoyO1+zkB24wQyow8gu8jClkuKHlefnUbruuL2PptuyF06vXSXI1vOdV+6u5CVkIUsXJvj0i0CqlzsRVb6umfp5d8kYuUNWnnlxiI67d9CpntGyrxzCy0XxoBKs44UoqGoL/nuNzT/RNh6eyPjieOxWyT7Ueq+lfmnwUCbp6PY808zgdaJJnU0u2nqsDVbKdvzT12B7E/N2c7ck1Rg7mkqc2qnXmHL5nqhT81ZCOyI7Yt9972GVpno+NScQB71p/shHZQLOJX2g7TcIJ7tb4m7Vk3+8cpPpqdCBUklWEVCJ1gGQ1qiBMvQW2K7hAaDwZAXjGAZDIbCYATLYDAUBiNYBoOhMBjBMhgMhcEIlsFgKAyLdlqDwWBYfJgWlsFgKAxGsAwGQ2EwgmUwGArD/weo98DC2yYdnQAAAABJRU5ErkJggg=="/></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>	<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>	<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>	<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>	<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>	<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>	<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>	<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>	<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>	<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