aboutsummaryrefslogtreecommitdiff
path: root/gn2/wqflask
diff options
context:
space:
mode:
Diffstat (limited to 'gn2/wqflask')
-rw-r--r--gn2/wqflask/edit.py99
-rw-r--r--gn2/wqflask/templates/dataset.html64
-rw-r--r--gn2/wqflask/templates/dataset_history.html20
-rw-r--r--gn2/wqflask/views.py15
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>
+ [&nbsp;
+ <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>
+ &nbsp;]
+ </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>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=description&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=description&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -189,7 +195,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=experimentType&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=experimentType&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -203,7 +209,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=specifics&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=specifics&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -217,7 +223,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=experimentDesignInfo&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=experimentDesignInfo&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -231,7 +237,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=caseInfo&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=caseInfo&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -247,7 +253,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=tissueInfo&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=tissueInfo&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -261,7 +267,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=platformInfo&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=platformInfo&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -275,7 +281,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=processingInfo&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=processingInfo&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -289,7 +295,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=notes&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=notes&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
</h3>
@@ -303,7 +309,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=citation&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=citation&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -317,7 +323,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=acknowledgement&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=acknowledgement&name={{ dataset.label}}">edit</a>
&nbsp;]
</sup>
{% endif %}
@@ -331,7 +337,7 @@
{% if dataset.editable %}
<sup>
[&nbsp;
- <a href="/metadata/edit?type=dcat:Dataset&section=contributors&name={{ dataset.label}}" target="_blank">edit</a>
+ <a href="/metadata/edit?type=dcat:Dataset&section=contributors&name={{ dataset.label}}">edit</a>
&nbsp;]
</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",