aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Kabui2024-09-16 15:27:12 +0300
committerGitHub2024-09-16 15:27:12 +0300
commit1ee4e945dbc3b0fd8788341667f2e39f776cc3c4 (patch)
tree314fa913381eca6cf40a02cec2500192e5e891e2
parente823d509b2e2485ab65b1e26a7d4c40042714c25 (diff)
parent304f3f35bfea61bdf9e6be2286b8f6e83b71edb6 (diff)
downloadgenenetwork2-1ee4e945dbc3b0fd8788341667f2e39f776cc3c4.tar.gz
Merge pull request #869 from genenetwork/features/Integrate-editing-doc-files
Integrate gn editor for files.
-rw-r--r--gn2/wqflask/__init__.py2
-rw-r--r--gn2/wqflask/api/markdown.py116
-rw-r--r--gn2/wqflask/templates/base.html16
-rw-r--r--gn2/wqflask/templates/blogs_list.html4
-rw-r--r--gn2/wqflask/templates/facilities.html4
-rw-r--r--gn2/wqflask/templates/generic_gn_docs.html14
-rw-r--r--gn2/wqflask/templates/glossary.html2
-rw-r--r--gn2/wqflask/templates/gn_editor.html9
-rw-r--r--gn2/wqflask/templates/gn_editor_commit.html10
-rw-r--r--gn2/wqflask/templates/gn_editor_results_page.html17
-rwxr-xr-xgn2/wqflask/templates/index_page.html2
-rw-r--r--gn2/wqflask/templates/links.html4
-rw-r--r--gn2/wqflask/templates/news.html2
-rw-r--r--gn2/wqflask/templates/policies.html4
-rw-r--r--gn2/wqflask/templates/references.html4
-rw-r--r--gn2/wqflask/templates/search-syntax.html4
-rw-r--r--gn2/wqflask/views.py4
17 files changed, 154 insertions, 64 deletions
diff --git a/gn2/wqflask/__init__.py b/gn2/wqflask/__init__.py
index 00fe5127..d959598d 100644
--- a/gn2/wqflask/__init__.py
+++ b/gn2/wqflask/__init__.py
@@ -34,6 +34,7 @@ from gn2.wqflask.api.markdown import facilities_blueprint
from gn2.wqflask.api.markdown import blogs_blueprint
from gn2.wqflask.api.markdown import news_blueprint
from gn2.wqflask.api.markdown import xapian_syntax_blueprint
+from gn2.wqflask.api.markdown import gn_docs_blueprint
from gn2.wqflask.api.jobs import jobs as jobs_bp
from gn2.wqflask.oauth2.routes import oauth2
from gn2.wqflask.oauth2.client import user_logged_in
@@ -109,6 +110,7 @@ app.jinja_env.globals.update(
# Registering blueprints
+app.register_blueprint(gn_docs_blueprint, url_prefix="/gn_docs")
app.register_blueprint(glossary_blueprint, url_prefix="/glossary")
app.register_blueprint(references_blueprint, url_prefix="/references")
app.register_blueprint(links_blueprint, url_prefix="/links")
diff --git a/gn2/wqflask/api/markdown.py b/gn2/wqflask/api/markdown.py
index aa7dd3c4..f9e87ee3 100644
--- a/gn2/wqflask/api/markdown.py
+++ b/gn2/wqflask/api/markdown.py
@@ -7,6 +7,8 @@ import requests
import markdown
import os
import sys
+import urllib.parse
+from pathlib import Path
from bs4 import BeautifulSoup # type: ignore
@@ -27,6 +29,25 @@ news_blueprint = Blueprint("news_blueprint", __name__)
xapian_syntax_blueprint = Blueprint("xapian_syntax_blueprint", __name__)
blogs_blueprint = Blueprint("blogs_blueprint", __name__)
+gn_docs_blueprint = Blueprint("gn_docs_blueprint", __name__)
+
+
+def fetch_raw_markdown(file_path):
+ """
+ This method fetches files from genenetwork:gn docs repo
+ """
+ # todo remove hardcoded file path
+ safe_query = urllib.parse.urlencode({"file_path": file_path})
+ response = requests.get(
+ f"http://localhost:8091/edit?{safe_query}")
+ response.raise_for_status()
+ return response.json()
+
+
+def render_markdown_as_html(content):
+ """This method converts markdown to html for render"""
+ return markdown.markdown(content, extensions=["tables"])
+
def render_markdown(file_name, is_remote_file=True):
@@ -97,35 +118,53 @@ def get_blogs(user: str = "genenetwork",
return dict(sorted(blogs.items(), key=lambda x: x[0], reverse=True))
-@glossary_blueprint.route('/')
+@gn_docs_blueprint.route('/glossary')
def glossary():
+ file_data = fetch_raw_markdown(file_path="general/glossary/glossary.md")
return render_template(
- "glossary.html",
- rendered_markdown=render_markdown("general/glossary/glossary.md")), 200
+ "generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@references_blueprint.route('/')
+@gn_docs_blueprint.route('/references')
def references():
+
+ file_data = fetch_raw_markdown(
+ file_path="general/references/references.md")
return render_template(
- "references.html",
- rendered_markdown=render_markdown("general/references/references.md")), 200
+ "generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@news_blueprint.route('/')
+@gn_docs_blueprint.route('/news')
def news():
+ file_data = fetch_raw_markdown(file_path="general/news/news.md")
return render_template(
- "news.html",
- rendered_markdown=render_markdown("general/news/news.md")), 200
+ "generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@xapian_syntax_blueprint.route('/')
+@gn_docs_blueprint.route('/xapian')
def xapian():
+ file_data = fetch_raw_markdown(file_path="general/search/xapian_syntax.md")
return render_template(
- "search-syntax.html",
- rendered_markdown=render_markdown("general/search/xapian_syntax.md")), 200
+ "generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@environments_blueprint.route("/")
+@gn_docs_blueprint.route("/environments")
def environments():
md_file = get_file_from_python_search_path("wqflask/DEPENDENCIES.md")
@@ -148,47 +187,70 @@ def environments():
200
)
# Fallback: Fetch file from server
+ file_data = fetch_raw_markdown(
+ file_path="general/environments/environments.md")
return (render_template(
"environment.html",
svg_data=None,
- rendered_markdown=render_markdown(
- "general/environments/environments.md")),
- 200)
+ rendered_markdown=render_markdown_as_html(file_data["content"])))
-@environments_blueprint.route('/svg-dependency-graph')
+@gn_docs_blueprint.route('/svg-dependency-graph')
def svg_graph():
directory, file_name, _ = get_file_from_python_search_path(
"wqflask/dependency-graph.svg").partition("dependency-graph.svg")
return send_from_directory(directory, file_name)
-@links_blueprint.route("/")
+@gn_docs_blueprint.route("/links")
def links():
+ file_data = fetch_raw_markdown(file_path="general/links/links.md")
return render_template(
- "links.html",
- rendered_markdown=render_markdown("general/links/links.md")), 200
+ "generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@policies_blueprint.route("/")
+@gn_docs_blueprint.route("/policies")
def policies():
+ file_data = fetch_raw_markdown(file_path="general/policies/policies.md")
return render_template(
- "policies.html",
- rendered_markdown=render_markdown("general/policies/policies.md")), 200
+ "generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@facilities_blueprint.route("/")
+@gn_docs_blueprint.route("/facilities")
def facilities():
- return render_template("facilities.html", rendered_markdown=render_markdown("general/help/facilities.md")), 200
+ file_data = fetch_raw_markdown(file_path="general/help/facilities.md")
+ return render_template("generic_gn_docs.html",
+ rendered_markdown=render_markdown_as_html(
+ file_data["content"]),
+ file_path=file_data["file_path"],
+ file_title=Path(file_data["file_path"]).stem
+ )
-@blogs_blueprint.route("/<path:blog_path>")
+@gn_docs_blueprint.route("/blogs/<path:blog_path>")
def display_blog(blog_path):
return render_template("blogs.html", rendered_markdown=render_markdown(blog_path))
-@blogs_blueprint.route("/")
+@gn_docs_blueprint.route("/blogs")
def blogs_list():
blogs = get_blogs()
return render_template("blogs_list.html", blogs=blogs)
+
+
+@gn_docs_blueprint.errorhandler(requests.exceptions.HTTPError)
+def page_not_found(error):
+ """ Return error 404 """
+ return {"Reason": error.response.reason,
+ "error_status_code": error.response.status_code,
+ "error_msg": error.response.text
+ }
diff --git a/gn2/wqflask/templates/base.html b/gn2/wqflask/templates/base.html
index 9c4ebfdd..7db9aed6 100644
--- a/gn2/wqflask/templates/base.html
+++ b/gn2/wqflask/templates/base.html
@@ -82,16 +82,16 @@
<li class="">
<a href="/help" class="dropdow-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Help <span class="caret"></a>
<ul class="dropdown-menu">
- <li><a href="{{ url_for('references_blueprint.references') }}">References</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.references') }}">References</a></li>
<li><a href="/tutorials">Webinars, Tutorials/Primers</a></li>
- <li><a href="{{ url_for('blogs_blueprint.blogs_list') }}">Blogs</a></li>
- <li><a href="{{ url_for('glossary_blueprint.glossary') }}">Glossary of Term</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.blogs_list') }}">Blogs</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.glossary') }}">Glossary of Term</a></li>
<li><a href="http://gn1.genenetwork.org/faq.html">FAQ</a></li>
- <li><a href="{{ url_for('policies_blueprint.policies') }}">Policies</a></li>
- <li><a href="{{ url_for('links_blueprint.links') }}">Links</a></li>
- <li><a href="{{ url_for('facilities_blueprint.facilities') }}">Facilities</a></li>
- <li><a href="{{ url_for('environments_blueprint.environments') }}">Environments</a></li>
- <li><a href="/news">GN1 News</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.policies') }}">Policies</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.links') }}">Links</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.facilities') }}">Facilities</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.environments') }}">Environments</a></li>
+ <li><a href="{{ url_for('gn_docs_blueprint.news') }}">GN1 News</a></li>
</ul>
</li>
<li class="">
diff --git a/gn2/wqflask/templates/blogs_list.html b/gn2/wqflask/templates/blogs_list.html
index 6bad4628..a74d24a2 100644
--- a/gn2/wqflask/templates/blogs_list.html
+++ b/gn2/wqflask/templates/blogs_list.html
@@ -40,7 +40,7 @@
<div class="blog_title">
<ul>
<li>
- <a href="{{ url_for('blogs_blueprint.display_blog',blog_path = blog.full_path)}}">{{blog['subtitle']}}</a>
+ <a href="{{ url_for('gn_docs_blueprint.display_blog',blog_path = blog.full_path)}}">{{blog['subtitle']}}</a>
</li>
</ul>
</div>
@@ -49,4 +49,4 @@
{%endfor%}
</div>
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/gn2/wqflask/templates/facilities.html b/gn2/wqflask/templates/facilities.html
index 56b127f9..ee4c84db 100644
--- a/gn2/wqflask/templates/facilities.html
+++ b/gn2/wqflask/templates/facilities.html
@@ -10,7 +10,7 @@
<div class="github-btn-container">
<div class="github-btn">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/help/facilities.md">
+ <a href="/editor/edit?file-path=general/help/facilities.md">
Edit Text
<img src="/static/images/edit.png">
</a>
@@ -21,4 +21,4 @@
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/gn2/wqflask/templates/generic_gn_docs.html b/gn2/wqflask/templates/generic_gn_docs.html
new file mode 100644
index 00000000..57723f0b
--- /dev/null
+++ b/gn2/wqflask/templates/generic_gn_docs.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+{% block title %}{{ file_title|capitalize }}{% endblock %}
+{% block css %}<link rel="stylesheet" type="text/css" href="/static/new/css/markdown.css" />{% endblock %}
+{% block content %}
+ <div class="github-btn-container">
+ <div class="github-btn">
+ <a href="/editor/edit?file-path={{ file_path }}">
+ Edit Text
+ <img src="/static/images/edit.png">
+ </a>
+ </div>
+ </div>
+ <div id="markdown" class="container">{{ rendered_markdown|safe }}</div>
+{% endblock %}
diff --git a/gn2/wqflask/templates/glossary.html b/gn2/wqflask/templates/glossary.html
index aaee7c5a..4922d39e 100644
--- a/gn2/wqflask/templates/glossary.html
+++ b/gn2/wqflask/templates/glossary.html
@@ -10,7 +10,7 @@
<div class="github-btn-container">
<div class="github-btn">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/glossary/glossary.md">
+ <a href="/editor/edit?file-path=general/glossary/glossary.md">
Edit Text
<img src="/static/images/edit.png">
</a>
diff --git a/gn2/wqflask/templates/gn_editor.html b/gn2/wqflask/templates/gn_editor.html
index e5c649d1..d89aaf0a 100644
--- a/gn2/wqflask/templates/gn_editor.html
+++ b/gn2/wqflask/templates/gn_editor.html
@@ -157,11 +157,13 @@
let fileExt = (filePath.substring(filePath.lastIndexOf('.')+1, filePath.length) || "md").toLowerCase();
let data = {{ content|tojson }}
- localStorage.setItem("gn_editor_sha" ,hash)
+ localStorage.setItem("gn_editor_sha" ,hash)
+ htmx.on("#output", "updateDataEvent", function(event){
+ data = editor.getValue()
+ })
htmx.on("#output", "commitEvent", function(event){
htmx.ajax("POST", "/editor/commit", {target: "#output", swap:"innerHTML",values: {'msg':event.detail.payload, 'content': editor.getValue(), "hash": localStorage.getItem("gn_editor_sha"), "file_path": filePath}})
- })
-
+ })
htmx.on("#output", "diffEvent", function(event){
var fileName = "{{ file_path }}"
var diffContent = Diff.createTwoFilesPatch(fileName,fileName, data, editor.getValue())
@@ -186,7 +188,6 @@
htmx.on("#diffBtn","click",function(event){
//dispatch your event here
- console.log("Clicked diff btn here")
htmx.find("#output").dispatchEvent(
new CustomEvent("diffEvent", {
bubbles: true,
diff --git a/gn2/wqflask/templates/gn_editor_commit.html b/gn2/wqflask/templates/gn_editor_commit.html
index 84ebd818..2eb3e60c 100644
--- a/gn2/wqflask/templates/gn_editor_commit.html
+++ b/gn2/wqflask/templates/gn_editor_commit.html
@@ -23,15 +23,17 @@
<br>
<br>
<div class="row">
- <button id="btn-commit" class="btn btn-primary col-lg-3 col-lg-offset-1 col-sm-4 col-sm-offset-1">Commit</button>
- <button id="btn-diff" class="btn col-lg-3 col-lg-offset-1 col-sm-4 col-sm-offset-1">Show Diff</button>
+ <button id="btn-commit"
+ class="btn btn-primary col-lg-3 col-lg-offset-1 col-sm-4 col-sm-offset-1">Commit</button>
+ <button id="btn-diff"
+ class="btn col-lg-3 col-lg-offset-1 col-sm-4 col-sm-offset-1">Show Diff</button>
</div>
<br>
<div id="diff_page"></div>
</div>
</section>
{% block js %}
- <script>
+<script>
htmx.on("#btn-commit", "click", function(event){
let msg = htmx.find("#commit-message").value.trim()
if (msg != ""){
@@ -51,5 +53,5 @@
}),
);
})
- </script>
+</script>
{% endblock %}
diff --git a/gn2/wqflask/templates/gn_editor_results_page.html b/gn2/wqflask/templates/gn_editor_results_page.html
index 666bd432..6eaeb941 100644
--- a/gn2/wqflask/templates/gn_editor_results_page.html
+++ b/gn2/wqflask/templates/gn_editor_results_page.html
@@ -37,10 +37,19 @@
</section>
{% block js %}
<script>
- var commitSha = "{{ commit_sha }}";
- if (commitSha !="" && commitSha!= undefined){
- localStorage.setItem("gn_editor_sha", commitSha)
- }
+ var commitSha = "{{ commit_sha }}";
+ if (commitSha !="" && commitSha!= undefined){
+ prev_commit = localStorage.getItem("gn_editor_sha")
+ localStorage.setItem("gn_editor_sha", commitSha)
+ if (prev_commit != commitSha) {
+ //update the contennt
+ htmx.find("#output").dispatchEvent(
+ new CustomEvent("updateDataEvent", {
+ bubbles: true,
+ detail: {},
+ }),
+ );
+ }}
</script>
{% endblock %}
diff --git a/gn2/wqflask/templates/index_page.html b/gn2/wqflask/templates/index_page.html
index f0840425..734cd075 100755
--- a/gn2/wqflask/templates/index_page.html
+++ b/gn2/wqflask/templates/index_page.html
@@ -257,7 +257,7 @@
Gene Ontology</a>.</li>
<li><b>RIF=diabetes LRS=(9 999 Chr2 100 105) transLRS=(9 999 10)</b>
- finds diabetes-associated transcripts with peak <a href="{{ url_for('glossary_blueprint.glossary') }}#E">
+ finds diabetes-associated transcripts with peak <a href="{{ url_for('gn_docs_blueprint.glossary') }}#E">
trans eQTLs</a> on Chr 2 between 100 and 105 Mb with LRS
scores between 9 and 999.</li>
</ul>
diff --git a/gn2/wqflask/templates/links.html b/gn2/wqflask/templates/links.html
index 6e91adae..4a134c96 100644
--- a/gn2/wqflask/templates/links.html
+++ b/gn2/wqflask/templates/links.html
@@ -10,7 +10,7 @@
<div class="github-btn-container">
<div class="github-btn ">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/links/links.md">
+ <a href="/editor/edit?file-path=general/links/links.md">
Edit Text
<img src="/static/images/edit.png">
</a>
@@ -21,4 +21,4 @@
{{ rendered_markdown|safe }}
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/gn2/wqflask/templates/news.html b/gn2/wqflask/templates/news.html
index a615564b..df8e02ef 100644
--- a/gn2/wqflask/templates/news.html
+++ b/gn2/wqflask/templates/news.html
@@ -10,7 +10,7 @@
<div class="github-btn-container">
<div class="github-btn">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/news/news.md">
+ <a href="/editor/edit?file-path=general/news/news.md">
Edit Text
<img src="/static/images/edit.png">
</a>
diff --git a/gn2/wqflask/templates/policies.html b/gn2/wqflask/templates/policies.html
index e36c9e08..d7b0e3f9 100644
--- a/gn2/wqflask/templates/policies.html
+++ b/gn2/wqflask/templates/policies.html
@@ -10,7 +10,7 @@
<div class="github-btn-container">
<div class="github-btn ">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/policies/policies.md">
+ <a href="/editor/edit?file-path=general/policies/policies.md">
Edit Text
<img src="/static/images/edit.png">
</a>
@@ -20,4 +20,4 @@
{{ rendered_markdown|safe }}
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/gn2/wqflask/templates/references.html b/gn2/wqflask/templates/references.html
index 04e60361..d858e10f 100644
--- a/gn2/wqflask/templates/references.html
+++ b/gn2/wqflask/templates/references.html
@@ -6,7 +6,7 @@
{% block content %}
<div class="github-btn-container">
<div class="github-btn">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/references/references.md">
+ <a href="/editor/edit?file-path=general/references/references.md">
Edit Text
<img src="/static/images/edit.png">
</a>
@@ -16,4 +16,4 @@
{{ rendered_markdown|safe }}
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/gn2/wqflask/templates/search-syntax.html b/gn2/wqflask/templates/search-syntax.html
index 52538826..e4ab7907 100644
--- a/gn2/wqflask/templates/search-syntax.html
+++ b/gn2/wqflask/templates/search-syntax.html
@@ -10,7 +10,7 @@
<div class="github-btn-container">
<div class="github-btn">
- <a href="https://github.com/genenetwork/gn-docs/blob/master/general/search/xapian_syntax.md">
+ <a href="/editor/edit?file-path=general/search/xapian_syntax.md">
Edit Text
<img src="/static/images/edit.png">
</a>
@@ -21,4 +21,4 @@
</div>
-{% endblock %} \ No newline at end of file
+{% endblock %}
diff --git a/gn2/wqflask/views.py b/gn2/wqflask/views.py
index e306cc2c..d5fcedfe 100644
--- a/gn2/wqflask/views.py
+++ b/gn2/wqflask/views.py
@@ -322,8 +322,8 @@ def gnqna():
@app.route("/editor/edit", methods=["GET"])
@require_oauth2
def edit_gn_doc_file():
- file_path = request.args.get("file-path", "")
- response = requests.get(f"http://localhost:8091/edit?file_path={file_path}")
+ file_path = urllib.parse.urlencode({"file_path": request.args.get("file-path", "")})
+ response = requests.get(f"http://localhost:8091/edit?{file_path}")
response.raise_for_status()
return render_template("gn_editor.html", **response.json())