diff options
Diffstat (limited to 'gn2')
-rw-r--r-- | gn2/wqflask/edit.py | 99 | ||||
-rw-r--r-- | gn2/wqflask/templates/dataset.html | 64 | ||||
-rw-r--r-- | gn2/wqflask/templates/dataset_history.html | 20 | ||||
-rw-r--r-- | gn2/wqflask/views.py | 15 |
4 files changed, 143 insertions, 55 deletions
diff --git a/gn2/wqflask/edit.py b/gn2/wqflask/edit.py index 500d1dae..ebf8449d 100644 --- a/gn2/wqflask/edit.py +++ b/gn2/wqflask/edit.py @@ -5,8 +5,7 @@ from urllib.parse import urljoin from pathlib import Path from gn2.wqflask.oauth2.session import session_info -from pymonad.tools import curry -from pymonad.either import Either, Left +from pymonad.either import Either, Left, Right from flask import (Blueprint, flash, @@ -21,36 +20,52 @@ from gn2.wqflask.oauth2.checks import require_oauth2_edit_resource_access metadata = Blueprint("metadata", __name__) +def __run_cmd__(cmd) -> Either: + """Run a given command and return it's results as an Either monad""" + _result = "" + try: + _result = subprocess.run( + cmd, capture_output=True + ) + except Exception as e_: + return Left({ + "command": cmd, + "error": str(e_), + }) + if _result.stderr: + return Left({ + "command": cmd, + "error": _result.stderr.decode() + }) + return Right(_result.stdout) + + def save_dataset_metadata( git_dir: str, output: str, author: str, content: str, msg: str ) -> Either: """Save dataset metadata to git""" - @curry(2) - def __run_cmd(cmd, status_code): - __result = subprocess.run( - cmd, capture_output=True - ) - if __result.stderr or status_code != 0: + def __write__(): + try: + with Path(output).open(mode="w") as f_: + f_.write(content) + return Right(0) + except Exception as e_: return Left({ - "command": cmd, - "error": __result.stderr.decode() + "command": "Writing to File", + "error": str(e_) }) - return 0 - (Either.insert(0) - .then(__run_cmd(f"git -C {git_dir} reset --hard origin".split(" "))) - .then(__run_cmd(f"git -C {git_dir} pull".split(" ")))) - - with Path(output).open(mode="w") as _f: - _f.write(content) return ( - Either.insert(0) - .then(__run_cmd(f"git -C {git_dir} add .".split(" "))) - .then(__run_cmd(f"git -C {git_dir} commit -m".split(" ") + [ - f'{msg}', f"--author='{author}'", "--no-gpg-sign" - ])) - .then(__run_cmd(f"git -C {git_dir} \ + __run_cmd__(f"git -C {git_dir} reset --hard origin".split(" ")) + .then(lambda _: __run_cmd__(f"git -C {git_dir} pull".split(" "))) + .then(lambda _: __write__()) + .then(lambda _: __run_cmd__(f"git -C {git_dir} add .".split(" "))) + .then(lambda _: __run_cmd__( + f"git -C {git_dir} commit -m".split(" ") + [ + f'{msg}', f"--author='{author}'", "--no-gpg-sign" + ])) + .then(lambda _: __run_cmd__(f"git -C {git_dir} \ push origin master --dry-run".split(" "))) ) @@ -139,3 +154,41 @@ def save(): return redirect( f"/datasets/{request.form.get('label')}" ) + + +def __fetch_dataset_git_history__( + git_dir:str , dataset_name: str +) -> Either: + """Fetch the git history of a given dataset.""" + # Age, Commit, Message, Author + dataset_path = Path(git_dir) / "general/datasets/" / dataset_name + format_ = "<tr><td><i>%cr</i></td>\ +<td>\ +<a style='color:green;' href='https://git.genenetwork.org/gn-docs/commit/general?id=%H' \ +target='_blank'>%h</a></td>\ +<td>%s</td><td>%an</td></tr>" + args = [ + "git", "-C", str(dataset_path), "log", + f"--pretty=format:{format_}" + ] + results = __run_cmd__( + args + ) + return results + + +@metadata.route("<id_>/history") +def view_history(id_): + """View a datasets history""" + from gn2.utility.tools import get_setting + data = __fetch_dataset_git_history__( + Path(get_setting("DATA_DIR"), "gn-docs"), id_ + ).either( + lambda error: flash(f"{error=}", error), + lambda x: x + ) + return render_template( + "dataset_history.html", + name=request.args.get("name",""), + data=data.decode() + ) diff --git a/gn2/wqflask/templates/dataset.html b/gn2/wqflask/templates/dataset.html index 570401c9..1e2c5bc4 100644 --- a/gn2/wqflask/templates/dataset.html +++ b/gn2/wqflask/templates/dataset.html @@ -73,21 +73,27 @@ {% if dataset %} -<header class="page-header text-justify"> - <h1> - {% if dataset.title or dataset.label or dataset.altLabel %} - {{ dataset.title or dataset.label or dataset.altLabel }} - {% if dataset.title != dataset.altLabel and dataset.label != dataset.altLabel %} - <br/> - <small>({{ dataset.altLabel }})</small> - {% endif %} - {% else %} - {{ name }} - {% endif %} - </h1> -</header> - <div class="container dataset-content"> + <header class="page-header text-justify"> + <h1> + {% if dataset.title or dataset.label or dataset.altLabel %} + {{ dataset.title or dataset.label or dataset.altLabel }} + {% if dataset.title != dataset.altLabel and dataset.label != dataset.altLabel %} + <br/> + <small>({{ dataset.altLabel }})</small> + {% endif %} + {% else %} + {{ name }} + {% endif %} + <small> + <sup> + [ + <a hx-get={{ url_for('metadata.view_history', id_=dataset.id.split('/')[-1], name=name, title=(dataset.title or dataset.label or dataset.altLabel)) }} hx-target=".dataset-content" hx-push-url="true" hx-select="#history">History</a> + ] + </sup> + </small> + </h1> + </header> <div class="panel-about panel panel-info panel-metadata text-muted"> <div class="panel-heading"> <strong> @@ -175,7 +181,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=description&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=description&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -189,7 +195,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=experimentType&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=experimentType&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -203,7 +209,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=specifics&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=specifics&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -217,7 +223,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=experimentDesignInfo&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=experimentDesignInfo&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -231,7 +237,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=caseInfo&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=caseInfo&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -247,7 +253,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=tissueInfo&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=tissueInfo&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -261,7 +267,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=platformInfo&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=platformInfo&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -275,7 +281,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=processingInfo&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=processingInfo&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -289,7 +295,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=notes&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=notes&name={{ dataset.label}}">edit</a> ] </sup> </h3> @@ -303,7 +309,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=citation&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=citation&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -317,7 +323,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=acknowledgement&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=acknowledgement&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -331,7 +337,7 @@ {% if dataset.editable %} <sup> [ - <a href="/metadata/edit?type=dcat:Dataset§ion=contributors&name={{ dataset.label}}" target="_blank">edit</a> + <a href="/metadata/edit?type=dcat:Dataset§ion=contributors&name={{ dataset.label}}">edit</a> ] </sup> {% endif %} @@ -349,3 +355,9 @@ {% endif %} {% endblock %} + +{% block js %} + +<script language="javascript" type="text/javascript" src="{{ url_for('js', filename='htmx.min.js') }}"></script> + +{% endblock %} diff --git a/gn2/wqflask/templates/dataset_history.html b/gn2/wqflask/templates/dataset_history.html new file mode 100644 index 00000000..15105410 --- /dev/null +++ b/gn2/wqflask/templates/dataset_history.html @@ -0,0 +1,20 @@ +{% extends "base.html" %} + +{% block content %} +<section class="container" id="history"> + {% if data.error %} + <p class="lead">There was an error fetching the history.</p> + {% else %} + <table class=" table-condensed"> + <tr> + <th>Age</th> + <th>Commit</th> + <th>Summary</th> + <th>Author</th> + </tr> + {{ data|safe }} + </table> + {% endif %} +</section> + +{% endblock %} diff --git a/gn2/wqflask/views.py b/gn2/wqflask/views.py index 0dee5b27..074ccae2 100644 --- a/gn2/wqflask/views.py +++ b/gn2/wqflask/views.py @@ -1184,17 +1184,20 @@ def get_dataset(name): from gn2.wqflask.oauth2.request_utils import user_details from gn2.wqflask.oauth2.request_utils import process_error - result = oauth2_get( - f"auth/resource/authorisation/{name}" - ).either( - lambda err: {"roles": []}, - lambda val: val - ) + # We need to use the "id" as the identifier metadata = requests.get( urljoin( GN3_LOCAL_URL, f"/api/metadata/datasets/{name}") ).json() + id_ = metadata.get("id", "").split("/")[-1] + result = oauth2_get( + f"auth/resource/authorisation/{id_}" + ).either( + lambda err: {"roles": []}, + lambda val: val + ) + metadata["editable"] = "group:resource:edit-resource" in result["roles"] return render_template( "dataset.html", |