Browse Source

feat: 更新归档设置功能

SongZihuan 3 years ago
parent
commit
e24ee5407f
6 changed files with 122 additions and 7 deletions
  1. 55 3
      app/docx.py
  2. 13 1
      object/archive.py
  3. 7 0
      object/blog.py
  4. 22 0
      sql/archive.py
  5. 2 3
      sql/blog.py
  6. 23 0
      templates/docx/article.html

+ 55 - 3
app/docx.py

@@ -61,6 +61,35 @@ class UpdateBlogForm(EditorMD):
             self.content.data = blog.content
 
 
+class UpdateBlogArchiveForm(FlaskForm):
+    blog_id = HiddenField("ID", validators=[DataRequired()])
+    archive = SelectMultipleField("归档", coerce=int)
+    add = SubmitField("加入归档")
+    sub = SubmitField("去除归档")
+
+    def __init__(self, blog: Optional[BlogArticle] = None, **kwargs):
+        super().__init__(**kwargs)
+        archive = Archive.get_archive_list()
+        self.archive_res = []
+        self.archive_choices = []
+        for i in archive:
+            self.archive_res.append(i[0])
+            self.archive_choices.append((i[0], f"{i[1]} ({i[3]})"))
+        self.archive.choices = self.archive_choices
+        if blog is not None:
+            self.archive_data = []
+            self.archive.data = self.archive_data
+            for a in blog.archive:
+                a: Archive
+                self.archive_data.append(a)
+            self.blog_id.data = blog.blog_id
+
+    def validate_archive(self, field):
+        for i in field.data:
+            if i not in self.archive_res:
+                raise ValidationError("错误的归档被指定")
+
+
 class WriteCommentForm(FlaskForm):
     content = TextAreaField("", description="评论正文",
                             validators=[DataRequired(message="请输入评论的内容"),
@@ -113,7 +142,9 @@ def archive_page():
                            form=None)
 
 
-def __load_article_page(blog_id: int, form: WriteCommentForm, view: Optional[UpdateBlogForm] = None):
+def __load_article_page(blog_id: int, form: WriteCommentForm,
+                        view: Optional[UpdateBlogForm] = None,
+                        archive: Optional[UpdateBlogArchiveForm] = None):
     article = load_blog_by_id(blog_id)
     if article is None:
         app.HBlogFlask.print_user_opt_fail_log(f"Load article with error id({blog_id})")
@@ -122,11 +153,14 @@ def __load_article_page(blog_id: int, form: WriteCommentForm, view: Optional[Upd
     app.HBlogFlask.print_load_page_log(f"article (id: {blog_id})")
     if view is None:
         view = UpdateBlogForm(article)
+    if archive is None:
+        archive = UpdateBlogArchiveForm(article)
     return render_template("docx/article.html",
                            article=article,
                            archive_list=article.archive,
                            form=form,
                            view=view,
+                           archive=archive,
                            can_update=current_user.check_role("WriteBlog"),
                            show_delete=current_user.check_role("DeleteComment"),
                            show_email=current_user.check_role("ReadUserInfo"))
@@ -180,7 +214,7 @@ def create_docx_page():
 @docx.route('/article/update', methods=["POST"])
 @login_required
 @app.form_required(UpdateBlogForm, "update blog",
-                   lambda form: __load_article_page(int(request.args.get("blog", 1)), WriteCommentForm(), form))
+                   lambda form: __load_article_page(form.blog_id.data, WriteCommentForm(), form))
 @app.role_required("WriteBlog", "write blog")
 def update_docx_page():
     form: UpdateBlogForm = g.form
@@ -223,7 +257,25 @@ def set_blog_top_page():
     else:
         app.HBlogFlask.print_sys_opt_fail_log(f"set blog top ({top})")
         flash(f"博文{'取消' if not top else ''}置顶失败")
-    return redirect(url_for("docx.docx_page", page=1))
+    return redirect(url_for("docx.article_page", blog=blog_id))
+
+
+@docx.route("/article/set/archive", methods=["POST"])
+@login_required
+@app.form_required(UpdateBlogArchiveForm, "update archive",
+                   lambda form: __load_article_page(form.blog_id.data, WriteCommentForm(), UpdateBlogForm(), form))
+@app.role_required("WriteBlog", "update archive")
+def update_archive_page():
+    form: UpdateBlogArchiveForm = g.form
+    article = BlogArticle(form.blog_id.data, None, None, None, None)
+    add = request.args.get("add", '0') != '0'
+    for i in form.archive.data:
+        if add:
+            article.add_to_archive(i)
+        else:
+            article.sub_from_archive(i)
+    flash("归档设定完成")
+    return redirect(url_for("docx.article_page", blog=form.blog_id.data))
 
 
 @docx.route('/comment/create', methods=["POST"])

+ 13 - 1
object/archive.py

@@ -1,6 +1,12 @@
 from typing import Optional
 
-from sql.archive import get_archive_name_by_id, create_archive, get_archive_list, read_archive, delete_archive
+from sql.archive import (get_archive_name_by_id,
+                         create_archive,
+                         get_archive_list,
+                         read_archive,
+                         delete_archive,
+                         add_blog_to_archive,
+                         sub_blog_from_archive)
 
 
 def load_archive_by_id(archive_id: int) -> "Optional[Archive]":
@@ -33,3 +39,9 @@ class Archive:
 
     def delete(self):
         return delete_archive(self.archive_id)
+
+    def add_blog(self, blog_id: int):
+        add_blog_to_archive(blog_id, self.archive_id)
+
+    def sub_blog(self, blog_id: int):
+        sub_blog_from_archive(blog_id, self.archive_id)

+ 7 - 0
object/blog.py

@@ -12,6 +12,7 @@ from sql.blog import (get_blog_list,
                       delete_blog,
                       set_blog_top,
                       get_user_user_count)
+from sql.archive import add_blog_to_archive, sub_blog_from_archive
 import object.user
 import object.archive
 import object.comment
@@ -88,3 +89,9 @@ class BlogArticle:
 
     def set_top(self, top: bool):
         set_blog_top(self.blog_id, top)
+
+    def add_to_archive(self, archive_id: int):
+        return add_blog_to_archive(self.blog_id, archive_id)
+
+    def sub_from_archive(self, archive_id: int):
+        return sub_blog_from_archive(self.blog_id, archive_id)

+ 22 - 0
sql/archive.py

@@ -33,6 +33,28 @@ def delete_archive(archive_id: int):
     return True
 
 
+def add_blog_to_archive(blog_id: int, archive_id: int):
+    cur = db.search(columns=["BlogID"], table="blog_archive", where=f"BlogID={blog_id} AND ArchiveID={archive_id}")
+    if cur is None:
+        print("H1")
+        return False
+    if cur.rowcount > 0:
+        print("H2")
+        return True
+    cur = db.insert(table="blog_archive", columns=["BlogID", "ArchiveID"], values=f"{blog_id}, {archive_id}")
+    if cur is None or cur.rowcount != 1:
+        print("H3")
+        return False
+    return True
+
+
+def sub_blog_from_archive(blog_id: int, archive_id: int):
+    cur = db.delete(table="blog_archive", where=f"BlogID={blog_id} AND ArchiveID={archive_id}")
+    if cur is None:
+        return False
+    return True
+
+
 def get_archive_list(limit: Optional[int] = None, offset: Optional[int] = None):
     """ 获取归档列表 """
     cur = db.search(columns=["ID", "Name", "DescribeText", "Count"], table="archive_with_count",

+ 2 - 3
sql/blog.py

@@ -1,4 +1,5 @@
 from sql import db
+from sql.archive import add_blog_to_archive
 from typing import Optional, List
 import object.archive
 
@@ -15,9 +16,7 @@ def create_blog(auth_id: int, title: str, subtitle: str, content: str,
         return False
     blog_id = cur.lastrowid
     for archive in archive_list:
-        cur = db.insert(table="blog_archive", columns=["BlogID", "ArchiveID"],
-                        values=f"{blog_id}, {archive.archive_id}")
-        if cur is None or cur.rowcount == 0:
+        if not add_blog_to_archive(blog_id, archive.archive_id):
             return False
     return True
 

+ 23 - 0
templates/docx/article.html

@@ -53,6 +53,28 @@
                         {% endif %}
                     </form>
                         {% if can_update %}
+                            <div id="UpdateArchiveModal" class="modal fade" role="dialog" aria-hidden="true">
+                                <div class="modal-dialog">
+                                    <div class="modal-content text-left">
+                                        <div class="modal-header">
+                                            <h4 class="modal-title"> 更新博客归档信息? </h4>
+                                        </div>
+                                        <form method="post">
+                                            <div class="modal-body">
+                                                {{ archive.hidden_tag() }}
+                                                {{ archive.blog_id() }}
+                                                {{ macro.render_field(archive.archive) }}
+                                            </div>
+                                            <div class="modal-footer">
+                                                {{ archive.add(class="btn btn-outline-danger", formaction=url_for("docx.update_archive_page", add='1')) }}
+                                                {{ archive.sub(class="btn btn-outline-danger", formaction=url_for("docx.update_archive_page", add='0')) }}
+                                                <button type="button" class="btn btn-outline-dark" data-dismiss="modal">取消</button>
+                                            </div>
+                                        </form>
+                                    </div>
+                                </div>
+                            </div>
+
                             <div class="text-right mb-2">
                                 <a type="button" class="btn btn-primary" data-toggle="modal" data-target="#UpdateModal"> 更新博文 </a>
                                 {% if article.top %}
@@ -60,6 +82,7 @@
                                 {% else %}
                                     <a class="btn btn-danger" href="{{ url_for("docx.set_blog_top_page", blog=article.blog_id, top='1') }}"> 置顶文章 </a>
                                 {% endif %}
+                                <a type="button" class="btn btn-outline-danger" data-toggle="modal" data-target="#UpdateArchiveModal"> 更新归档 </a>
                             </div>
                         {% endif %}
                 </article>