aboutsummaryrefslogtreecommitdiff
path: root/gn2/wqflask/edit.py
blob: cf38084d79199384af68f3b751f518782ed71c05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import requests
import subprocess

from pathlib import Path

from pymonad.either import Either, Left

from flask import (Blueprint,
                   flash,
                   redirect,
                   render_template,
                   request)

from gn2.wqflask.decorators import login_required


metadata = Blueprint("metadata", __name__)


def save_dataset_metadata(
        git_dir: str, output: str,
        content: str, msg: str
) -> Either:
    """Save dataset metadata to git"""
    def __run_cmd(cmd, status_code):
        __result = subprocess.run(
            cmd.split(" "), shell=True,
            capture_output=True
        )
        if __result.stderr or status_code != 0:
            return Left({
                "command": cmd,
                "error": __result.stderr.decode()
            })
        return 0

    with Path(output) as _f:
        _f.write(content)

    return (
        Either.insert(0)
        .then(__run_cmd(f"git -C {git_dir} pull"))
        .then(__run_cmd(f"git -C {git_dir} add ."))
        .then(__run_cmd(f"git -C {git_dir} commit --all --message {msg}"))
        .then(__run_cmd(f"git -C {git_dir} push origin master --dry-run"))
    )


@metadata.route("/edit")
@login_required(pagename="Dataset Metadata Editing")
def metadata_edit():
    from gn2.utility.tools import GN3_LOCAL_URL
    match request.args.get("type"):
        case "dcat:Dataset":
            metadata = requests.get(
                Path(
                    GN3_LOCAL_URL,
                    "metadata/datasets/",
                    (_name := request.args.get("name"))
                ).as_posix()
            ).json()
            __section = request.args.get("section")
            return render_template(
                "metadata/editor.html",
                name=_name,
                metadata=metadata,
                section=__section,
                edit=metadata.get(__section),
            )


@metadata.route("/save", methods=["POST"])
@login_required(pagename="Dataset Metadata Editing")
def save():
    from gn2.utility.tools import get_setting
    __gn_docs = Path(
        get_setting("DATA_DIR"),
        "gn-docs"
    )
    __output = Path(
        __gn_docs,
        "general/datasets/",
        request.form.get("id").split("/")[-1]
    )
    match request.form.get("type"):
        case "dcat:Dataset":
            save_dataset_metadata(
                git_dir=__gn_docs,
                output=__output,
                content=request.form.get("editor"),
                msg=request.form.get("edit-summary")
            ).either(
                lambda error: flash(
                    f"{error=}",
                    "error"
                ),
                lambda x: flash(
                    "Successfully updated data.",
                    "success"
                )
            )
    return redirect(
        Path("/datasets", request.form.get('label'))
    )