]> git.ipfire.org Git - ipfire.org.git/commitdiff
blog: Refactor writing posts
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 27 Jul 2023 08:42:45 +0000 (08:42 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 27 Jul 2023 08:43:13 +0000 (08:43 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/backend/blog.py
src/templates/blog/compose.html [deleted file]
src/templates/blog/drafts.html
src/templates/blog/post.html
src/templates/blog/write.html [new file with mode: 0644]
src/web/__init__.py
src/web/blog.py

index 3268135c2d5d57eedc933add57ab9d19c19ed776..3c9f6d0305d8d05781d2b7b89df7ff81725a72bc 100644 (file)
@@ -145,7 +145,6 @@ templates_auth_modules_DATA = \
 templates_auth_modulesdir = $(templates_authdir)/modules
 
 templates_blog_DATA = \
-       src/templates/blog/compose.html \
        src/templates/blog/delete.html \
        src/templates/blog/drafts.html \
        src/templates/blog/feed.xml \
@@ -153,6 +152,7 @@ templates_blog_DATA = \
        src/templates/blog/post.html \
        src/templates/blog/publish.html \
        src/templates/blog/tag.html \
+       src/templates/blog/write.html \
        src/templates/blog/year.html
 
 templates_blogdir = $(templatesdir)/blog
index 43f3706fa0698618b9e2b307ae7b2a86d7805964..675980695245409860f4cfe840a8ad5a10a44942 100644 (file)
@@ -378,9 +378,21 @@ class Post(misc.Object):
                return self.backend.releases._get_release("SELECT * FROM releases \
                        WHERE published IS NOT NULL AND published <= NOW() AND blog_id = %s", self.id)
 
-       def is_editable(self, editor):
+       def is_editable(self, user):
+               # Anonymous users cannot do anything
+               if not user:
+                       return False
+
+               # Admins can edit anything
+               if user.is_admin():
+                       return True
+
+               # User must have permission for the blog
+               if not user.is_blog_author():
+                       return False
+
                # Authors can edit their own posts
-               return self.author == editor
+               return self.author == user
 
        def update(self, title, text, tags=[]):
                """
diff --git a/src/templates/blog/compose.html b/src/templates/blog/compose.html
deleted file mode 100644 (file)
index 686e3f6..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-{% extends "../base.html" %}
-
-{% block title %}{% if post %}{{ _("Edit %s") % post.title }}{% else %}{{ _("Compose A New Article") }}{% end %}{% end block %}
-
-{% block main %}
-       <div class="card">
-               <div class="card-body">
-                       <form action="" method="POST">
-                               {% raw xsrf_form_html() %}
-
-                               <div class="mb-3">
-                                       <input type="text" class="form-control" name="title" placeholder="{{ _("Title") }}"
-                                               {% if post %}value="{{ post.title }}"{% end %} required>
-                               </div>
-
-                               <div class="mb-3">
-                                       <textarea class="form-control" rows="16" name="text" placeholder="{{ _("Text") }}"
-                                               required>{% if post %}{{ post.text }}{% end %}</textarea>
-                               </div>
-
-                               <div class="mb-3 row">
-                                       <label class="col-sm-2 col-form-label">{{ _("Tags") }}</label>
-                                       <div class="col-sm-10">
-                                               <input type="text" class="form-control" name="tags"
-                                                       {% if post %}value="{{ " ".join(post.tags) }}"{% end %}>
-                                       </div>
-                               </div>
-
-                               <div class="d-grid gap-2">
-                                       <button type="submit" class="btn btn-primary">
-                                               {{ _("Save") }}
-                                       </button>
-
-                                       {% if post %}
-                                               <a class="btn btn-outline-primary" href="/post/{{ post.slug }}/delete">
-                                                       {{ _("Delete") }}
-                                               </a>
-                                       {% end %}
-                               </div>
-                       </form>
-               </div>
-       </div>
-{% end block %}
index 4f60db69f5fce146e429dc3a50a657e2f44e0cd9..0513ea639c52d2205fd3183a1c958d700400b688 100644 (file)
@@ -36,7 +36,7 @@
                        {% end %}
 
                        <div class="block">
-                               <a class="button is-primary is-fullwidth" href="/blog/compose">
+                               <a class="button is-primary is-fullwidth" href="/blog/write">
                                        {{ _("Write a New Post") }}
                                </a>
                        </div>
index cbc6bbab15ac3e8dea3ea2b7df1b718b9cc66fa7..a2f9883ac60d5c5a1091bf4d8569180097e849da 100644 (file)
                                                                </span>
                                                        </a>
                                                {% end %}
+
+                                               {% if post.is_editable(current_user) %}
+                                                       <a class="button is-light is-fullwidth" href="/blog/{{ post.slug }}/edit">
+                                                               <span class="icon">
+                                                                       <i class="fas fa-edit"></i>
+                                                               </span>
+                                                               <span>{{ _("Edit") }}</span>
+                                                       </a>
+                                               {% end %}
                                        </div>
 
                                        <div class="block">
diff --git a/src/templates/blog/write.html b/src/templates/blog/write.html
new file mode 100644 (file)
index 0000000..ad6eb6d
--- /dev/null
@@ -0,0 +1,83 @@
+{% extends "../base.html" %}
+
+{% block title %}
+       {% if post %}
+               {{ _("Edit %s") % post.title }}
+       {% else %}
+               {{ _("Write A New Post") }}
+       {% end %}
+{% end block %}
+
+{% block container %}
+       <section class="hero is-primary">
+               <div class="hero-body">
+                       <div class="container">
+                               <nav class="breadcrumb is-medium" aria-label="breadcrumbs">
+                                       <ul>
+                                               <li>
+                                                       <a href="/">{{ _("Home") }}</a>
+                                               </li>
+                                               <li>
+                                                       <a href="/blog">{{ _("Blog") }}</a>
+                                               </li>
+                                               <li class="is-active">
+                                                       <a href="#" aria-current="page">{{ _("Write") }}</a>
+                                               </li>
+                                       </ul>
+                               </nav>
+
+                               <h1 class="title is-1">{{ _("Write a New Post") }}</h1>
+                       </div>
+               </div>
+       </section>
+
+       <section class="section">
+               <div class="container">
+                       <div class="columns">
+                               <div class="column is-three-fifth">
+                                       <form action="" method="POST">
+                                               {% raw xsrf_form_html() %}
+
+                                               <div class="field">
+                                                       <div class="control">
+                                                               <input class="input" type="text" name="title" placeholder="{{ _("Title") }}"
+                                                                       {% if post %}value="{{ post.title }}"{% end %} required>
+                                                       </div>
+                                               </div>
+
+                                               <div class="field">
+                                                       <div class="control">
+                                                               <textarea class="textarea" name="text" rows="16"
+                                                                       required>{% if post %}{{ post.text }}{% end %}</textarea>
+                                                       </div>
+                                               </div>
+
+                                               <div class="field">
+                                                       <label class="label">{{ _("Tags") }}</label>
+                                                       <div class="control">
+                                                               <input class="input" type="text" name="tags"
+                                                                       {% if post %}value="{{ " ".join(post.tags) }}"{% end %}>
+                                                       </div>
+                                               </div>
+
+                                               <div class="field is-grouped">
+                                                       <div class="control">
+                                                               <button type="submit" class="button is-primary">
+                                                                       {{ _("Save") }}
+                                                               </button>
+                                                       </div>
+
+                                                       {% if post %}
+                                                               <div class="control">
+                                                                       <a class="button is-danger is-outline" href="/blog/{{ post.slug }}/delete">
+                                                                               {{ _("Delete") }}
+                                                                       </a>
+                                                               </div>
+                                                       {% end %}
+                                               </div>
+                                       </form>
+                               </div>
+                       </div>
+               </div>
+       </section>
+{% end block %}
index 848abae6a37eddede8ad173c71ed58f193db160e..9096810e5d42ef7ff331ed55ab6d5085d0a82ac2 100644 (file)
@@ -126,10 +126,10 @@ class Application(tornado.web.Application):
 
                        # Blog
                        (r"/blog", blog.IndexHandler),
-                       (r"/blog/compose", blog.ComposeHandler),
                        (r"/blog/drafts", blog.DraftsHandler),
                        (r"/blog/feed.xml", blog.FeedHandler),
                        (r"/blog/tags/([0-9a-z\-\.]+)", blog.TagHandler),
+                       (r"/blog/write", blog.WriteHandler),
                        (r"/blog/years/([0-9]{4})", blog.YearHandler),
                        (r"/blog/([0-9a-z\-\._]+)", blog.PostHandler),
                        (r"/blog/([0-9a-z\-\._]+)/delete", blog.DeleteHandler),
index 92099d5d10428d4c26345db0b7838eb0da7de09d..e4a41a1ac773b65e6dbbb8543c7d41db3b1f7aa1 100644 (file)
@@ -145,7 +145,7 @@ class YearHandler(base.BaseHandler):
                self.render("blog/year.html", posts=posts, year=year)
 
 
-class ComposeHandler(base.BaseHandler):
+class WriteHandler(base.BaseHandler):
        @tornado.web.authenticated
        def prepare(self):
                # Check if the user has permissions
@@ -154,7 +154,7 @@ class ComposeHandler(base.BaseHandler):
 
        @tornado.web.authenticated
        def get(self):
-               self.render("blog/compose.html", post=None)
+               self.render("blog/write.html", post=None)
 
        @tornado.web.authenticated
        def post(self):
@@ -166,7 +166,8 @@ class ComposeHandler(base.BaseHandler):
                        post = self.backend.blog.create_post(title, text,
                                author=self.current_user, tags=tags)
 
-               self.redirect("/drafts")
+               # Redirect to the new post
+               self.redirect("/blog/%s" % post.slug)
 
 
 class EditHandler(base.BaseHandler):
@@ -180,13 +181,13 @@ class EditHandler(base.BaseHandler):
                if not post.is_editable(self.current_user):
                        raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
 
-               self.render("blog/compose.html", post=post)
+               self.render("blog/write.html", post=post)
 
        @tornado.web.authenticated
        def post(self, slug):
                post = self.backend.blog.get_by_slug(slug, published=False)
                if not post:
-                       raise tornado.web.HTTPError(404)
+                       raise tornado.web.HTTPError(404, "Could not find post %s" % slug)
 
                # Check if post is editable
                if not post.is_editable(self.current_user):
@@ -200,13 +201,8 @@ class EditHandler(base.BaseHandler):
                                tags  = self.get_argument("tags", "").split(" "),
                        )
 
-               # Return to blog if the post is already published
-               if post.is_published():
-                       self.redirect("/post/%s" % post.slug)
-                       return
-
-               # Otherwise return to drafts
-               self.redirect("/drafts")
+               # Redirect to the post
+               self.redirect("/blog/%s" % post.slug)
 
 
 class DeleteHandler(base.BaseHandler):