Przeglądaj źródła

Add edit and markdown rendering function

JoostSijm 6 lat temu
rodzic
commit
8afc6c7f51
6 zmienionych plików z 112 dodań i 37 usunięć
  1. 1 0
      Pipfile
  2. 37 34
      Pipfile.lock
  3. 6 0
      app/models.py
  4. 22 2
      app/modules/backend/app.py
  5. 42 0
      app/templates/page/edit.j2
  6. 4 1
      app/templates/page/view.j2

+ 1 - 0
Pipfile

@@ -14,5 +14,6 @@ flask-sqlalchemy = "*"
 flask-apscheduler = "*"
 psycopg2-binary = "*"
 python-dotenv = "*"
+markdown = "*"
 
 [dev-packages]

+ 37 - 34
Pipfile.lock

@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "dce6d8ed96f72bb8101e437fbad9054e747a9ba96edd2b92af69b47314bd63f4"
+            "sha256": "ce61e2148dc8edd87510dfa2100a65cd73a166cb7a2252312db2634475fb7437"
         },
         "pipfile-spec": 6,
         "requires": {},
@@ -52,40 +52,35 @@
         },
         "cffi": {
             "hashes": [
-                "sha256:151b7eefd035c56b2b2e1eb9963c90c6302dc15fbd8c1c0a83a163ff2c7d7743",
-                "sha256:1553d1e99f035ace1c0544050622b7bc963374a00c467edafac50ad7bd276aef",
-                "sha256:1b0493c091a1898f1136e3f4f991a784437fac3673780ff9de3bcf46c80b6b50",
-                "sha256:2ba8a45822b7aee805ab49abfe7eec16b90587f7f26df20c71dd89e45a97076f",
-                "sha256:3bb6bd7266598f318063e584378b8e27c67de998a43362e8fce664c54ee52d30",
-                "sha256:3c85641778460581c42924384f5e68076d724ceac0f267d66c757f7535069c93",
-                "sha256:3eb6434197633b7748cea30bf0ba9f66727cdce45117a712b29a443943733257",
-                "sha256:495c5c2d43bf6cebe0178eb3e88f9c4aa48d8934aa6e3cddb865c058da76756b",
-                "sha256:4c91af6e967c2015729d3e69c2e51d92f9898c330d6a851bf8f121236f3defd3",
-                "sha256:57b2533356cb2d8fac1555815929f7f5f14d68ac77b085d2326b571310f34f6e",
-                "sha256:770f3782b31f50b68627e22f91cb182c48c47c02eb405fd689472aa7b7aa16dc",
-                "sha256:79f9b6f7c46ae1f8ded75f68cf8ad50e5729ed4d590c74840471fc2823457d04",
-                "sha256:7a33145e04d44ce95bcd71e522b478d282ad0eafaf34fe1ec5bbd73e662f22b6",
-                "sha256:857959354ae3a6fa3da6651b966d13b0a8bed6bbc87a0de7b38a549db1d2a359",
-                "sha256:87f37fe5130574ff76c17cab61e7d2538a16f843bb7bca8ebbc4b12de3078596",
-                "sha256:95d5251e4b5ca00061f9d9f3d6fe537247e145a8524ae9fd30a2f8fbce993b5b",
-                "sha256:9d1d3e63a4afdc29bd76ce6aa9d58c771cd1599fbba8cf5057e7860b203710dd",
-                "sha256:a36c5c154f9d42ec176e6e620cb0dd275744aa1d804786a71ac37dc3661a5e95",
-                "sha256:a6a5cb8809091ec9ac03edde9304b3ad82ad4466333432b16d78ef40e0cce0d5",
-                "sha256:ae5e35a2c189d397b91034642cb0eab0e346f776ec2eb44a49a459e6615d6e2e",
-                "sha256:b0f7d4a3df8f06cf49f9f121bead236e328074de6449866515cea4907bbc63d6",
-                "sha256:b75110fb114fa366b29a027d0c9be3709579602ae111ff61674d28c93606acca",
-                "sha256:ba5e697569f84b13640c9e193170e89c13c6244c24400fc57e88724ef610cd31",
-                "sha256:be2a9b390f77fd7676d80bc3cdc4f8edb940d8c198ed2d8c0be1319018c778e1",
-                "sha256:ca1bd81f40adc59011f58159e4aa6445fc585a32bb8ac9badf7a2c1aa23822f2",
-                "sha256:d5d8555d9bfc3f02385c1c37e9f998e2011f0db4f90e250e5bc0c0a85a813085",
-                "sha256:e55e22ac0a30023426564b1059b035973ec82186ddddbac867078435801c7801",
-                "sha256:e90f17980e6ab0f3c2f3730e56d1fe9bcba1891eeea58966e89d352492cc74f4",
-                "sha256:ecbb7b01409e9b782df5ded849c178a0aa7c906cf8c5a67368047daab282b184",
-                "sha256:ed01918d545a38998bfa5902c7c00e0fee90e957ce036a4000a88e3fe2264917",
-                "sha256:edabd457cd23a02965166026fd9bfd196f4324fe6032e866d0f3bd0301cd486f",
-                "sha256:fdf1c1dc5bafc32bc5d08b054f94d659422b05aba244d6be4ddc1c72d9aa70fb"
+                "sha256:08090454ff236239e583a9119d0502a6b9817594c0a3714dd1d8593f2350ba11",
+                "sha256:0fd93b32d96d7ce46d0fb0db6d82f73e2e6ee37696a0fed152240c780ff99d16",
+                "sha256:11651532fefba063d372e41826ab669b666d7a92e90dd019f31aefa7cf18e0e0",
+                "sha256:116b32a34c862dac9a0c8c28e68fa7d63750068443d0bb595c090c70de7bf080",
+                "sha256:1ec69cca03f9e8e6e2e835f44a1572e0b6d6130aa71a2100459ee33a6c370e04",
+                "sha256:22151b858c916f0765734bcfbf69a986b127260f95f5cb829128c02863c14626",
+                "sha256:22558c0c4d9640b0869c51bbd8761dbf610cec03db6c7ec8471c4371e7450141",
+                "sha256:2e556610fcf5d4c41d480221dec071d517096ff452053b6f4eacfa20fec0dbce",
+                "sha256:3991da7c291c8c80a4c53303e0abb857bc3598af27fbe203214ddd13dc7cf33a",
+                "sha256:39f47648b5f2755aa977b37fc49581bdd3d0a500eb31f61c034af2ff05d6f56f",
+                "sha256:430fa07eb38761a720aac338202fc15cbe9897deef50fa7f8afc2217b85213da",
+                "sha256:598fcf6173ea45e5c82ca525cf47a956d1406e8f350bd471049630c4897c8f0a",
+                "sha256:6c96839af24f3edd2f6b44f8b7cf5d1fc1ad1f0da1c9fb2227a4239707adfdb7",
+                "sha256:830831d20030c17d62b7ca3987a09f02c193ff2d2c46dc0dff53d89071dd806e",
+                "sha256:84fe536dc89877b722b5b4ea578f5beac60759363513aeb1df6ec914c6dd6ba1",
+                "sha256:8a1f16671de9cd41b508f9b2c82de2523f568103b4c32cdeee3c6ed777005766",
+                "sha256:9b658f51245abb1ed6a5467ca58933e912ea6039327745655de6753f848fb98a",
+                "sha256:ad86d01920b90384d7b2fe0df7e75dc06562471e14aa0905351fecd31007016b",
+                "sha256:b107c3f195af098e2b2ea9cc55074e15ee9af6449e63d58ff5b0b75841c49833",
+                "sha256:b8a36ff55ec3d22bd4c2baac080b48a9c9fe0af5df363fa1dee7c334dfb06519",
+                "sha256:be8a266b312707584762036c65d5aa34c56319c6e60536ad8d3f1255d209b2a7",
+                "sha256:bedbb01c0e4fb12f41b2c951723acb4e8305892598e391b89d6a4e6ba5989a63",
+                "sha256:ddf1824a0f04f324f1d380f44893abb57394379763e4ed6200bc188f33b32325",
+                "sha256:dfe74188ee1afd0ebfeff31b056aac8b72016f6b0364f90eb3284dc29bf1619a",
+                "sha256:e0eaa6da93e87229f2d8e133c3baa459ed626e374d20486e2dc94a8e9d2f019d",
+                "sha256:e5eb00a6e1058806a41e3f5a30e4c826ec97d98957302c78909fb8ee98d0266e",
+                "sha256:fa1e30ea308da2ffa91a35042e612340e7c7fcd8614581c85139850b2e18fd17"
             ],
-            "version": "==1.11.5"
+            "version": "==1.12.0"
         },
         "click": {
             "hashes": [
@@ -175,6 +170,14 @@
             ],
             "version": "==1.0.7"
         },
+        "markdown": {
+            "hashes": [
+                "sha256:c00429bd503a47ec88d5e30a751e147dcb4c6889663cd3e2ba0afe858e009baa",
+                "sha256:d02e0f9b04c500cde6637c11ad7c72671f359b87b9fe924b2383649d8841db7c"
+            ],
+            "index": "pypi",
+            "version": "==3.0.1"
+        },
         "markupsafe": {
             "hashes": [
                 "sha256:048ef924c1623740e70204aa7143ec592504045ae4429b59c30054cb31e3c432",

+ 6 - 0
app/models.py

@@ -5,6 +5,8 @@ All models for module
 
 from datetime import datetime
 # from sqlalchemy.ext.hybrid import hybrid_method, hybrid_property
+import markdown
+from flask import Markup
 from flask_login import UserMixin
 from app import db, argon2, login_manager
 
@@ -54,6 +56,10 @@ class Page(Base, db.Model):
     datetime = db.Column(db.DateTime, default=datetime.utcnow)
     source = db.Column(db.String)
 
+    def content(self):
+        """Render page source"""
+        return Markup(markdown.markdown(self.source))
+
     user_id = db.Column(
         db.Integer,
         db.ForeignKey("user.id")

+ 22 - 2
app/modules/backend/app.py

@@ -109,7 +109,7 @@ def index():
 @register_menu(BLUEPRINT, 'page_create', 'Create page')
 @login_required
 def create_page():
-    """Show creating page"""
+    """Page creating"""
     if request.method == 'POST':
         page = Page()
         page.title = request.form['title']
@@ -124,7 +124,27 @@ def create_page():
     return render_template('page/create.j2')
 
 
-@BLUEPRINT.route('/page/<int:page_id>')
+@BLUEPRINT.route('/page/edit/<int:page_id>', methods=["GET", "POST"])
+@login_required
+def edit_page(page_id):
+    """Page editing"""
+    page = Page.query.get(page_id)
+
+    if request.method == 'POST':
+        page.title = request.form['title']
+        page.source = request.form['source']
+        page.user_id = current_user.id
+
+        db.session.add(page)
+        db.session.commit()
+
+        flash('Page "%s" successfully edit' % page.title, 'success')
+
+    return render_template('page/edit.j2', page=page)
+
+
+@BLUEPRINT.route('/page/view/<int:page_id>')
+@login_required
 def view_page(page_id):
     """Display page"""
     page = Page.query.get(page_id)

+ 42 - 0
app/templates/page/edit.j2

@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>Edit: {{ page.title }}</title>
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+</head>
+<body>
+	{% with messages = get_flashed_messages(with_categories=true) %}
+	{% if messages %}
+	{% for category, message in messages %}
+	<div class="alert alert-{{ category }} alert-dismissible fade show" role="alert">
+		{{ message }}
+		<button type="button" class="close" data-dismiss="alert" aria-label="Close">
+			<span aria-hidden="true">&times;</span>
+		</button>
+	</div>
+	{% endfor %}
+	{% endif %}
+	{% endwith %}
+	{%- for item in current_menu.children recursive -%}
+	<li class="nav-item" data-toggle="tooltip" data-placement="right" title="{{ item.text }}">
+	    <a class="nav-link" href="{{ item.url}}">
+	        <span class="nav-link-text">{{ item.text }}</span>
+	    </a>
+	</li>
+	{%- endfor -%}
+	<h1>Edit: {{ page.title }}</h1>
+	<form method="post">
+		<div class="form-group">
+			<label class="text-normal text-dark">title</label>
+			<input type="text" class="form-control" name="title" placeholder="title" value="{{ page.title }}">
+		</div>
+		<div class="form-group">
+			<label class="text-normal text-dark">Source</label>
+			<textarea class="form-control" name="source">{{ page.source }}</textarea>
+		</div>
+		<div class="form-group pull-right">
+			<button class="btn btn-primary">Save</button>
+		</div>
+	</form>
+	<p>{{ page.content() }}</p>
+</body>

+ 4 - 1
app/templates/page/view.j2

@@ -1,7 +1,7 @@
 <!DOCTYPE html>
 <html>
 <head>
-    <title>{{ page.title }} - Page</title>
+    <title>View: {{ page.title }}</title>
     <meta name="viewport" content="width=device-width, initial-scale=1">
 </head>
 <body>
@@ -25,5 +25,8 @@
 	</li>
 	{%- endfor -%}
 	<h1>Title: {{ page.title }}</h1>
+	<a href="{{ url_for('backend.edit_page', page_id=page.id) }}">Edit</a><br>
 	<p>{{ page.source }}</p>
+	<hr>
+	<p>{{ page.content() }}</p>
 </body>