about summary refs log tree commit diff
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",