From 7599651aa6de0dcd92f60de50c34734aa8421d63 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 9 Feb 2023 20:31:39 +0530 Subject: [PATCH 01/24] bul scan updates --- microsetta_admin/server.py | 188 +++++++++++++++++++++++ microsetta_admin/templates/sitebase.html | 1 + 2 files changed, 189 insertions(+) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 8b1615c..188d817 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -3,6 +3,7 @@ import secrets from datetime import datetime import io +import random from jwt import PyJWTError from werkzeug.exceptions import BadRequest @@ -774,6 +775,193 @@ def scan(): recorded_type) +def get_legends(criteria): + + dict = {} + if criteria not in session: + status, fields = APIRequest.get( + '/api/admin/barcode_query_fields') + + if status == 200: + for obj in fields: + if criteria == "Type" and obj["label"] == "Sample Site": + for val in obj["values"]: + color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + while color_code[0] in dict: + color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + dict[obj["values"][val]] = color_code[0] + + if criteria == "Status" and obj["label"] == "Sample Status": + for val in obj["values"]: + color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + while color_code[0] in dict: + color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + dict[obj["values"][val].replace(' ', '-').lower()] = color_code[0] + + if criteria == "Project" and obj["label"] == "Project": + for val in obj["values"]: + if not '-' in obj["values"][val]: + color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + while color_code[0] in dict: + color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + dict[obj["values"][val]] = color_code[0] + + if len(dict) > 0: + dict['None'] = "#000000" + session[criteria] = dict + else: + dict = session.get(criteria) + print(str(dict)) + return dict + + +def _compose_table(legends, type): + output_dict = {} + scanned_data = session.get('scan_data') + current_row = "" + current_cols = [] + + for rec in scanned_data: + status, data = APIRequest.get( + '/api/admin/search/samples/%s' % rec[5] + ) + + val = "" + proj = data["sample"]["sample_projects"][0] + status = data["sample"]["_latest_scan_status"] + source = data["sample"]["site"] + + if type == "Type": + val = data["sample"]["site"] + elif type == "Status": + val = data["sample"]["_latest_scan_status"] + elif type == "Project": + val = data["sample"]["sample_projects"][0] + + if current_row == "": + current_row = rec[4] + if val == None or val == "": + current_cols.append([rec[5], legends['None'], proj, status, source]) + else: + current_cols.append([rec[5], legends[val], proj, status, source]) + elif current_row == rec[4]: + if val == None: + current_cols.append([rec[5], legends['None'], proj, status, source]) + else: + current_cols.append([rec[5], legends[val], proj, status, source]) + else: + output_dict[current_row] = current_cols + current_cols = [] + current_row = rec[4] + if val == None: + current_cols.append([rec[5], legends['None'], proj, status, source]) + else: + current_cols.append([rec[5], legends[val], proj, status, source]) + + output_dict[current_row] = current_cols + return output_dict + + +def post_bulk_scan(): + stage = request.form["stage"] + + if stage == "Scanning": + objFile = request.files['file_picker'] + + if objFile is not None: + filename = objFile.filename + fileData = pd.read_csv(objFile, dtype={'TubeCode': str}).values.tolist() + session['scan_data'] = fileData + session['scan_file'] = filename + return render_template('bulk_scan.html', + **build_login_variables(), + stage = "Visualization", + filename = filename, + data = "", + legends = {}, + table = {}, + status_options = {} + ) + + + elif stage == "Visualization": + filename = session.get('scan_file', "") + criteria = request.form['sort_criteria'] + session['recent_criteria'] = criteria + legends = get_legends(criteria) + + return render_template('bulk_scan.html', + **build_login_variables(), + stage = "Visualization", + filename = filename, + data = criteria, + legends = legends, + table = _compose_table(legends, criteria), + status_options = STATUS_OPTIONS + ) + + elif stage == "Sample_Scan": + + send_email = request.form.get('send_email', False) + session[SEND_EMAIL_CHECKBOX_DEFAULT_NAME] = send_email + + sample_barcode = request.form['sample_barcode'] + technician_notes = request.form['technician_notes'] + sample_status = request.form['sample_status'] + + # action = None + # if send_email: + # action = "send_email" + # else: + # action = "scan_only" + + # issue_type = 'sample' + # template = sample_status + # received_type = None + # recorded_type = request.form.get('recorded_type') + + # Do the actual update + status, response = APIRequest.post( + '/api/admin/scan/%s' % sample_barcode, + json={ + "sample_status": sample_status, + "technician_notes": technician_notes + } + ) + + filename = session.get('scan_file', "") + criteria = session.get('recent_criteria', "Project") + legends = get_legends(criteria) + return render_template('bulk_scan.html', + **build_login_variables(), + stage = "Visualization", + filename = filename, + data = criteria, + legends = legends, + table = _compose_table(legends, criteria), + status_options = STATUS_OPTIONS + ) + + + + +@app.route('/scan-bulk', methods=['GET', 'POST']) +def bulk_scan(): + if request.method == 'GET': + return render_template('bulk_scan.html', + **build_login_variables(), + stage = "Scanning", + filename = "", + data = "", + legends = {}, + table = {}, + status_options = {} + ) + + if request.method == 'POST': + return post_bulk_scan() + + @app.route('/metadata_pulldown', methods=['GET', 'POST']) def metadata_pulldown(): allow_missing = request.form.get('allow_missing_samples', False) diff --git a/microsetta_admin/templates/sitebase.html b/microsetta_admin/templates/sitebase.html index 50e24ac..2f3067c 100644 --- a/microsetta_admin/templates/sitebase.html +++ b/microsetta_admin/templates/sitebase.html @@ -48,6 +48,7 @@

Microsetta Utilities

  • Account Summaries
  • Create Kit
  • Scan Barcode
  • +
  • Scan Barcode - Bulk
  • Retrieve Metadata
  • Sample Summaries
  • Submit Daklapack Order
  • From 01504b899328a6afa452b4312cde55e47943e0a6 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 23 Feb 2023 22:22:44 +0530 Subject: [PATCH 02/24] add misisng bulk_scan.html --- microsetta_admin/templates/bulk_scan.html | 235 ++++++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 microsetta_admin/templates/bulk_scan.html diff --git a/microsetta_admin/templates/bulk_scan.html b/microsetta_admin/templates/bulk_scan.html new file mode 100644 index 0000000..7225618 --- /dev/null +++ b/microsetta_admin/templates/bulk_scan.html @@ -0,0 +1,235 @@ +{% extends "sitebase.html" %} +{% block head %} + + + + +{% endblock %} +{% block content %} +

    Microsetta Scan - Bulk

    + +{% if stage == "Scanning" %} +
    +
    + + + + + + + + + +
    + + + +
    +
    + + +
    +
    +{% endif %} + +{% if stage == "Visualization" %} +
    +
    + + + + + +
    .csv file name: {{ filename }}
    + Sort By: + + + +
    +
    +
    + Legend +

    + + + + + {% for key, value in legends.items() %} + + + + + {% endfor %} +
    Project {{ data }}
    {{key}}
    +
    + + + + {% for index in table["A"] %} + + {% endfor %} + + {% for key, value in table.items() %} + + + {% for obj in value %} + + {% endfor %} + + {% endfor %} +
    Plate#{{ loop.index }}
    {{ key }} + {{ obj[0] }} + + + + +
    + + +
    +{% endif %} + +
    +
    +
    +
    +
    + + +
    +
    + +
    + +
    + +
    +
    + +{% endblock %} + From dd0354453448e08d91dd3789d390d1ec74daeb0d Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 23 Feb 2023 23:18:08 +0530 Subject: [PATCH 03/24] fix lint errors --- microsetta_admin/server.py | 128 ++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 65 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 78e89ff..fbb7bed 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -778,32 +778,40 @@ def scan(): def get_legends(criteria): dict = {} + hex = 'ABCDEF0123456789' if criteria not in session: status, fields = APIRequest.get( '/api/admin/barcode_query_fields') - + if status == 200: for obj in fields: if criteria == "Type" and obj["label"] == "Sample Site": for val in obj["values"]: - color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + code = [random.choice(hex) for i in range(6)] + color_code = ['#' + ''.join(code)] while color_code[0] in dict: - color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + code = [random.choice(hex) for i in range(6)] + color_code = ['#' + ''.join(code)] dict[obj["values"][val]] = color_code[0] if criteria == "Status" and obj["label"] == "Sample Status": for val in obj["values"]: - color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + code = [random.choice(hex) for i in range(6)] + color_code = ['#' + ''.join(code)] while color_code[0] in dict: - color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] - dict[obj["values"][val].replace(' ', '-').lower()] = color_code[0] + code = [random.choice(hex) for i in range(6)] + color_code = ['#' + ''.join(code)] + tmp = obj["values"][val].replace(' ', '-').lower() + dict[tmp] = color_code[0] if criteria == "Project" and obj["label"] == "Project": for val in obj["values"]: - if not '-' in obj["values"][val]: - color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + if not ('-' in obj["values"][val]): + code = [random.choice(hex) for i in range(6)] + color_code = ['#' + ''.join(code)] while color_code[0] in dict: - color_code = ['#' + ''.join([random.choice('ABCDEF0123456789') for i in range(6)])] + code = [random.choice(hex) for i in range(6)] + color_code = ['#' + ''.join(code)] dict[obj["values"][val]] = color_code[0] if len(dict) > 0: @@ -829,8 +837,8 @@ def _compose_table(legends, type): val = "" proj = data["sample"]["sample_projects"][0] status = data["sample"]["_latest_scan_status"] - source = data["sample"]["site"] - + src = data["sample"]["site"] + if type == "Type": val = data["sample"]["site"] elif type == "Status": @@ -840,24 +848,27 @@ def _compose_table(legends, type): if current_row == "": current_row = rec[4] - if val == None or val == "": - current_cols.append([rec[5], legends['None'], proj, status, source]) + if val is None or val == "": + tmp = legends['None'] + current_cols.append([rec[5], tmp, proj, status, src]) else: - current_cols.append([rec[5], legends[val], proj, status, source]) + current_cols.append([rec[5], legends[val], proj, status, src]) elif current_row == rec[4]: - if val == None: - current_cols.append([rec[5], legends['None'], proj, status, source]) + if val is None: + tmp = legends['None'] + current_cols.append([rec[5], tmp, proj, status, src]) else: - current_cols.append([rec[5], legends[val], proj, status, source]) + current_cols.append([rec[5], legends[val], proj, status, src]) else: output_dict[current_row] = current_cols current_cols = [] current_row = rec[4] - if val == None: - current_cols.append([rec[5], legends['None'], proj, status, source]) + if val is None: + tmp = legends['None'] + current_cols.append([rec[5], tmp, proj, status, src]) else: - current_cols.append([rec[5], legends[val], proj, status, source]) - + current_cols.append([rec[5], legends[val], proj, status, src]) + output_dict[current_row] = current_cols return output_dict @@ -870,19 +881,19 @@ def post_bulk_scan(): if objFile is not None: filename = objFile.filename - fileData = pd.read_csv(objFile, dtype={'TubeCode': str}).values.tolist() + ds = pd.read_csv(objFile, dtype={'TubeCode': str}) + fileData = ds.values.tolist() session['scan_data'] = fileData session['scan_file'] = filename return render_template('bulk_scan.html', - **build_login_variables(), - stage = "Visualization", - filename = filename, - data = "", - legends = {}, - table = {}, - status_options = {} - ) - + **build_login_variables(), + stage="Visualization", + filename=filename, + data="", + legends={}, + table={}, + status_options={} + ) elif stage == "Visualization": filename = session.get('scan_file', "") @@ -891,13 +902,13 @@ def post_bulk_scan(): legends = get_legends(criteria) return render_template('bulk_scan.html', - **build_login_variables(), - stage = "Visualization", - filename = filename, - data = criteria, - legends = legends, - table = _compose_table(legends, criteria), - status_options = STATUS_OPTIONS + **build_login_variables(), + stage="Visualization", + filename=filename, + data=criteria, + legends=legends, + table=_compose_table(legends, criteria), + status_options=STATUS_OPTIONS ) elif stage == "Sample_Scan": @@ -909,17 +920,6 @@ def post_bulk_scan(): technician_notes = request.form['technician_notes'] sample_status = request.form['sample_status'] - # action = None - # if send_email: - # action = "send_email" - # else: - # action = "scan_only" - - # issue_type = 'sample' - # template = sample_status - # received_type = None - # recorded_type = request.form.get('recorded_type') - # Do the actual update status, response = APIRequest.post( '/api/admin/scan/%s' % sample_barcode, @@ -933,29 +933,27 @@ def post_bulk_scan(): criteria = session.get('recent_criteria', "Project") legends = get_legends(criteria) return render_template('bulk_scan.html', - **build_login_variables(), - stage = "Visualization", - filename = filename, - data = criteria, - legends = legends, - table = _compose_table(legends, criteria), - status_options = STATUS_OPTIONS + **build_login_variables(), + stage="Visualization", + filename=filename, + data=criteria, + legends=legends, + table=_compose_table(legends, criteria), + status_options=STATUS_OPTIONS ) - - @app.route('/scan-bulk', methods=['GET', 'POST']) def bulk_scan(): if request.method == 'GET': return render_template('bulk_scan.html', - **build_login_variables(), - stage = "Scanning", - filename = "", - data = "", - legends = {}, - table = {}, - status_options = {} + **build_login_variables(), + stage="Scanning", + filename="", + data="", + legends={}, + table={}, + status_options={} ) if request.method == 'POST': From d95529c740262d4a779d4cf6aa35fee972a0e5b5 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 23 Feb 2023 23:24:05 +0530 Subject: [PATCH 04/24] testing workflow --- microsetta_admin/templates/create_kits.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsetta_admin/templates/create_kits.html b/microsetta_admin/templates/create_kits.html index 90ede1a..56d6313 100644 --- a/microsetta_admin/templates/create_kits.html +++ b/microsetta_admin/templates/create_kits.html @@ -7,7 +7,7 @@ // Initialize form validation on the registration form. // It has the name attribute "registration" $("form[name='kit_form']").validate({ - // Specify validation rules + // Specify validation rule rules: { // The key name on the left side is the name attribute // of an input field. Validation rules are defined From cd9b609b8b8e6d3751aa6d6363ba6ecacc8f2f60 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 23 Feb 2023 23:28:25 +0530 Subject: [PATCH 05/24] removing test change --- microsetta_admin/templates/create_kits.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsetta_admin/templates/create_kits.html b/microsetta_admin/templates/create_kits.html index 56d6313..90ede1a 100644 --- a/microsetta_admin/templates/create_kits.html +++ b/microsetta_admin/templates/create_kits.html @@ -7,7 +7,7 @@ // Initialize form validation on the registration form. // It has the name attribute "registration" $("form[name='kit_form']").validate({ - // Specify validation rule + // Specify validation rules rules: { // The key name on the left side is the name attribute // of an input field. Validation rules are defined From 24bc3cc7b08b3504db79a8b0e5edbbd709e05c6f Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 9 Mar 2023 08:18:06 +0530 Subject: [PATCH 06/24] address PR comments --- microsetta_admin/server.py | 168 +++++++++++++++++++------------------ 1 file changed, 85 insertions(+), 83 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index fbb7bed..2faf7c0 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -775,10 +775,14 @@ def scan(): recorded_type) -def get_legends(criteria): +def _get_color_code(): + val = '0123456789ABCDEF' + code = ["#"+''.join([random.choice(val) for i in range(6)])] + return code[0] + +def _get_legends(criteria): dict = {} - hex = 'ABCDEF0123456789' if criteria not in session: status, fields = APIRequest.get( '/api/admin/barcode_query_fields') @@ -787,39 +791,33 @@ def get_legends(criteria): for obj in fields: if criteria == "Type" and obj["label"] == "Sample Site": for val in obj["values"]: - code = [random.choice(hex) for i in range(6)] - color_code = ['#' + ''.join(code)] - while color_code[0] in dict: - code = [random.choice(hex) for i in range(6)] - color_code = ['#' + ''.join(code)] - dict[obj["values"][val]] = color_code[0] + color_code = _get_color_code() + while color_code in dict: + color_code = _get_color_code() + dict[obj["values"][val]] = color_code if criteria == "Status" and obj["label"] == "Sample Status": for val in obj["values"]: - code = [random.choice(hex) for i in range(6)] - color_code = ['#' + ''.join(code)] - while color_code[0] in dict: - code = [random.choice(hex) for i in range(6)] - color_code = ['#' + ''.join(code)] + color_code = _get_color_code() + while color_code in dict: + color_code = _get_color_code() tmp = obj["values"][val].replace(' ', '-').lower() - dict[tmp] = color_code[0] + dict[tmp] = color_code if criteria == "Project" and obj["label"] == "Project": for val in obj["values"]: if not ('-' in obj["values"][val]): - code = [random.choice(hex) for i in range(6)] - color_code = ['#' + ''.join(code)] - while color_code[0] in dict: - code = [random.choice(hex) for i in range(6)] - color_code = ['#' + ''.join(code)] - dict[obj["values"][val]] = color_code[0] + color_code = _get_color_code() + while color_code in dict: + color_code = _get_color_code() + dict[obj["values"][val]] = color_code if len(dict) > 0: dict['None'] = "#000000" session[criteria] = dict else: dict = session.get(criteria) - print(str(dict)) + return dict @@ -873,74 +871,72 @@ def _compose_table(legends, type): return output_dict -def post_bulk_scan(): - stage = request.form["stage"] +def _visualize_scans(): + filename = session.get('scan_file', "") + criteria = request.form['sort_criteria'] + session['recent_criteria'] = criteria + legends = _get_legends(criteria) - if stage == "Scanning": - objFile = request.files['file_picker'] - - if objFile is not None: - filename = objFile.filename - ds = pd.read_csv(objFile, dtype={'TubeCode': str}) - fileData = ds.values.tolist() - session['scan_data'] = fileData - session['scan_file'] = filename - return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data="", - legends={}, - table={}, - status_options={} - ) - - elif stage == "Visualization": - filename = session.get('scan_file', "") - criteria = request.form['sort_criteria'] - session['recent_criteria'] = criteria - legends = get_legends(criteria) + return render_template('bulk_scan.html', + **build_login_variables(), + stage="Visualization", + filename=filename, + data=criteria, + legends=legends, + table=_compose_table(legends, criteria), + status_options=STATUS_OPTIONS + ) - return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data=criteria, - legends=legends, - table=_compose_table(legends, criteria), - status_options=STATUS_OPTIONS - ) - elif stage == "Sample_Scan": +def _post_bulk_scan_add(): + send_email = request.form.get('send_email', False) + session[SEND_EMAIL_CHECKBOX_DEFAULT_NAME] = send_email - send_email = request.form.get('send_email', False) - session[SEND_EMAIL_CHECKBOX_DEFAULT_NAME] = send_email - - sample_barcode = request.form['sample_barcode'] - technician_notes = request.form['technician_notes'] - sample_status = request.form['sample_status'] + sample_barcode = request.form['sample_barcode'] + technician_notes = request.form['technician_notes'] + sample_status = request.form['sample_status'] - # Do the actual update - status, response = APIRequest.post( - '/api/admin/scan/%s' % sample_barcode, - json={ - "sample_status": sample_status, - "technician_notes": technician_notes - } - ) + # Do the actual update + status, response = APIRequest.post( + '/api/admin/scan/%s' % sample_barcode, + json={ + "sample_status": sample_status, + "technician_notes": technician_notes + } + ) - filename = session.get('scan_file', "") - criteria = session.get('recent_criteria', "Project") - legends = get_legends(criteria) + filename = session.get('scan_file', "") + criteria = session.get('recent_criteria', "Project") + legends = _get_legends(criteria) + return render_template('bulk_scan.html', + **build_login_variables(), + stage="Visualization", + filename=filename, + data=criteria, + legends=legends, + table=_compose_table(legends, criteria), + status_options=STATUS_OPTIONS + ) + + +def _post_bulk_scan(): + obj_file = request.files['file_picker'] + + if obj_file is not None: + filename = obj_file.filename + ds = pd.read_csv(obj_file, dtype={'TubeCode': str}) + file_data = ds.values.tolist() + session['scan_data'] = file_data + session['scan_file'] = filename return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data=criteria, - legends=legends, - table=_compose_table(legends, criteria), - status_options=STATUS_OPTIONS - ) + **build_login_variables(), + stage="Visualization", + filename=filename, + data="", + legends={}, + table={}, + status_options={} + ) @app.route('/scan-bulk', methods=['GET', 'POST']) @@ -957,7 +953,13 @@ def bulk_scan(): ) if request.method == 'POST': - return post_bulk_scan() + stage = request.form["stage"] + if stage == "Scanning": + return _post_bulk_scan() + elif stage == "Visualization": + return _visualize_scans() + elif stage == "Sample_Scan": + return _post_bulk_scan_add() @app.route('/metadata_pulldown', methods=['GET', 'POST']) From 006d59be64301fbd39d733377984337b289c9f19 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Fri, 24 Mar 2023 13:38:19 -0400 Subject: [PATCH 07/24] DB changes for barcode bulk_scan --- microsetta_admin/server.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 2faf7c0..9c98320 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -888,6 +888,20 @@ def _visualize_scans(): ) +def _get_barcode_rack(barcode): + data = session.get('scan_data') + obj = {} + + for rec in data: + if rec[5] == barcode: + obj["rack_id"] = rec[6] + obj["location_col"] = str(int(rec[3])) + obj["location_row"] = rec[4] + return obj + + return obj + + def _post_bulk_scan_add(): send_email = request.form.get('send_email', False) session[SEND_EMAIL_CHECKBOX_DEFAULT_NAME] = send_email @@ -905,6 +919,14 @@ def _post_bulk_scan_add(): } ) + if status == 201: + data = _get_barcode_rack(sample_barcode) + if bool(data): + status, response = APIRequest.post( + '/api/admin/rack/%s/add' % sample_barcode, + json=data + ) + filename = session.get('scan_file', "") criteria = session.get('recent_criteria', "Project") legends = _get_legends(criteria) @@ -941,6 +963,7 @@ def _post_bulk_scan(): @app.route('/scan-bulk', methods=['GET', 'POST']) def bulk_scan(): + if request.method == 'GET': return render_template('bulk_scan.html', **build_login_variables(), From 041a037a15528b655d07c04a159ce0115e8d57be Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Fri, 24 Mar 2023 13:59:07 -0400 Subject: [PATCH 08/24] fix lint errors --- microsetta_admin/server.py | 49 +++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 9c98320..61f0961 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -780,6 +780,7 @@ def _get_color_code(): code = ["#"+''.join([random.choice(val) for i in range(6)])] return code[0] + def _get_legends(criteria): dict = {} @@ -878,14 +879,14 @@ def _visualize_scans(): legends = _get_legends(criteria) return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data=criteria, - legends=legends, - table=_compose_table(legends, criteria), - status_options=STATUS_OPTIONS - ) + **build_login_variables(), + stage="Visualization", + filename=filename, + data=criteria, + legends=legends, + table=_compose_table(legends, criteria), + status_options=STATUS_OPTIONS + ) def _get_barcode_rack(barcode): @@ -931,14 +932,14 @@ def _post_bulk_scan_add(): criteria = session.get('recent_criteria', "Project") legends = _get_legends(criteria) return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data=criteria, - legends=legends, - table=_compose_table(legends, criteria), - status_options=STATUS_OPTIONS - ) + **build_login_variables(), + stage="Visualization", + filename=filename, + data=criteria, + legends=legends, + table=_compose_table(legends, criteria), + status_options=STATUS_OPTIONS + ) def _post_bulk_scan(): @@ -951,14 +952,14 @@ def _post_bulk_scan(): session['scan_data'] = file_data session['scan_file'] = filename return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data="", - legends={}, - table={}, - status_options={} - ) + **build_login_variables(), + stage="Visualization", + filename=filename, + data="", + legends={}, + table={}, + status_options={} + ) @app.route('/scan-bulk', methods=['GET', 'POST']) From 7d2454be7f46f792abed461c8491340376e3863c Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Mon, 3 Apr 2023 11:21:29 -0400 Subject: [PATCH 09/24] fix color coding and PR feedback --- microsetta_admin/server.py | 45 ++++++++++++----------- microsetta_admin/templates/bulk_scan.html | 16 +++----- 2 files changed, 28 insertions(+), 33 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 61f0961..24e3be0 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -776,9 +776,15 @@ def scan(): def _get_color_code(): - val = '0123456789ABCDEF' - code = ["#"+''.join([random.choice(val) for i in range(6)])] - return code[0] + # val = '0123456789ABCDEF' + # code = ["#"+''.join([random.choice(val) for i in range(6)])] + codes = ["#C0C0C0", "#808080", "#800000", "#FF0000", "#800080", "#FF00FF", + "#008000", "#00FF00", "#FFd700", "#000080", "#0000FF", "#00FFFF", + "#FFE4C4", "#7FFFD4", "#DEB887", "#FF7F50", "#6495ED", "#FF8C00", + "#FF1493", "#00BFFF", "#1E90FF", "#DAA520", "#4B0082", "#F0E68C", + "#90EE90", "#778899", "#FFA500", "#BC8F8F", "#D8BFD8", "#DCDCDC"] + + return codes[random.randrange(0, len(codes)-1)] def _get_legends(criteria): @@ -790,28 +796,23 @@ def _get_legends(criteria): if status == 200: for obj in fields: - if criteria == "Type" and obj["label"] == "Sample Site": + if obj["label"] == criteria: for val in obj["values"]: - color_code = _get_color_code() - while color_code in dict: + color_code = None + if criteria == "Project" and not ('-' in obj["values"][val]): color_code = _get_color_code() - dict[obj["values"][val]] = color_code - - if criteria == "Status" and obj["label"] == "Sample Status": - for val in obj["values"]: - color_code = _get_color_code() - while color_code in dict: + elif criteria == "Sample Status" or criteria == "Sample Site": color_code = _get_color_code() - tmp = obj["values"][val].replace(' ', '-').lower() - dict[tmp] = color_code - if criteria == "Project" and obj["label"] == "Project": - for val in obj["values"]: - if not ('-' in obj["values"][val]): - color_code = _get_color_code() - while color_code in dict: + if color_code is not None: + while color_code in dict.values(): color_code = _get_color_code() - dict[obj["values"][val]] = color_code + + if criteria == "Sample Status": + tmp = obj["values"][val].replace(' ', '-').lower() + dict[tmp] = color_code + else: + dict[obj["values"][val]] = color_code if len(dict) > 0: dict['None'] = "#000000" @@ -838,9 +839,9 @@ def _compose_table(legends, type): status = data["sample"]["_latest_scan_status"] src = data["sample"]["site"] - if type == "Type": + if type == "Sample Site": val = data["sample"]["site"] - elif type == "Status": + elif type == "Sample Status": val = data["sample"]["_latest_scan_status"] elif type == "Project": val = data["sample"]["sample_projects"][0] diff --git a/microsetta_admin/templates/bulk_scan.html b/microsetta_admin/templates/bulk_scan.html index 7225618..c5f9f93 100644 --- a/microsetta_admin/templates/bulk_scan.html +++ b/microsetta_admin/templates/bulk_scan.html @@ -73,10 +73,6 @@ {% endblock %} {% block content %} @@ -126,6 +135,16 @@

    Microsetta Scan - Bulk

    + + + + + + @@ -151,6 +170,7 @@

    Microsetta Scan - Bulk

    + @@ -193,7 +213,15 @@

    Microsetta Scan - Bulk

    {% endfor %} - +
    +
    + {% if 'Success' in message %} +

    {{ message }}

    + {% endif %} + {% if 'Error' in message %} +

    {{ message }}

    + {% endif %} +
    {% endif %} From bc1045b4541fbde4e0f4222c1096a0eaf0c8c25d Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 4 May 2023 13:25:42 -0400 Subject: [PATCH 14/24] fix lint --- microsetta_admin/server.py | 62 ++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 30 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 96a1c1d..ae13d89 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -3,7 +3,8 @@ import secrets from datetime import datetime import io -import random, math +import random +import math from jwt import PyJWTError from werkzeug.exceptions import BadRequest @@ -835,18 +836,19 @@ def _get_legends(criteria): def _compose_table(legends, type): output_dict = {} scanned_data = session.get('scan_data') - current_row = "" - current_cols = [] + curr_row = "" + curr_cols = [] for rec in scanned_data: - + status, response = APIRequest.get( '/api/admin/rack/sample/%s' % rec ) + code = response['barcode'] if status == 201: status, data = APIRequest.get( - '/api/admin/search/samples/%s' % response['barcode'] + '/api/admin/search/samples/%s' % code ) val = "" @@ -861,30 +863,30 @@ def _compose_table(legends, type): elif type == "Project": val = data["sample"]["sample_projects"][0] - if current_row == "": - current_row = response['location_row'] + if curr_row == "": + curr_row = response['location_row'] if val is None or val == "": tmp = legends['None'] - current_cols.append([response['barcode'], tmp, proj, status, src]) + curr_cols.append([code, tmp, proj, status, src]) else: - current_cols.append([response['barcode'], legends[val], proj, status, src]) - elif current_row == response['location_row']: + curr_cols.append([code, legends[val], proj, status, src]) + elif curr_row == response['location_row']: if val is None: tmp = legends['None'] - current_cols.append([response['barcode'], tmp, proj, status, src]) + curr_cols.append([code, tmp, proj, status, src]) else: - current_cols.append([response['barcode'], legends[val], proj, status, src]) + curr_cols.append([code, legends[val], proj, status, src]) else: - output_dict[current_row] = current_cols - current_cols = [] - current_row = response['location_row'] + output_dict[curr_row] = curr_cols + curr_cols = [] + curr_row = response['location_row'] if val is None: tmp = legends['None'] - current_cols.append([response['barcode'], tmp, proj, status, src]) + curr_cols.append([code, tmp, proj, status, src]) else: - current_cols.append([response['barcode'], legends[val], proj, status, src]) + curr_cols.append([code, legends[val], proj, status, src]) - output_dict[current_row] = current_cols + output_dict[curr_row] = curr_cols return output_dict @@ -925,9 +927,9 @@ def _post_bulk_scan_add(): message = "" if status == 201: - message="Success: Sample scanned successfully!" + message = "Success: Sample scanned successfully!" else: - message="Error: Unable to scan sample!" + message = "Error: Unable to scan sample!" filename = session.get('scan_file', "") criteria = session.get('recent_criteria', "Project") @@ -957,7 +959,7 @@ def _post_bulk_scan(): for rec in file_data: status, response = APIRequest.get( '/api/admin/rack/sample/%s' % rec[6],) - + if status == 404: obj = {} obj["rack_id"] = rec[6] @@ -980,15 +982,15 @@ def _post_bulk_scan(): session['scan_data'] = scanned_samples return render_template('bulk_scan.html', - **build_login_variables(), - stage="Visualization", - filename=filename, - data=sort_criteria, - legends=legends, - table=_compose_table(legends, sort_criteria), - status_options=STATUS_OPTIONS, - message="" - ) + **build_login_variables(), + stage="Visualization", + filename=filename, + data=sort_criteria, + legends=legends, + table=_compose_table(legends, sort_criteria), + status_options=STATUS_OPTIONS, + message="" + ) @app.route('/scan-bulk', methods=['GET', 'POST']) From 6dbf853561968094ea8888299cb53442cd3bd9ac Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Wed, 10 May 2023 12:12:07 -0400 Subject: [PATCH 15/24] address PR comments --- microsetta_admin/server.py | 11 ++++++++--- microsetta_admin/templates/bulk_scan.html | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index ae13d89..0418b2e 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -949,6 +949,7 @@ def _post_bulk_scan_add(): def _post_bulk_scan(): obj_file = request.files['file_picker'] sort_criteria = request.form['sort_criteria'] + error_msg = "" if obj_file is not None: filename = obj_file.filename @@ -956,6 +957,7 @@ def _post_bulk_scan(): file_data = ds.values.tolist() scanned_samples = [] + rowCnt = 1 for rec in file_data: status, response = APIRequest.get( '/api/admin/rack/sample/%s' % rec[6],) @@ -964,11 +966,13 @@ def _post_bulk_scan(): obj = {} obj["rack_id"] = rec[6] if math.isnan(rec[3]): - obj['location_col'] = 'None' + error_msg = "Error: Empty column in row number" + rowCnt + break else: obj["location_col"] = str(int(rec[3])) if math.isnan(rec[4]): - obj['location_row'] = 'None' + error_msg = "Error: Empty row in row number " + rowCnt + break else: obj["location_row"] = rec[4] sample_barcode = rec[5] @@ -977,6 +981,7 @@ def _post_bulk_scan(): json=obj ) scanned_samples.append(rec[6]) + rowCnt += 1 legends = _get_legends(sort_criteria) session['scan_data'] = scanned_samples @@ -989,7 +994,7 @@ def _post_bulk_scan(): legends=legends, table=_compose_table(legends, sort_criteria), status_options=STATUS_OPTIONS, - message="" + message=error_msg ) diff --git a/microsetta_admin/templates/bulk_scan.html b/microsetta_admin/templates/bulk_scan.html index 9fbac75..a3a19cb 100644 --- a/microsetta_admin/templates/bulk_scan.html +++ b/microsetta_admin/templates/bulk_scan.html @@ -138,7 +138,7 @@

    Microsetta Scan - Bulk

    - From b6217c0509becc53cd8ea7fac455dfb4f60cd75d Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Fri, 12 May 2023 09:51:03 -0400 Subject: [PATCH 16/24] fix isnan code block --- microsetta_admin/server.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 0418b2e..ca08bd7 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -954,8 +954,9 @@ def _post_bulk_scan(): if obj_file is not None: filename = obj_file.filename ds = pd.read_csv(obj_file, dtype={'TubeCode': str, 'RackID': str}) + ds['LocationRow'] = ds['LocationRow'].fillna('') file_data = ds.values.tolist() - + print(str(file_data)) scanned_samples = [] rowCnt = 1 for rec in file_data: @@ -966,12 +967,16 @@ def _post_bulk_scan(): obj = {} obj["rack_id"] = rec[6] if math.isnan(rec[3]): - error_msg = "Error: Empty column in row number" + rowCnt + error_msg = "Error: Empty column in row number" + str(rowCnt) break else: obj["location_col"] = str(int(rec[3])) - if math.isnan(rec[4]): - error_msg = "Error: Empty row in row number " + rowCnt + + #Since pandas is being used to read the entire csv file, + #missing value for row will be replaced with NaN. + #Check if value if missing for any rows + if len(rec[4]) == 0: + error_msg = "Error: Empty row in row number " + str(rowCnt) break else: obj["location_row"] = rec[4] From a409836a59cce9daa636ec74237d127d9936752b Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Fri, 12 May 2023 09:57:55 -0400 Subject: [PATCH 17/24] fix lint --- microsetta_admin/server.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index ca08bd7..3f16ac0 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -956,7 +956,7 @@ def _post_bulk_scan(): ds = pd.read_csv(obj_file, dtype={'TubeCode': str, 'RackID': str}) ds['LocationRow'] = ds['LocationRow'].fillna('') file_data = ds.values.tolist() - print(str(file_data)) + scanned_samples = [] rowCnt = 1 for rec in file_data: @@ -967,14 +967,12 @@ def _post_bulk_scan(): obj = {} obj["rack_id"] = rec[6] if math.isnan(rec[3]): - error_msg = "Error: Empty column in row number" + str(rowCnt) + error_msg = "Error: Empty column in row number " + error_msg += str(rowCnt) break else: obj["location_col"] = str(int(rec[3])) - #Since pandas is being used to read the entire csv file, - #missing value for row will be replaced with NaN. - #Check if value if missing for any rows if len(rec[4]) == 0: error_msg = "Error: Empty row in row number " + str(rowCnt) break From e5c2bb7b1f130e128fe75f8ffe07401f21843228 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Tue, 16 May 2023 15:43:01 -0400 Subject: [PATCH 18/24] fix sample sorting --- microsetta_admin/server.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 3f16ac0..9944729 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -844,9 +844,11 @@ def _compose_table(legends, type): status, response = APIRequest.get( '/api/admin/rack/sample/%s' % rec ) - code = response['barcode'] + samples = response['result'] + + for obj in samples: + code = obj['barcode'] - if status == 201: status, data = APIRequest.get( '/api/admin/search/samples/%s' % code ) @@ -864,13 +866,13 @@ def _compose_table(legends, type): val = data["sample"]["sample_projects"][0] if curr_row == "": - curr_row = response['location_row'] + curr_row = obj['location_row'] if val is None or val == "": tmp = legends['None'] curr_cols.append([code, tmp, proj, status, src]) else: curr_cols.append([code, legends[val], proj, status, src]) - elif curr_row == response['location_row']: + elif curr_row == obj['location_row']: if val is None: tmp = legends['None'] curr_cols.append([code, tmp, proj, status, src]) @@ -879,7 +881,7 @@ def _compose_table(legends, type): else: output_dict[curr_row] = curr_cols curr_cols = [] - curr_row = response['location_row'] + curr_row = obj['location_row'] if val is None: tmp = legends['None'] curr_cols.append([code, tmp, proj, status, src]) @@ -946,6 +948,16 @@ def _post_bulk_scan_add(): ) +def _sample_exists_in_rack(sample_id, rack_samples): + result = False + + for sample in rack_samples: + if sample_id == sample["barcode"]: + result = True + break + return result + + def _post_bulk_scan(): obj_file = request.files['file_picker'] sort_criteria = request.form['sort_criteria'] @@ -963,7 +975,7 @@ def _post_bulk_scan(): status, response = APIRequest.get( '/api/admin/rack/sample/%s' % rec[6],) - if status == 404: + if status == 404 or _sample_exists_in_rack(rec[5], response['result']) == False: obj = {} obj["rack_id"] = rec[6] if math.isnan(rec[3]): @@ -983,7 +995,9 @@ def _post_bulk_scan(): '/api/admin/rack/%s/add' % sample_barcode, json=obj ) - scanned_samples.append(rec[6]) + + if rec[6] not in scanned_samples: + scanned_samples.append(rec[6]) rowCnt += 1 legends = _get_legends(sort_criteria) From 128d5110df8adbeef514baeb224b8fe7fcc621e5 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Tue, 16 May 2023 16:05:42 -0400 Subject: [PATCH 19/24] fix lint errors --- microsetta_admin/server.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 9944729..1aec857 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -950,7 +950,7 @@ def _post_bulk_scan_add(): def _sample_exists_in_rack(sample_id, rack_samples): result = False - + for sample in rack_samples: if sample_id == sample["barcode"]: result = True @@ -975,7 +975,11 @@ def _post_bulk_scan(): status, response = APIRequest.get( '/api/admin/rack/sample/%s' % rec[6],) - if status == 404 or _sample_exists_in_rack(rec[5], response['result']) == False: + res = False + if status is not 404: + res = _sample_exists_in_rack(rec[5], response['result']) + + if status == 404 or res is False: obj = {} obj["rack_id"] = rec[6] if math.isnan(rec[3]): @@ -995,7 +999,7 @@ def _post_bulk_scan(): '/api/admin/rack/%s/add' % sample_barcode, json=obj ) - + if rec[6] not in scanned_samples: scanned_samples.append(rec[6]) rowCnt += 1 From 030bd521a064bbfe051e842ea1b4bfb0b46410c8 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Tue, 16 May 2023 16:10:36 -0400 Subject: [PATCH 20/24] fix lint --- microsetta_admin/server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 1aec857..85aa8ff 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -976,7 +976,7 @@ def _post_bulk_scan(): '/api/admin/rack/sample/%s' % rec[6],) res = False - if status is not 404: + if status != 404: res = _sample_exists_in_rack(rec[5], response['result']) if status == 404 or res is False: From 9e4bd755eb76ef03cf9fba6a9416926f2aedbdc9 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Wed, 17 May 2023 00:44:42 -0400 Subject: [PATCH 21/24] fix project sorting --- microsetta_admin/server.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 85aa8ff..cde5589 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -808,8 +808,7 @@ def _get_legends(criteria): for val in obj["values"]: color_code = None if criteria == "Project": - if not ('-' in obj["values"][val]): - color_code = _get_color_code(cnt) + color_code = _get_color_code(cnt) elif "Sample" in criteria: color_code = _get_color_code(cnt) From 463490c2b73fe345603b186b0e0748d7c013ff10 Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Thu, 1 Jun 2023 13:40:59 -0400 Subject: [PATCH 22/24] PR feedbaxck --- microsetta_admin/server.py | 82 +++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 42 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index cde5589..9878838 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -5,6 +5,7 @@ import io import random import math +import uuid from jwt import PyJWTError from werkzeug.exceptions import BadRequest @@ -835,13 +836,14 @@ def _get_legends(criteria): def _compose_table(legends, type): output_dict = {} scanned_data = session.get('scan_data') + bulk_scan_id = session.get('bulk_scan_id', '') curr_row = "" curr_cols = [] for rec in scanned_data: status, response = APIRequest.get( - '/api/admin/rack/sample/%s' % rec + '/api/admin/rack/%s/sample/%s' % (bulk_scan_id, rec) ) samples = response['result'] @@ -947,20 +949,13 @@ def _post_bulk_scan_add(): ) -def _sample_exists_in_rack(sample_id, rack_samples): - result = False - - for sample in rack_samples: - if sample_id == sample["barcode"]: - result = True - break - return result - - def _post_bulk_scan(): obj_file = request.files['file_picker'] sort_criteria = request.form['sort_criteria'] error_msg = "" + scanned_samples = [] + legends = _get_legends(sort_criteria) + bulk_scan_id = str(uuid.uuid4()) if obj_file is not None: filename = obj_file.filename @@ -968,44 +963,35 @@ def _post_bulk_scan(): ds['LocationRow'] = ds['LocationRow'].fillna('') file_data = ds.values.tolist() - scanned_samples = [] - rowCnt = 1 + row_cnt = 1 for rec in file_data: - status, response = APIRequest.get( - '/api/admin/rack/sample/%s' % rec[6],) - - res = False - if status != 404: - res = _sample_exists_in_rack(rec[5], response['result']) - - if status == 404 or res is False: - obj = {} - obj["rack_id"] = rec[6] - if math.isnan(rec[3]): - error_msg = "Error: Empty column in row number " - error_msg += str(rowCnt) - break - else: - obj["location_col"] = str(int(rec[3])) + obj = {} + obj["rack_id"] = rec[6] + if math.isnan(rec[3]): + error_msg = "Error: Empty column in row number " + error_msg += str(row_cnt) + break + else: + obj["location_col"] = str(int(rec[3])) - if len(rec[4]) == 0: - error_msg = "Error: Empty row in row number " + str(rowCnt) - break - else: - obj["location_row"] = rec[4] - sample_barcode = rec[5] - status, response = APIRequest.post( - '/api/admin/rack/%s/add' % sample_barcode, - json=obj - ) + if len(rec[4]) == 0: + error_msg = "Error: Empty row in row number " + str(row_cnt) + break + else: + obj["location_row"] = rec[4] + sample_barcode = rec[5] + obj['bulk_scan_id'] = bulk_scan_id + status, response = APIRequest.post( + '/api/admin/rack/%s/add' % sample_barcode, + json=obj + ) if rec[6] not in scanned_samples: scanned_samples.append(rec[6]) - rowCnt += 1 + row_cnt += 1 - legends = _get_legends(sort_criteria) session['scan_data'] = scanned_samples - + session['bulk_scan_id'] = bulk_scan_id return render_template('bulk_scan.html', **build_login_variables(), stage="Visualization", @@ -1016,6 +1002,18 @@ def _post_bulk_scan(): status_options=STATUS_OPTIONS, message=error_msg ) + else: + error_msg = "Invalid file type! Please check the file and try again." + return render_template('bulk_scan.html', + **build_login_variables(), + stage="Scanning", + filename=filename, + data=sort_criteria, + legends=legends, + table=_compose_table(legends, sort_criteria), + status_options=STATUS_OPTIONS, + message=error_msg + ) @app.route('/scan-bulk', methods=['GET', 'POST']) From aa64cb50097b7341fb0479fadec181564d5dfefb Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Tue, 6 Jun 2023 11:57:14 -0400 Subject: [PATCH 23/24] PR feedback --- microsetta_admin/server.py | 36 ++++++++++++++--------- microsetta_admin/templates/bulk_scan.html | 2 ++ 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 9878838..6311bfe 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -6,6 +6,7 @@ import random import math import uuid +import json from jwt import PyJWTError from werkzeug.exceptions import BadRequest @@ -833,9 +834,8 @@ def _get_legends(criteria): return dict -def _compose_table(legends, type): +def _compose_table(legends, type, scanned_data): output_dict = {} - scanned_data = session.get('scan_data') bulk_scan_id = session.get('bulk_scan_id', '') curr_row = "" curr_cols = [] @@ -896,6 +896,7 @@ def _compose_table(legends, type): def _visualize_scans(): filename = request.form['scanned_file'] criteria = request.form['sort_criteria'] + samples = json.loads(request.form['scanned_samples']) session['recent_criteria'] = criteria legends = _get_legends(criteria) @@ -905,9 +906,10 @@ def _visualize_scans(): filename=filename, data=criteria, legends=legends, - table=_compose_table(legends, criteria), + table=_compose_table(legends, criteria, samples), status_options=STATUS_OPTIONS, - message="" + message="", + samples=json.dumps(samples) ) @@ -918,6 +920,7 @@ def _post_bulk_scan_add(): sample_barcode = request.form['sample_barcode'] technician_notes = request.form['technician_notes'] sample_status = request.form['sample_status'] + samples = json.loads(request.form['scanned_samples']) # Do the actual update status, response = APIRequest.post( @@ -936,6 +939,7 @@ def _post_bulk_scan_add(): filename = session.get('scan_file', "") criteria = session.get('recent_criteria', "Project") + sample_json = json.dumps(samples) legends = _get_legends(criteria) return render_template('bulk_scan.html', **build_login_variables(), @@ -943,9 +947,10 @@ def _post_bulk_scan_add(): filename=filename, data=criteria, legends=legends, - table=_compose_table(legends, criteria), + table=_compose_table(legends, criteria, samples), status_options=STATUS_OPTIONS, - message=message + message=message, + samples=sample_json ) @@ -953,7 +958,7 @@ def _post_bulk_scan(): obj_file = request.files['file_picker'] sort_criteria = request.form['sort_criteria'] error_msg = "" - scanned_samples = [] + samples = [] legends = _get_legends(sort_criteria) bulk_scan_id = str(uuid.uuid4()) @@ -986,11 +991,11 @@ def _post_bulk_scan(): json=obj ) - if rec[6] not in scanned_samples: - scanned_samples.append(rec[6]) + if rec[6] not in samples: + samples.append(rec[6]) row_cnt += 1 - session['scan_data'] = scanned_samples + samples_json = json.dumps(samples) session['bulk_scan_id'] = bulk_scan_id return render_template('bulk_scan.html', **build_login_variables(), @@ -998,9 +1003,10 @@ def _post_bulk_scan(): filename=filename, data=sort_criteria, legends=legends, - table=_compose_table(legends, sort_criteria), + table=_compose_table(legends, sort_criteria, samples), status_options=STATUS_OPTIONS, - message=error_msg + message=error_msg, + samples=samples_json ) else: error_msg = "Invalid file type! Please check the file and try again." @@ -1012,7 +1018,8 @@ def _post_bulk_scan(): legends=legends, table=_compose_table(legends, sort_criteria), status_options=STATUS_OPTIONS, - message=error_msg + message=error_msg, + samples="" ) @@ -1028,7 +1035,8 @@ def bulk_scan(): legends={}, table={}, status_options={}, - message="" + message="", + samples="" ) if request.method == 'POST': diff --git a/microsetta_admin/templates/bulk_scan.html b/microsetta_admin/templates/bulk_scan.html index a3a19cb..df422e0 100644 --- a/microsetta_admin/templates/bulk_scan.html +++ b/microsetta_admin/templates/bulk_scan.html @@ -171,6 +171,7 @@

    Microsetta Scan - Bulk

    + @@ -233,6 +234,7 @@

    Microsetta Scan - Bulk


    +

    From 8a24ed3a5423ee28e029c7b185e729bf9458e05f Mon Sep 17 00:00:00 2001 From: ragini7913 Date: Tue, 6 Jun 2023 12:13:14 -0400 Subject: [PATCH 24/24] fix lint --- microsetta_admin/server.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/microsetta_admin/server.py b/microsetta_admin/server.py index 6311bfe..a5c539e 100644 --- a/microsetta_admin/server.py +++ b/microsetta_admin/server.py @@ -956,10 +956,10 @@ def _post_bulk_scan_add(): def _post_bulk_scan(): obj_file = request.files['file_picker'] - sort_criteria = request.form['sort_criteria'] + s_type = request.form['sort_criteria'] error_msg = "" samples = [] - legends = _get_legends(sort_criteria) + legends = _get_legends(s_type) bulk_scan_id = str(uuid.uuid4()) if obj_file is not None: @@ -1001,9 +1001,9 @@ def _post_bulk_scan(): **build_login_variables(), stage="Visualization", filename=filename, - data=sort_criteria, + data=s_type, legends=legends, - table=_compose_table(legends, sort_criteria, samples), + table=_compose_table(legends, s_type, samples), status_options=STATUS_OPTIONS, message=error_msg, samples=samples_json @@ -1014,9 +1014,9 @@ def _post_bulk_scan(): **build_login_variables(), stage="Scanning", filename=filename, - data=sort_criteria, + data=s_type, legends=legends, - table=_compose_table(legends, sort_criteria), + table=_compose_table(legends, s_type, samples), status_options=STATUS_OPTIONS, message=error_msg, samples=""