]> git.ipfire.org Git - ipfire.org.git/commitdiff
blog: Allow deleting posts
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 30 Oct 2018 08:58:18 +0000 (08:58 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Tue, 30 Oct 2018 08:58:32 +0000 (08:58 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/backend/blog.py
src/templates/blog/base.html
src/templates/blog/delete.html [new file with mode: 0644]
src/templates/blog/modules/post.html
src/web/__init__.py
src/web/blog.py

index 96469d76198103f4f8e1be2546ecbea1165df022..c864037cdb9c34d6e2e76d64f71f30ec1e61f38f 100644 (file)
@@ -112,6 +112,7 @@ templates_blog_DATA = \
        src/templates/blog/author.html \
        src/templates/blog/base.html \
        src/templates/blog/compose.html \
+       src/templates/blog/delete.html \
        src/templates/blog/drafts.html \
        src/templates/blog/feed.xml \
        src/templates/blog/index.html \
index 913ed2db8b53afcefe99f87224123f9a01880abd..78a2c6d8e30eb1961e3a5b09c20274346a3ad306 100644 (file)
@@ -356,3 +356,9 @@ class Post(misc.Object):
                # Update search index if post is published
                if self.is_published():
                        self.backend.blog.refresh()
+
+       def delete(self):
+               self.db.execute("DELETE FROM blog WHERE id = %s", self.id)
+
+               # Update search indices
+               self.backend.blog.refresh()
index eceb8eba2ff1c539d2b8eadd41c735fd1a25b2df..a242947104648b7ef8e55f1c7e19cccec21809f9 100644 (file)
                </div>
 
                <div class="col-12 col-lg-9">
-                       {% block main %}{% end block %}
+                       {% block main %}
+                               <div class="row justify-content-center">
+                                       <div class="col-12 col-md-6">
+                                               {% block modal %}{% end block %}
+                                       </div>
+                               </div>
+                       {% end block %}
                </div>
        </div>
 {% end block %}
diff --git a/src/templates/blog/delete.html b/src/templates/blog/delete.html
new file mode 100644 (file)
index 0000000..b4230b9
--- /dev/null
@@ -0,0 +1,23 @@
+{% extends "base.html" %}
+
+{% block title %}{{ _("Delete %s") % post.title }}{% end block %}
+
+{% block modal %}
+       <div class="card">
+               <div class="card-body">
+                       <h5 class="card-title mb-1">{{ _("Delete Post") }}</h5>
+                       <h6 class="card-subtitle text-muted mb-3">{{ post.title }}</h6>
+
+                       <p>
+                               {{ _("Do you really want to delete \"%s\"?") % post.title }}
+                       </p>
+
+                       <form action="" method="POST">
+                               {% raw xsrf_form_html() %}
+
+                               <button type="submit" class="btn btn-primary btn-block">{{ _("Delete") }}</button>
+                               <a class="btn btn-secondary btn-block" href="/post/{{ post.slug }}">{{ _("Cancel") }}</a>
+                       </form>
+               </div>
+       </div>
+{% end block %}
index 339be0c0f47e518971804df9af6120d5a4bf7257..1bb51aaf0fc99a2119c0a1140921f3b75c81648c 100644 (file)
@@ -32,6 +32,7 @@
 
                        {% if current_user and current_user == post.author %}
                                <a href="/post/{{ post.slug }}/edit">{{ _("Edit") }}</a>
+                               <a href="/post/{{ post.slug }}/delete">{{ _("Delete") }}</a>
                        {% end %}
                </p>
        </div>
index b07fb7b83806682a25ab70018fb1630f6c14d10c..971c26541088bbb19d6a056f90fe7483e680f725 100644 (file)
@@ -146,6 +146,7 @@ class Application(tornado.web.Application):
                        (r"/compose", blog.ComposeHandler),
                        (r"/drafts", blog.DraftsHandler),
                        (r"/post/([0-9a-z\-\._]+)", blog.PostHandler),
+                       (r"/post/([0-9a-z\-\._]+)/delete", blog.DeleteHandler),
                        (r"/post/([0-9a-z\-\._]+)/edit", blog.EditHandler),
                        (r"/post/([0-9a-z\-\._]+)/publish", blog.PublishHandler),
                        (r"/search", blog.SearchHandler),
index 65a73a6d736d5dde779ab32a272f9125e37fae2b..d39ef396446714328497f45457e40c2b329ebf4e 100644 (file)
@@ -189,6 +189,36 @@ class EditHandler(auth.CacheMixin, base.BaseHandler):
                self.redirect("/drafts")
 
 
+class DeleteHandler(auth.CacheMixin, base.BaseHandler):
+       @tornado.web.authenticated
+       def get(self, slug):
+               post = self.backend.blog.get_by_slug(slug, published=False)
+               if not post:
+                       raise tornado.web.HTTPError(404)
+
+               # Check if post is editable
+               if not post.is_editable(self.current_user):
+                       raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
+
+               self.render("blog/delete.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)
+
+               # Check if post is editable
+               if not post.is_editable(self.current_user):
+                       raise tornado.web.HTTPError(403, "%s cannot edit %s" % (self.current_user, post))
+
+               with self.db.transaction():
+                       post.delete()
+
+               # Return to drafts
+               self.redirect("/drafts")
+
+
 class HistoryNavigationModule(ui_modules.UIModule):
        def render(self):
                return self.render_string("blog/modules/history-navigation.html",