Browse Source

change urls.py to __init__.py

change models.py to db.py
honmaple 6 years ago
parent
commit
0fe4ba2d99
57 changed files with 439 additions and 619 deletions
  1. 1 0
      .gitignore
  2. 2 2
      config.example
  3. 3 3
      forums/admin/forums.py
  4. 1 1
      forums/admin/message.py
  5. 1 1
      forums/admin/permission.py
  6. 2 2
      forums/admin/topic.py
  7. 2 2
      forums/admin/user.py
  8. 16 37
      forums/api/__init__.py
  9. 15 1
      forums/api/collect/__init__.py
  10. 13 16
      forums/api/collect/db.py
  11. 0 27
      forums/api/collect/urls.py
  12. 4 7
      forums/api/collect/views.py
  13. 21 1
      forums/api/follow/__init__.py
  14. 0 32
      forums/api/follow/urls.py
  15. 5 5
      forums/api/follow/views.py
  16. 4 4
      forums/api/forms.py
  17. 20 1
      forums/api/forums/__init__.py
  18. 11 4
      forums/api/forums/db.py
  19. 0 32
      forums/api/forums/urls.py
  20. 11 11
      forums/api/forums/views.py
  21. 13 1
      forums/api/message/__init__.py
  22. 25 50
      forums/api/message/db.py
  23. 0 24
      forums/api/message/urls.py
  24. 4 3
      forums/api/message/views.py
  25. 10 1
      forums/api/search/__init__.py
  26. 0 21
      forums/api/search/urls.py
  27. 1 1
      forums/api/search/views.py
  28. 19 1
      forums/api/setting/__init__.py
  29. 0 30
      forums/api/setting/urls.py
  30. 13 1
      forums/api/tag/__init__.py
  31. 13 8
      forums/api/tag/db.py
  32. 0 29
      forums/api/tag/urls.py
  33. 3 3
      forums/api/tag/views.py
  34. 30 1
      forums/api/topic/__init__.py
  35. 15 25
      forums/api/topic/db.py
  36. 0 43
      forums/api/topic/urls.py
  37. 7 8
      forums/api/topic/views.py
  38. 14 1
      forums/api/upload/__init__.py
  39. 0 25
      forums/api/upload/urls.py
  40. 28 1
      forums/api/user/__init__.py
  41. 1 1
      forums/api/user/db.py
  42. 0 39
      forums/api/user/urls.py
  43. 7 10
      forums/api/user/views.py
  44. 1 1
      forums/common/models.py
  45. 4 4
      forums/count.py
  46. 5 4
      forums/extension/__init__.py
  47. 1 1
      forums/extension/login.py
  48. 2 2
      forums/jinja.py
  49. 27 27
      runserver.py
  50. 1 1
      script/upgrade.py
  51. 3 3
      script/upgrade_count.py
  52. 1 1
      templates/base/link.html
  53. 23 23
      templates/board/board.html
  54. 1 1
      templates/board/board_list.html
  55. 26 26
      templates/topic/ask.html
  56. 4 4
      templates/topic/topic.html
  57. 5 5
      translations/zh/LC_MESSAGES/messages.po

+ 1 - 0
.gitignore

@@ -2,6 +2,7 @@ venv/
 **/config/
 migrations/
 backup/
+forums1/
 fabfile.py
 **/__pycache__/
 **/avatar/

+ 2 - 2
config.example

@@ -1,10 +1,10 @@
 #!/usr/bin/env python
 # -*- coding=UTF-8 -*-
 # **************************************************************************
-# Copyright © 2016 jianglin
+# Copyright © 2016-2019 jianglin
 # File Name: config.example
 # Author: jianglin
-# Email: xiyang0807@gmail.com
+# Email: mail@honmaple.com
 # Created: 2016-05-20 12:31:46 (CST)
 # Last Update: Thursday 2018-07-26 11:41:00 (CST)
 #          By: jianglin

+ 3 - 3
forums/admin/forums.py

@@ -6,14 +6,14 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-17 13:12:23 (CST)
-# Last Update:星期五 2017-11-10 11:04:16 (CST)
+# Last Update: Monday 2019-05-06 23:37:00 (CST)
 #          By:
 # Description:
 # **************************************************************************
 from .views import BaseView
 from forums.extension import db
-from forums.api.forums.models import Board
-from forums.api.tag.models import Tags
+from forums.api.forums.db import Board
+from forums.api.tag.db import Tags
 
 
 class BoardView(BaseView):

+ 1 - 1
forums/admin/message.py

@@ -12,7 +12,7 @@
 # **************************************************************************
 from .views import BaseView
 from forums.extension import db
-from forums.api.message.models import MessageText, Message
+from forums.api.message.db import MessageText, Message
 
 
 class MessageTextView(BaseView):

+ 1 - 1
forums/admin/permission.py

@@ -12,7 +12,7 @@
 # **************************************************************************
 from .views import BaseView
 from forums.extension import db
-from forums.api.user.models import Group, Permission
+from forums.api.user.db import Group, Permission
 
 
 class GroupView(BaseView):

+ 2 - 2
forums/admin/topic.py

@@ -12,8 +12,8 @@
 # **************************************************************************
 from .views import BaseView
 from forums.extension import db
-from forums.api.topic.models import Topic, Reply
-from forums.api.collect.models import Collect
+from forums.api.topic.db import Topic, Reply
+from forums.api.collect.db import Collect
 
 
 class TopicView(BaseView):

+ 2 - 2
forums/admin/user.py

@@ -12,7 +12,7 @@
 # **************************************************************************
 from .views import BaseView
 from forums.extension import db
-from forums.api.user.models import User, UserInfo, UserSetting
+from forums.api.user.db import User, UserInfo, UserSetting
 from wtforms import PasswordField
 from wtforms.validators import DataRequired
 
@@ -30,7 +30,7 @@ class UserView(BaseView):
     column_editable_list = ['is_confirmed', 'is_superuser']
     form_columns = ('username', 'email', 'password', 'is_confirmed',
                     'is_superuser')
-    # inline_models = (UserInfo, UserSetting)
+    # inline_db = (UserInfo, UserSetting)
     # form_extra_fields = {
     #     'password': PasswordField('Password', [DataRequired()])
     # }

+ 16 - 37
forums/api/__init__.py

@@ -6,46 +6,25 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-11-20 15:49:33 (CST)
-# Last Update:星期五 2018-01-05 00:21:42 (CST)
+# Last Update: Monday 2019-05-06 23:15:23 (CST)
 #          By:
 # Description:
 # **************************************************************************
-from forums.api.forums import urls as forums_url
-from forums.api.user import urls as user_url
-from forums.api.tag import urls as tag_url
-from forums.api.topic import urls as topic_url
-from forums.api.collect import urls as collect_url
-from forums.api.message import urls as message_url
-from forums.api.setting import urls as setting_url
-from forums.api.upload import urls as upload_url
-from forums.api.follow import urls as follow_url
-from forums.api.search import urls as search_url
+from werkzeug import import_string
 
 
 def init_app(app):
-    forums_url.init_app(app)
-    user_url.init_app(app)
-    tag_url.init_app(app)
-    topic_url.init_app(app)
-    collect_url.init_app(app)
-    message_url.init_app(app)
-    follow_url.init_app(app)
-    setting_url.init_app(app)
-    upload_url.init_app(app)
-    search_url.init_app(app)
-    # blueprints = [
-    #     'forums.api.forums.urls'
-    #     # 'forums.api.auth.urls',
-    #     'forums.api.tag.urls',
-    #     # 'forums.api.topic',
-    #     # 'forums.api.user.urls',
-    #     # 'forums.api.setting',
-    #     # 'forums.api.follow',
-    #     # 'forums.api.upload',
-    #     # 'forums.api.collect',
-    #     # 'forums.api.message',
-    #     # 'forums.api.search'
-    # ]
-    # for blueprint in blueprints:
-    #     import_module(blueprint).init_app(app)
-    #     # app.register_blueprint(import_module(blueprint))
+    blueprints = [
+        "forums.api.forums",
+        "forums.api.tag",
+        "forums.api.topic",
+        "forums.api.user",
+        "forums.api.collect",
+        "forums.api.message",
+        "forums.api.follow",
+        "forums.api.upload",
+        "forums.api.setting",
+        "forums.api.search",
+    ]
+    for blueprint in blueprints:
+        import_string(blueprint).init_app(app)

+ 15 - 1
forums/api/collect/__init__.py

@@ -6,7 +6,21 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-03-28 16:23:58 (CST)
-# Last Update:星期二 2017-3-28 16:23:58 (CST)
+# Last Update: Wednesday 2019-05-08 13:24:05 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import CollectListView, CollectView, AddToCollectView
+
+site = Blueprint('collect', __name__)
+
+
+def init_app(app):
+    site.add_url_rule('/collect', view_func=CollectListView.as_view('list'))
+    site.add_url_rule(
+        '/collect/<int:pk>', view_func=CollectView.as_view('collect'))
+    site.add_url_rule(
+        '/topic/<int:topicId>/collect',
+        view_func=AddToCollectView.as_view('add_to_collect'))
+    app.register_blueprint(site)

+ 13 - 16
forums/api/collect/models.py → forums/api/collect/db.py

@@ -1,19 +1,19 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2017 jianglin
-# File Name: models.py
+# ********************************************************************************
+# Copyright © 2019 jianglin
+# File Name: db.py
 # Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2017-03-28 17:58:59 (CST)
-# Last Update:星期三 2017-12-13 16:06:36 (CST)
+# Email: mail@honmaple.com
+# Created: 2019-05-07 00:41:33 (CST)
+# Last Update: Wednesday 2019-05-08 13:21:02 (CST)
 #          By:
 # Description:
-# **************************************************************************
+# ********************************************************************************
 from datetime import datetime
-from flask_maple.models import ModelMixin, ModelTimeMixin, ModelUserMixin
+from flask_maple.models import ModelMixin
 from flask_login import current_user
-from forums.api.user.models import User
+from forums.api.user.db import User
 from forums.extension import db
 
 topic_collect = db.Table(
@@ -37,9 +37,8 @@ class Collect(db.Model, ModelMixin):
         db.DateTime, default=datetime.utcnow(), nullable=False)
     updated_at = db.Column(
         db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
-    author_id = db.Column(
-        db.Integer, db.ForeignKey(
-            'user.id', ondelete="CASCADE"))
+    author_id = db.Column(db.Integer,
+                          db.ForeignKey('user.id', ondelete="CASCADE"))
     author = db.relationship(
         User,
         backref=db.backref(
@@ -49,15 +48,13 @@ class Collect(db.Model, ModelMixin):
     topics = db.relationship(
         'Topic',
         secondary=topic_collect,
-        backref=db.backref(
-            'collects', lazy='dynamic'),
+        backref=db.backref('collects', lazy='dynamic'),
         lazy='dynamic')
 
     followers = db.relationship(
         'User',
         secondary=collect_follower,
-        backref=db.backref(
-            'following_collects', lazy='dynamic'),
+        backref=db.backref('following_collects', lazy='dynamic'),
         lazy='dynamic')
 
     def is_followed(self, user=None):

+ 0 - 27
forums/api/collect/urls.py

@@ -1,27 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2017 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2017-03-28 16:15:16 (CST)
-# Last Update:星期五 2017-11-10 10:57:01 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import CollectListView, CollectView, AddToCollectView
-
-site = Blueprint('collect', __name__)
-
-site.add_url_rule('/collect', view_func=CollectListView.as_view('list'))
-site.add_url_rule(
-    '/collect/<int:pk>', view_func=CollectView.as_view('collect'))
-site.add_url_rule(
-    '/topic/<int:topicId>/collect',
-    view_func=AddToCollectView.as_view('add_to_collect'))
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 4 - 7
forums/api/collect/views.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-03-28 16:15:08 (CST)
-# Last Update: Thursday 2018-07-26 10:45:40 (CST)
+# Last Update: Monday 2019-05-06 23:36:54 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -19,15 +19,12 @@ from flask_maple.response import HTTPResponse
 from forums.api.forms import (CollectForm, ReplyForm, TopicForm,
                               collect_error_callback, error_callback,
                               form_board)
-from forums.api.forums.models import Board
-from forums.api.tag.models import Tags
-from forums.api.topic.models import Topic
-from flask_maple.serializer import Serializer
+from forums.api.topic.db import Topic
 from forums.common.utils import gen_filter_dict, gen_order_by
 from forums.common.views import IsAuthMethodView as MethodView
-from forums.api.message.models import MessageClient
+from forums.api.message.db import MessageClient
 
-from .models import Collect
+from .db import Collect
 
 
 class CollectListView(MethodView):

+ 21 - 1
forums/api/follow/__init__.py

@@ -6,7 +6,27 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-22 21:49:01 (CST)
-# Last Update:星期四 2016-12-22 21:49:2 (CST)
+# Last Update: Monday 2019-05-06 23:00:44 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import (FollowingTagsView, FollowingUsersView, FollowingTopicsView,
+                    FollowingCollectsView)
+
+site = Blueprint('follow', __name__, url_prefix='/following')
+
+topic_view = FollowingTopicsView.as_view('topic')
+tag_view = FollowingTagsView.as_view('tag')
+user_view = FollowingUsersView.as_view('user')
+collect_view = FollowingCollectsView.as_view('collect')
+
+site.add_url_rule('', view_func=topic_view)
+site.add_url_rule('/topics', view_func=topic_view)
+site.add_url_rule('/tags', view_func=tag_view)
+site.add_url_rule('/collects', view_func=collect_view)
+site.add_url_rule('/users', view_func=user_view)
+
+
+def init_app(app):
+    app.register_blueprint(site)

+ 0 - 32
forums/api/follow/urls.py

@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-22 21:49:08 (CST)
-# Last Update:星期五 2017-11-10 10:57:11 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import (FollowingTagsView, FollowingUsersView, FollowingTopicsView,
-                    FollowingCollectsView)
-
-site = Blueprint('follow', __name__, url_prefix='/following')
-
-topic_view = FollowingTopicsView.as_view('topic')
-tag_view = FollowingTagsView.as_view('tag')
-user_view = FollowingUsersView.as_view('user')
-collect_view = FollowingCollectsView.as_view('collect')
-
-site.add_url_rule('', view_func=topic_view)
-site.add_url_rule('/topics', view_func=topic_view)
-site.add_url_rule('/tags', view_func=tag_view)
-site.add_url_rule('/collects', view_func=collect_view)
-site.add_url_rule('/users', view_func=user_view)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 5 - 5
forums/api/follow/views.py

@@ -12,13 +12,13 @@
 # **************************************************************************
 from flask import render_template, request
 
-from forums.api.tag.models import Tags
-from forums.api.topic.models import Topic
-from forums.api.collect.models import Collect
-from forums.api.user.models import User
+from forums.api.tag.db import Tags
+from forums.api.topic.db import Topic
+from forums.api.collect.db import Collect
+from forums.api.user.db import User
 from forums.common.response import HTTPResponse
 from forums.common.views import IsAuthMethodView as MethodView
-from forums.api.message.models import MessageClient
+from forums.api.message.db import MessageClient
 
 
 class FollowingTagsView(MethodView):

+ 4 - 4
forums/api/forms.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-03-28 12:53:02 (CST)
-# Last Update: Thursday 2018-07-26 10:51:40 (CST)
+# Last Update: Monday 2019-05-06 23:36:53 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -18,9 +18,9 @@ from wtforms import (BooleanField, PasswordField, RadioField, SelectField,
                      StringField, TextAreaField)
 from wtforms.validators import DataRequired, Email, EqualTo, Length
 
-from forums.api.forums.models import Board
-from forums.api.topic.models import Topic
-from forums.api.user.models import UserSetting
+from forums.api.forums.db import Board
+from forums.api.topic.db import Topic
+from forums.api.user.db import UserSetting
 
 
 def error_callback():

+ 20 - 1
forums/api/forums/__init__.py

@@ -6,7 +6,26 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-17 20:44:07 (CST)
-# Last Update:星期六 2016-12-17 20:44:7 (CST)
+# Last Update: Wednesday 2019-05-08 13:18:36 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+
+site = Blueprint('forums', __name__)
+
+
+def init_app(app):
+    from .views import (IndexView, AboutView, HelpView, ContactView,
+                        BoardListView, BoardView)
+    forums_view = BoardListView.as_view('forums')
+
+    site.add_url_rule('/', view_func=IndexView.as_view('index'))
+    site.add_url_rule('/about', view_func=AboutView.as_view('about'))
+    site.add_url_rule('/help', view_func=HelpView.as_view('help'))
+    site.add_url_rule('/contact', view_func=ContactView.as_view('contact'))
+    site.add_url_rule('/index', view_func=forums_view)
+    site.add_url_rule('/forums', view_func=forums_view)
+    site.add_url_rule('/forums/<int:pk>', view_func=BoardView.as_view('board'))
+
+    app.register_blueprint(site)

+ 11 - 4
forums/api/forums/models.py → forums/api/forums/db.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-03-25 18:48:33 (CST)
-# Last Update:星期五 2017-3-31 15:53:1 (CST)
+# Last Update: Monday 2019-05-06 23:37:21 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -20,9 +20,8 @@ class Board(db.Model, ModelMixin):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(81), nullable=False)
     description = db.Column(db.String(128), nullable=False)
-    parent_id = db.Column(
-        db.Integer, db.ForeignKey(
-            'boards.id', ondelete="CASCADE"))
+    parent_id = db.Column(db.Integer,
+                          db.ForeignKey('boards.id', ondelete="CASCADE"))
     parent = db.relationship(
         'Board',
         remote_side=[id],
@@ -35,6 +34,14 @@ class Board(db.Model, ModelMixin):
         uselist=False)
 
     @property
+    def parent_board(self):
+        return self.parent
+
+    @property
+    def child_boards(self):
+        return self.children
+
+    @property
     def newest_topic(self):
         return self.topics.order_by('-id').first()
 

+ 0 - 32
forums/api/forums/urls.py

@@ -1,32 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-17 22:03:40 (CST)
-# Last Update:星期五 2017-11-10 10:42:19 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import (IndexView, AboutView, HelpView, ContactView, BoardListView,
-                    BoardView)
-
-site = Blueprint('forums', __name__)
-
-forums_view = BoardListView.as_view('forums')
-
-site.add_url_rule('/', view_func=IndexView.as_view('index'))
-site.add_url_rule('/about', view_func=AboutView.as_view('about'))
-site.add_url_rule('/help', view_func=HelpView.as_view('help'))
-site.add_url_rule('/contact', view_func=ContactView.as_view('contact'))
-site.add_url_rule('/index', view_func=forums_view)
-site.add_url_rule('/forums', view_func=forums_view)
-site.add_url_rule(
-    '/forums/<int:boardId>', view_func=BoardView.as_view('board'))
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 11 - 11
forums/api/forums/views.py

@@ -6,19 +6,19 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-17 20:45:08 (CST)
-# Last Update: Thursday 2018-07-26 10:45:40 (CST)
+# Last Update: Monday 2019-05-06 23:36:54 (CST)
 #          By:
 # Description:
 # **************************************************************************
 from flask import render_template, request
 from flask_babel import gettext as _
 
-from forums.api.topic.models import Topic
+from forums.api.topic.db import Topic
 from forums.common.views import BaseMethodView as MethodView
 from forums.common.utils import (gen_filter_dict, gen_order_by)
 from forums.api.utils import gen_topic_filter, gen_topic_orderby
 
-from .models import Board
+from .db import Board
 
 
 class IndexView(MethodView):
@@ -65,14 +65,14 @@ class BoardListView(MethodView):
 
 
 class BoardView(MethodView):
-    def get(self, boardId):
-        board = Board.query.filter_by(id=boardId).first_or_404()
-        has_children = board.children.exists()
-        topics = self.topics(boardId, has_children)
+    def get(self, pk):
+        board = Board.query.filter_by(id=pk).first_or_404()
+        has_children = board.child_boards.exists()
+        topics = self.topics(pk, has_children)
         data = {'title': 'Board', 'board': board, 'topics': topics}
         return render_template('board/board.html', **data)
 
-    def topics(self, boardId, has_children):
+    def topics(self, pk, has_children):
         query_dict = request.data
         page, number = self.pageinfo
         keys = ['title']
@@ -88,10 +88,10 @@ class BoardView(MethodView):
                 else:
                     o.append(getattr(Topic, i))
             topics = Topic.query.filter_by(**filter_dict).outerjoin(Board).or_(
-                Board.parent_id == boardId,
-                Board.id == boardId).order_by(*o).paginate(page, number, True)
+                Board.parent_id == pk,
+                Board.id == pk).order_by(*o).paginate(page, number, True)
             return topics
-        filter_dict.update(board_id=boardId)
+        filter_dict.update(board_id=pk)
         topics = Topic.query.filter_by(
             **filter_dict).order_by(*order_by).paginate(page, number, True)
         return topics

+ 13 - 1
forums/api/message/__init__.py

@@ -6,7 +6,19 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-04-01 18:33:33 (CST)
-# Last Update:星期六 2017-4-1 18:33:34 (CST)
+# Last Update: Monday 2019-05-06 23:00:30 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import MessageListView
+
+site = Blueprint('message', __name__, url_prefix='/message')
+
+message_list = MessageListView.as_view('list')
+
+site.add_url_rule('', view_func=message_list)
+
+
+def init_app(app):
+    app.register_blueprint(site)

+ 25 - 50
forums/api/message/models.py → forums/api/message/db.py

@@ -2,11 +2,11 @@
 # -*- coding: utf-8 -*-
 # **************************************************************************
 # Copyright © 2017 jianglin
-# File Name: models.py
+# File Name: db.py
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-04-01 18:33:37 (CST)
-# Last Update: Thursday 2018-07-26 10:05:23 (CST)
+# Last Update: Tuesday 2019-05-07 01:19:46 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -49,17 +49,17 @@ class MessageText(CommonTimeMixin, db.Model):
     sender_id = db.Column(db.Integer, db.ForeignKey('user.id'))
     sender = db.relationship(
         'User',
-        backref=db.backref(
-            'send_messages', lazy='dynamic'),
+        backref=db.backref('send_messages', lazy='dynamic'),
         lazy='joined',
         uselist=False)
 
     @classmethod
     def get_choice_dict(cls):
-        return dict(messagetext=dict(
-            status=dict(cls.STATUS),
-            message_type=dict(cls.MESSAGE_TYPE),
-            read_status=dict(cls.READ_STATUS)))
+        return dict(
+            messagetext=dict(
+                status=dict(cls.STATUS),
+                message_type=dict(cls.MESSAGE_TYPE),
+                read_status=dict(cls.READ_STATUS)))
 
     def __str__(self):
         return self.title
@@ -92,15 +92,13 @@ class Message(CommonTimeMixin, db.Model):
     message_text_id = db.Column(db.Integer, db.ForeignKey('message_text.id'))
     message_text = db.relationship(
         MessageText,
-        backref=db.backref(
-            "messages", cascade='all,delete', lazy='dynamic'),
+        backref=db.backref("messages", cascade='all,delete', lazy='dynamic'),
         uselist=False,
         lazy='joined')
     receiver_id = db.Column(db.Integer, db.ForeignKey('user.id'))
     receiver = db.relationship(
         'User',
-        backref=db.backref(
-            'receive_messages', lazy='dynamic'),
+        backref=db.backref('receive_messages', lazy='dynamic'),
         lazy='joined',
         uselist=False)
 
@@ -142,12 +140,8 @@ class MessageClient(object):
         if sender.id == receiver.id:
             return
         title = '[{}]({})回复了你创建的主题:[{}]({})'.format(
-            sender.username,
-            url_for(
-                'user.user', username=sender.username),
-            topic.title,
-            url_for(
-                'topic.topic', topicId=topic.id))
+            sender.username, url_for('user.user', username=sender.username),
+            topic.title, url_for('topic.topic', topicId=topic.id))
         content = reply.content
         message_text = MessageText(
             sender_id=sender.id, title=title, content=content)
@@ -167,12 +161,8 @@ class MessageClient(object):
         if sender.id == receiver.id:
             return
         title = '[{}]({})收藏了你创建的主题:[{}]({})'.format(
-            sender.username,
-            url_for(
-                'user.user', username=sender.username),
-            topic.title,
-            url_for(
-                'topic.topic', topicId=topic.id))
+            sender.username, url_for('user.user', username=sender.username),
+            topic.title, url_for('topic.topic', topicId=topic.id))
         content = 'a'
         message_text = MessageText(
             sender_id=sender.id, title=title, content=content)
@@ -191,26 +181,19 @@ class MessageClient(object):
         if following.__class__.__name__ == 'Topic':
             receiver = following.author
             title = '[{}]({})关注了你创建的主题:[{}]({})'.format(
-                sender.username,
-                url_for(
-                    'user.user', username=sender.username),
-                following.title,
-                url_for(
-                    'topic.topic', topicId=following.id))
+                sender.username, url_for(
+                    'user.user', username=sender.username), following.title,
+                url_for('topic.topic', topicId=following.id))
         elif following.__class__.__name__ == 'Collect':
             receiver = following.author
             title = '[{}]({})关注了你创建的收藏:[{}]({})'.format(
-                sender.username,
-                url_for(
-                    'user.user', username=sender.username),
-                following.title,
-                url_for(
-                    'collect.collect', pk=following.id))
+                sender.username, url_for(
+                    'user.user', username=sender.username), following.title,
+                url_for('collect.collect', pk=following.id))
         elif following.__class__.__name__ == 'User':
             receiver = following
             title = '[{}]({})关注了你'.format(
-                sender.username,
-                url_for(
+                sender.username, url_for(
                     'user.user', username=sender.username))
         if sender.id == receiver.id:
             return
@@ -234,12 +217,8 @@ class MessageClient(object):
             return
         topic = reply.topic
         title = '[{}]({})在[{}]({})回复了你'.format(
-            sender.username,
-            url_for(
-                'user.user', username=sender.username),
-            topic.title,
-            url_for(
-                'topic.topic', topicId=topic.id))
+            sender.username, url_for('user.user', username=sender.username),
+            topic.title, url_for('topic.topic', topicId=topic.id))
         content = reply.content
         message_text = MessageText(
             sender_id=sender.id, title=title, content=content)
@@ -260,12 +239,8 @@ class MessageClient(object):
             return
         topic = reply.topic
         title = '[{}]({})在[{}]({})赞了你的回复'.format(
-            sender.username,
-            url_for(
-                'user.user', username=sender.username),
-            topic.title,
-            url_for(
-                'topic.topic', topicId=topic.id))
+            sender.username, url_for('user.user', username=sender.username),
+            topic.title, url_for('topic.topic', topicId=topic.id))
         content = reply.content
         message_text = MessageText(
             sender_id=sender.id, title=title, content=content)

+ 0 - 24
forums/api/message/urls.py

@@ -1,24 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2017 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2017-04-01 18:34:38 (CST)
-# Last Update:星期五 2017-11-10 10:57:22 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import MessageListView
-
-site = Blueprint('message', __name__, url_prefix='/message')
-
-message_list = MessageListView.as_view('list')
-
-site.add_url_rule('', view_func=message_list)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 4 - 3
forums/api/message/views.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-04-01 18:34:07 (CST)
-# Last Update: Thursday 2018-07-26 10:45:40 (CST)
+# Last Update: Wednesday 2019-05-08 13:16:02 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -15,7 +15,7 @@ from flask import render_template, request
 from forums.common.views import IsAuthMethodView as MethodView
 from forums.count import Count
 
-from .models import Message, MessageText
+from .db import Message, MessageText
 
 
 class MessageListView(MethodView):
@@ -26,7 +26,8 @@ class MessageListView(MethodView):
         page, number = self.pageinfo
         messages = Message.query.filter_by(
             receiver_id=user.id,
-            status=status).order_by('-created_at').paginate(page, number, True)
+            status=status).order_by('-created_at').paginate(
+                page, number, True)
         data = {'title': 'Notice', 'messages': messages}
         Count.user_message_count(user.id, clear=True)
         return render_template('forums/message.html', **data)

+ 10 - 1
forums/api/search/__init__.py

@@ -6,7 +6,16 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-03-31 17:25:57 (CST)
-# Last Update:星期五 2017-3-31 17:25:58 (CST)
+# Last Update: Monday 2019-05-06 23:00:20 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import SearchView
+
+site = Blueprint('search', __name__)
+
+site.add_url_rule('/search', view_func=SearchView.as_view('search'))
+
+def init_app(app):
+    app.register_blueprint(site)

+ 0 - 21
forums/api/search/urls.py

@@ -1,21 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2017 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2017-03-31 17:27:30 (CST)
-# Last Update:星期五 2017-11-10 10:57:29 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import SearchView
-
-site = Blueprint('search', __name__)
-
-site.add_url_rule('/search', view_func=SearchView.as_view('search'))
-
-def init_app(app):
-    app.register_blueprint(site)

+ 1 - 1
forums/api/search/views.py

@@ -12,7 +12,7 @@
 # **************************************************************************
 from flask import request, render_template
 from forums.common.views import BaseMethodView as MethodView
-from forums.api.topic.models import Topic
+from forums.api.topic.db import Topic
 
 
 class SearchView(MethodView):

+ 19 - 1
forums/api/setting/__init__.py

@@ -6,7 +6,25 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-20 22:12:01 (CST)
-# Last Update:星期二 2016-12-20 22:16:10 (CST)
+# Last Update: Monday 2019-05-06 23:00:11 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import ProfileView, PasswordView, PrivacyView, BabelView
+
+site = Blueprint('setting', __name__, url_prefix='/setting')
+setting_view = ProfileView.as_view('setting')
+password_view = PasswordView.as_view('password')
+privacy_view = PrivacyView.as_view('privacy')
+babel_view = BabelView.as_view('babel')
+
+site.add_url_rule('', view_func=setting_view)
+site.add_url_rule('/profile', view_func=setting_view)
+site.add_url_rule('/password', view_func=password_view)
+site.add_url_rule('/privacy', view_func=privacy_view)
+site.add_url_rule('/babel', view_func=babel_view)
+
+
+def init_app(app):
+    app.register_blueprint(site)

+ 0 - 30
forums/api/setting/urls.py

@@ -1,30 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-20 22:15:58 (CST)
-# Last Update:星期五 2017-11-10 10:57:39 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import ProfileView, PasswordView, PrivacyView, BabelView
-
-site = Blueprint('setting', __name__, url_prefix='/setting')
-setting_view = ProfileView.as_view('setting')
-password_view = PasswordView.as_view('password')
-privacy_view = PrivacyView.as_view('privacy')
-babel_view = BabelView.as_view('babel')
-
-site.add_url_rule('', view_func=setting_view)
-site.add_url_rule('/profile', view_func=setting_view)
-site.add_url_rule('/password', view_func=password_view)
-site.add_url_rule('/privacy', view_func=privacy_view)
-site.add_url_rule('/babel', view_func=babel_view)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 13 - 1
forums/api/tag/__init__.py

@@ -6,7 +6,19 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 20:46:19 (CST)
-# Last Update:星期四 2016-12-15 20:46:21 (CST)
+# Last Update: Monday 2019-05-06 23:23:45 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+
+site = Blueprint('tag', __name__, url_prefix='/tags')
+
+
+def init_app(app):
+    from .views import TagsListView, TagsView, TagFeedView
+    site.add_url_rule('', view_func=TagsListView.as_view('list'))
+    site.add_url_rule('/<name>', view_func=TagsView.as_view('tag'))
+    site.add_url_rule('/<name>/feed', view_func=TagFeedView.as_view('feed'))
+
+    app.register_blueprint(site)

+ 13 - 8
forums/api/tag/models.py → forums/api/tag/db.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 20:46:13 (CST)
-# Last Update:星期三 2017-12-13 16:06:36 (CST)
+# Last Update: Monday 2019-05-06 23:37:21 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -28,9 +28,8 @@ class Tags(db.Model, ModelMixin):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(64), nullable=False)
     description = db.Column(db.String(128), nullable=False)
-    parent_id = db.Column(
-        db.Integer, db.ForeignKey(
-            'tags.id', ondelete="CASCADE"))
+    parent_id = db.Column(db.Integer,
+                          db.ForeignKey('tags.id', ondelete="CASCADE"))
     parent = db.relationship(
         'Tags',
         remote_side=[id],
@@ -44,14 +43,12 @@ class Tags(db.Model, ModelMixin):
     topics = db.relationship(
         'Topic',
         secondary=tag_topic,
-        backref=db.backref(
-            'tags', lazy='dynamic'),
+        backref=db.backref('tags', lazy='dynamic'),
         lazy='dynamic')
     followers = db.relationship(
         'User',
         secondary=tag_follower,
-        backref=db.backref(
-            'following_tags', lazy='dynamic'),
+        backref=db.backref('following_tags', lazy='dynamic'),
         lazy='dynamic')
 
     def is_followed(self, user=None):
@@ -62,6 +59,14 @@ class Tags(db.Model, ModelMixin):
             tag_follower.c.follower_id == user.id).exists()
 
     @property
+    def parent_tag(self):
+        return self.parent
+
+    @property
+    def child_tags(self):
+        return self.children
+
+    @property
     def related_tags(self):
         parent = self.parent
         if not parent:

+ 0 - 29
forums/api/tag/urls.py

@@ -1,29 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-15 22:20:55 (CST)
-# Last Update:星期五 2017-11-10 10:43:36 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import TagsListView, TagsView, TagFeedView
-
-site = Blueprint('tag', __name__, url_prefix='/tags')
-
-tag_list = TagsListView.as_view('list')
-tag = TagsView.as_view('tag')
-tag_feed = TagFeedView.as_view('feed')
-
-site.add_url_rule('', view_func=tag_list)
-site.add_url_rule('', view_func=tag_list)
-site.add_url_rule('/<name>', view_func=tag)
-site.add_url_rule('/<name>/feed', view_func=tag_feed)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 3 - 3
forums/api/tag/views.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 22:07:04 (CST)
-# Last Update: Thursday 2018-07-26 10:45:40 (CST)
+# Last Update: Monday 2019-05-06 23:36:54 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -15,12 +15,12 @@ from urllib.parse import urljoin
 from flask import current_app, render_template, request, url_for
 from werkzeug.contrib.atom import AtomFeed
 
-from forums.api.topic.models import Topic
+from forums.api.topic.db import Topic
 from forums.api.utils import gen_topic_filter, gen_topic_orderby
 from forums.common.utils import gen_filter_dict, gen_order_by
 from forums.common.views import BaseMethodView as MethodView
 
-from .models import Tags
+from .db import Tags
 
 
 class TagsListView(MethodView):

+ 30 - 1
forums/api/topic/__init__.py

@@ -6,7 +6,36 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-13 23:22:48 (CST)
-# Last Update:星期四 2016-12-15 20:52:12 (CST)
+# Last Update: Monday 2019-05-06 23:03:23 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+
+site = Blueprint('topic', __name__)
+
+
+def init_app(app):
+    from .views import (LikeView, ReplyListView, ReplyView, TopicAskView,
+                        TopicEditView, TopicListView, TopicView)
+    topic_list = TopicListView.as_view('list')
+    topic_good_list = TopicListView.as_view('good')
+    topic_top_list = TopicListView.as_view('top')
+    topic = TopicView.as_view('topic')
+    ask_view = TopicAskView.as_view('ask')
+    edit_view = TopicEditView.as_view('edit')
+
+    reply_list = ReplyListView.as_view('reply_list')
+    reply = ReplyView.as_view('reply')
+    like_view = LikeView.as_view('reply_like')
+
+    site.add_url_rule('/topic/ask', view_func=ask_view)
+    site.add_url_rule('/topic', view_func=topic_list)
+    site.add_url_rule('/topic/top', view_func=topic_top_list)
+    site.add_url_rule('/topic/good', view_func=topic_good_list)
+    site.add_url_rule('/topic/<int:topicId>', view_func=topic)
+    site.add_url_rule('/topic/<int:topicId>/edit', view_func=edit_view)
+    site.add_url_rule('/topic/<int:topicId>/replies', view_func=reply_list)
+    site.add_url_rule('/replies/<int:replyId>', view_func=reply)
+    site.add_url_rule('/replies/<int:replyId>/like', view_func=like_view)
+    app.register_blueprint(site)

+ 15 - 25
forums/api/topic/models.py → forums/api/topic/db.py

@@ -6,19 +6,15 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 20:52:07 (CST)
-# Last Update: Thursday 2018-07-26 11:35:50 (CST)
+# Last Update: Monday 2019-05-06 23:37:22 (CST)
 #          By:
 # Description:
 # **************************************************************************
 from datetime import datetime
 
-from flask import current_app
 from flask_login import current_user
 
-from flask_maple.models import ModelMixin, ModelTimeMixin, ModelUserMixin
-from forums.api.forums.models import Board
-from forums.api.user.models import User
-from forums.common.models import CommonUserMixin
+from flask_maple.models import ModelMixin
 from forums.extension import db
 from forums.count import Count
 from forums.jinja import safe_clean, markdown
@@ -51,27 +47,24 @@ class Topic(db.Model, ModelMixin):
         db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
     is_good = db.Column(db.Boolean, default=False)
     is_top = db.Column(db.Boolean, default=False)
-    author_id = db.Column(
-        db.Integer, db.ForeignKey(
-            'user.id', ondelete="CASCADE"))
+    author_id = db.Column(db.Integer,
+                          db.ForeignKey('user.id', ondelete="CASCADE"))
     author = db.relationship(
-        User,
+        "User",
         backref=db.backref(
             'topics', cascade='all,delete-orphan', lazy='dynamic'),
         lazy='joined')
-    board_id = db.Column(
-        db.Integer, db.ForeignKey(
-            'boards.id', ondelete="CASCADE"))
+    board_id = db.Column(db.Integer,
+                         db.ForeignKey('boards.id', ondelete="CASCADE"))
     board = db.relationship(
-        Board,
+        "Board",
         backref=db.backref(
             'topics', cascade='all,delete-orphan', lazy='dynamic'),
         lazy='joined')
     followers = db.relationship(
-        User,
+        "User",
         secondary=topic_follower,
-        backref=db.backref(
-            'following_topics', lazy='dynamic'),
+        backref=db.backref('following_topics', lazy='dynamic'),
         lazy='dynamic')
 
     __mapper_args__ = {"order_by": created_at.desc()}
@@ -137,9 +130,8 @@ class Reply(db.Model, ModelMixin):
         db.DateTime, default=datetime.utcnow(), nullable=False)
     updated_at = db.Column(
         db.DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
-    topic_id = db.Column(
-        db.Integer, db.ForeignKey(
-            'topics.id', ondelete="CASCADE"))
+    topic_id = db.Column(db.Integer,
+                         db.ForeignKey('topics.id', ondelete="CASCADE"))
     topic = db.relationship(
         Topic,
         backref=db.backref(
@@ -148,14 +140,12 @@ class Reply(db.Model, ModelMixin):
 
     author_id = db.Column(db.Integer, db.ForeignKey('user.id'))
     author = db.relationship(
-        User, backref=db.backref(
-            'replies', lazy='dynamic'), lazy='joined')
+        "User", backref=db.backref('replies', lazy='dynamic'), lazy='joined')
 
     likers = db.relationship(
-        User,
+        "User",
         secondary=reply_liker,
-        backref=db.backref(
-            'like_replies', lazy='dynamic'),
+        backref=db.backref('like_replies', lazy='dynamic'),
         lazy='dynamic')
 
     def is_liked(self, user=None):

+ 0 - 43
forums/api/topic/urls.py

@@ -1,43 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-15 22:15:34 (CST)
-# Last Update: Thursday 2018-07-26 10:07:07 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-
-from .views import (LikeView, ReplyListView, ReplyView, TopicAskView,
-                    TopicEditView, TopicListView, TopicView)
-
-site = Blueprint('topic', __name__)
-
-topic_list = TopicListView.as_view('list')
-topic_good_list = TopicListView.as_view('good')
-topic_top_list = TopicListView.as_view('top')
-topic = TopicView.as_view('topic')
-ask_view = TopicAskView.as_view('ask')
-edit_view = TopicEditView.as_view('edit')
-
-reply_list = ReplyListView.as_view('reply_list')
-reply = ReplyView.as_view('reply')
-like_view = LikeView.as_view('reply_like')
-
-site.add_url_rule('/topic/ask', view_func=ask_view)
-site.add_url_rule('/topic', view_func=topic_list)
-site.add_url_rule('/topic/top', view_func=topic_top_list)
-site.add_url_rule('/topic/good', view_func=topic_good_list)
-site.add_url_rule('/topic/<int:topicId>', view_func=topic)
-site.add_url_rule('/topic/<int:topicId>/edit', view_func=edit_view)
-site.add_url_rule('/topic/<int:topicId>/replies', view_func=reply_list)
-site.add_url_rule('/replies/<int:replyId>', view_func=reply)
-site.add_url_rule('/replies/<int:replyId>/like', view_func=like_view)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 7 - 8
forums/api/topic/views.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 22:07:39 (CST)
-# Last Update: Thursday 2018-07-26 11:36:27 (CST)
+# Last Update: Monday 2019-05-06 23:36:54 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -19,27 +19,26 @@ from flask_maple.response import HTTPResponse
 from forums.api.forms import (CollectForm, ReplyForm, TopicForm,
                               collect_error_callback, error_callback,
                               form_board)
-from forums.api.forums.models import Board
-from forums.api.tag.models import Tags
+from forums.api.tag.db import Tags
 from forums.api.utils import gen_topic_filter, gen_topic_orderby
 from flask_maple.serializer import Serializer
 from forums.common.utils import gen_filter_dict, gen_order_by
 from forums.common.views import BaseMethodView as MethodView
 from forums.common.views import IsAuthMethodView, IsConfirmedMethodView
 
-from .models import Reply, Topic
+from .db import Reply, Topic
 from .permissions import (like_permission, reply_list_permission,
                           reply_permission, topic_list_permission,
                           topic_permission, edit_permission)
-from forums.api.message.models import MessageClient
+from forums.api.message.db import MessageClient
 
 
 class TopicAskView(IsConfirmedMethodView):
     def get(self):
-        boardId = request.args.get('boardId', type=int)
+        pk = request.args.get('pk', type=int)
         form = form_board()
-        if boardId is not None:
-            form.category.data = boardId
+        if pk is not None:
+            form.category.data = pk
         data = {'title': _('Ask - '), 'form': form}
         return render_template('topic/ask.html', **data)
 

+ 14 - 1
forums/api/upload/__init__.py

@@ -6,7 +6,20 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-21 21:56:10 (CST)
-# Last Update:星期三 2016-12-21 21:56:44 (CST)
+# Last Update: Monday 2019-05-06 22:59:34 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import AvatarView, AvatarFileView
+
+site = Blueprint('upload', __name__)
+avatar_file_view = AvatarFileView.as_view('avatar_file')
+avatar_view = AvatarView.as_view('avatar')
+
+site.add_url_rule('/avatar', view_func=avatar_view)
+site.add_url_rule('/avatars/<filename>', view_func=avatar_file_view)
+
+
+def init_app(app):
+    app.register_blueprint(site)

+ 0 - 25
forums/api/upload/urls.py

@@ -1,25 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-21 21:56:49 (CST)
-# Last Update:星期五 2017-11-10 10:57:55 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-from .views import AvatarView, AvatarFileView
-
-site = Blueprint('upload', __name__)
-avatar_file_view = AvatarFileView.as_view('avatar_file')
-avatar_view = AvatarView.as_view('avatar')
-
-site.add_url_rule('/avatar', view_func=avatar_view)
-site.add_url_rule('/avatars/<filename>', view_func=avatar_file_view)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 28 - 1
forums/api/user/__init__.py

@@ -6,7 +6,34 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 20:58:31 (CST)
-# Last Update:星期四 2016-12-15 21:9:15 (CST)
+# Last Update: Monday 2019-05-06 23:16:08 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import Blueprint
+from .views import (UserCollectListView, UserFollowingListView,
+                    UserFollowerListView, UserListView, UserReplyListView,
+                    UserView)
+
+site = Blueprint('user', __name__, url_prefix='/u')
+
+
+def init_app(app):
+
+    user_list = UserListView.as_view('list')
+    user = UserView.as_view('user')
+    topics = UserView.as_view('topic')
+    replies = UserReplyListView.as_view('reply')
+    collects = UserCollectListView.as_view('collect')
+    followers = UserFollowerListView.as_view('follower')
+    followings = UserFollowingListView.as_view('following')
+
+    site.add_url_rule('', view_func=user_list)
+    site.add_url_rule('/<username>', view_func=user)
+    site.add_url_rule('/<username>/topics', view_func=topics)
+    site.add_url_rule('/<username>/replies', view_func=replies)
+    site.add_url_rule('/<username>/collects', view_func=collects)
+    site.add_url_rule('/<username>/followers', view_func=followers)
+    site.add_url_rule('/<username>/followings', view_func=followings)
+
+    app.register_blueprint(site)

+ 1 - 1
forums/api/user/models.py → forums/api/user/db.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 21:09:08 (CST)
-# Last Update: Wednesday 2018-07-25 18:54:54 (CST)
+# Last Update: Monday 2019-05-06 23:37:21 (CST)
 #          By:
 # Description:
 # **************************************************************************

+ 0 - 39
forums/api/user/urls.py

@@ -1,39 +0,0 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-# **************************************************************************
-# Copyright © 2016 jianglin
-# File Name: urls.py
-# Author: jianglin
-# Email: xiyang0807@gmail.com
-# Created: 2016-12-15 22:24:23 (CST)
-# Last Update:星期五 2017-11-10 10:58:03 (CST)
-#          By:
-# Description:
-# **************************************************************************
-from flask import Blueprint
-
-from .views import (UserCollectListView, UserFollowingListView,
-                    UserFollowerListView, UserListView, UserReplyListView,
-                    UserView)
-
-site = Blueprint('user', __name__, url_prefix='/u')
-
-user_list = UserListView.as_view('list')
-user = UserView.as_view('user')
-topics = UserView.as_view('topic')
-replies = UserReplyListView.as_view('reply')
-collects = UserCollectListView.as_view('collect')
-followers = UserFollowerListView.as_view('follower')
-followings = UserFollowingListView.as_view('following')
-
-site.add_url_rule('', view_func=user_list)
-site.add_url_rule('/<username>', view_func=user)
-site.add_url_rule('/<username>/topics', view_func=topics)
-site.add_url_rule('/<username>/replies', view_func=replies)
-site.add_url_rule('/<username>/collects', view_func=collects)
-site.add_url_rule('/<username>/followers', view_func=followers)
-site.add_url_rule('/<username>/followings', view_func=followings)
-
-
-def init_app(app):
-    app.register_blueprint(site)

+ 7 - 10
forums/api/user/views.py

@@ -6,20 +6,17 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-12-15 22:08:06 (CST)
-# Last Update: Thursday 2018-07-26 10:45:40 (CST)
+# Last Update: Monday 2019-05-06 23:36:53 (CST)
 #          By:
 # Description:
 # **************************************************************************
 from flask import redirect, render_template, request, url_for
 from flask_login import current_user, login_required
-from forums.api.forums.models import Board
-from forums.api.tag.models import Tags
-from forums.api.topic.models import Topic, Reply
-from forums.api.collect.models import Collect
+from forums.api.topic.db import Topic, Reply
 from forums.common.utils import gen_filter_dict, gen_order_by
 from forums.common.views import BaseMethodView as MethodView
 
-from .models import User
+from .db import User
 
 
 class UserListView(MethodView):
@@ -48,8 +45,8 @@ class UserView(MethodView):
             **filter_dict).order_by(*order_by).paginate(page, number, True)
         setting = user.setting
         topic_is_allowed = False
-        if setting.topic_list == 1 or (setting.topic_list == 2 and
-                                       current_user.is_authenticated):
+        if setting.topic_list == 1 or (setting.topic_list == 2
+                                       and current_user.is_authenticated):
             topic_is_allowed = True
         if current_user.is_authenticated and current_user.id == user.id:
             topic_is_allowed = True
@@ -74,8 +71,8 @@ class UserReplyListView(MethodView):
             **filter_dict).order_by(*order_by).paginate(page, number, True)
         setting = user.setting
         replies_is_allowed = False
-        if setting.rep_list == 1 or (current_user.is_authenticated and
-                                     setting.rep_list == 2):
+        if setting.rep_list == 1 or (current_user.is_authenticated
+                                     and setting.rep_list == 2):
             replies_is_allowed = True
         if current_user.is_authenticated and current_user.id == user.id:
             replies_is_allowed = True

+ 1 - 1
forums/common/models.py

@@ -2,7 +2,7 @@
 # -*- coding: utf-8 -*-
 # **************************************************************************
 # Copyright © 2017 jianglin
-# File Name: models.py
+# File Name: db.py
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2017-01-25 21:33:09 (CST)

+ 4 - 4
forums/count.py

@@ -16,8 +16,8 @@ from .extension import redis_data
 
 class Count(object):
     @classmethod
-    def board_topic_count(cls, boardId, value=None):
-        key = 'count:board:%s' % str(boardId)
+    def board_topic_count(cls, pk, value=None):
+        key = 'count:board:%s' % str(pk)
         if value is not None:
             pipe = redis_data.pipeline()
             pipe.hincrby(key, 'topic', value)
@@ -25,8 +25,8 @@ class Count(object):
         return redis_data.hget(key, 'topic') or 0
 
     @classmethod
-    def board_post_count(cls, boardId, value=None):
-        key = 'count:board:%s' % str(boardId)
+    def board_post_count(cls, pk, value=None):
+        key = 'count:board:%s' % str(pk)
         if value is not None:
             pipe = redis_data.pipeline()
             pipe.hincrby(key, 'post', value)

+ 5 - 4
forums/extension/__init__.py

@@ -4,9 +4,9 @@
 # Copyright © 2018 jianglin
 # File Name: __init__.py
 # Author: jianglin
-# Email: xiyang0807@gmail.com
+# Email: mail@honmaple.com
 # Created: 2018-02-11 14:52:12 (CST)
-# Last Update: Saturday 2018-03-03 21:53:59 (CST)
+# Last Update: Tuesday 2019-05-07 01:05:29 (CST)
 #          By:
 # Description:
 # ********************************************************************************
@@ -28,8 +28,9 @@ cache = Cache()
 mail = Mail()
 principal = Principal()
 search = Search(db=db)
-avatar = Avatar(cache=cache.cached(
-    timeout=259200, key_prefix=lambda: "avatar:{}".format(request.url)))
+avatar = Avatar(
+    cache=cache.cached(
+        timeout=259200, key_prefix=lambda: "avatar:{}".format(request.url)))
 
 
 def init_app(app):

+ 1 - 1
forums/extension/login.py

@@ -18,7 +18,7 @@ login_manager = LoginManager()
 
 @login_manager.user_loader
 def user_loader(id):
-    from forums.api.user.models import User
+    from forums.api.user.db import User
     user = User.query.get(int(id))
     return user
 

+ 2 - 2
forums/jinja.py

@@ -63,13 +63,13 @@ def show_time():
 
 
 def hot_tags():
-    from forums.api.tag.models import Tags
+    from forums.api.tag.db import Tags
     tags = Tags.query.limit(9).all()
     return tags
 
 
 def recent_tags():
-    from forums.api.tag.models import Tags
+    from forums.api.tag.db import Tags
     tags = Tags.query.limit(12).all()
     return tags
 

+ 27 - 27
runserver.py

@@ -1,12 +1,12 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # **************************************************************************
-# Copyright © 2016 jianglin
+# Copyright © 2016-2019 jianglin
 # File Name: runserver.py
 # Author: jianglin
-# Email: xiyang0807@gmail.com
+# Email: mail@honmaple.com
 # Created: 2016-10-25 22:01:29 (CST)
-# Last Update: 星期五 2018-02-23 10:43:07 (CST)
+# Last Update: Monday 2019-05-06 23:36:53 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -14,11 +14,10 @@ from flask import current_app
 from flask.cli import FlaskGroup, run_command
 from werkzeug.contrib.fixers import ProxyFix
 from code import interact
-from getpass import getpass
 
 from forums import create_app
 from forums.extension import db, cache, search
-from forums.api.user.models import User
+from forums.api.user.db import User
 
 import click
 import os
@@ -44,8 +43,9 @@ def shell_command():
 
 
 @cli.command()
-def runserver():
-    app.run()
+@click.option('-p', '--port', default=8000)
+def runserver(port):
+    app.run(port=port)
 
 
 @cli.command()
@@ -70,7 +70,7 @@ def clear_cache():
 
 @cli.command()
 def init_perm():
-    from forums.api.user.models import Group
+    from forums.api.user.db import Group
     anonymous = Group.query.filter_by(name='anonymous').first()
     if not anonymous:
         anonymous = Group(name='anonymous')
@@ -113,10 +113,11 @@ def initdb():
 def babel_init(lang):
     babel_conf = "translations/babel.cfg"
     src_path = ["forums", "templates"]
-    os.system('pybabel extract -F {0} -k lazy_gettext -o messages.pot {1}'.
-              format(babel_conf, ' '.join(src_path)))
-    os.system('pybabel init -i messages.pot -d translations -l {0}'.format(
-        lang))
+    os.system(
+        'pybabel extract -F {0} -k lazy_gettext -o messages.pot {1}'.format(
+            babel_conf, ' '.join(src_path)))
+    os.system(
+        'pybabel init -i messages.pot -d translations -l {0}'.format(lang))
     os.unlink('messages.pot')
 
 
@@ -124,8 +125,9 @@ def babel_init(lang):
 def babel_update():
     babel_conf = "translations/babel.cfg"
     src_path = ["forums", "templates"]
-    os.system('pybabel extract -F {0} -k lazy_gettext -o messages.pot {1}'.
-              format(babel_conf, ' '.join(src_path)))
+    os.system(
+        'pybabel extract -F {0} -k lazy_gettext -o messages.pot {1}'.format(
+            babel_conf, ' '.join(src_path)))
     os.system('pybabel update -i messages.pot -d translations')
     os.unlink('messages.pot')
 
@@ -144,26 +146,24 @@ def delete_user(username):
 
 @cli.command()
 @click.option('-u', '--username')
-def password_user(username):
-    password = getpass('Password:')
+@click.password_option('-p', '--password')
+def password_user(username, password):
     user = User.query.filter_by(username=username).first()
     user.set_password(password)
     user.save()
 
 
-@cli.command()
-@click.option('-u', '--username')
-@click.option('-e', '--email')
-@click.option('-w', '--password')
+@cli.command(short_help='Create user.')
+@click.option('-u', '--username', prompt=True, default="admin")
+@click.option('-e', '--email', prompt=True)
+@click.password_option('-p', '--password')
 def create_user(username, email, password):
-    if username is None:
-        username = input('Username(default admin):') or 'admin'
-    if email is None:
-        email = input('Email:')
-    if password is None:
-        password = getpass('Password:')
     user = User(
-        username=username, email=email, is_superuser=True, is_confirmed=True)
+        username=username,
+        email=email,
+        is_superuser=True,
+        is_confirmed=True,
+    )
     user.set_password(password)
     user.save()
 

+ 1 - 1
script/upgrade.py

@@ -4,7 +4,7 @@
 # Copyright © 2017 jianglin
 # File Name: upgrade.py
 # Author: jianglin
-# Email: xiyang0807@gmail.com
+# Email: mail@honmaple.com
 # Created: 2017-03-29 23:28:43 (CST)
 # Last Update:星期四 2017-5-4 11:22:48 (CST)
 #          By:

+ 3 - 3
script/upgrade_count.py

@@ -10,9 +10,9 @@
 #          By:
 # Description:
 # **************************************************************************
-from forums.api.topic.models import Topic, Reply
-from forums.api.forums.models import Board
-from forums.api.user.models import User
+from forums.api.topic.db import Topic, Reply
+from forums.api.forums.db import Board
+from forums.api.user.db import User
 from forums.extension import redis_data
 from runserver import app
 

+ 1 - 1
templates/base/link.html

@@ -28,7 +28,7 @@
 {%- endmacro %}
 
 {% macro board(board) -%}
-<a href="{{ url_for('forums.board',boardId=board.id) }}">{{ board.name }}</a>
+<a href="{{ url_for('forums.board',pk=board.id) }}">{{ board.name }}</a>
 {%- endmacro %}
 
 {% macro avatar(text,width=64) -%}

+ 23 - 23
templates/board/board.html

@@ -1,30 +1,30 @@
 {% extends 'base/base.html' %}
 {% block content %}
-{% if board.parent_id %}
-{{ breadcrumb(hrefs={board.parent.name:url_for('forums.board',boardId=board.parent_id)},active=board.name) }}
-{% else %}
-{{ breadcrumb(active=board.name) }}
-{% endif %}
-{% from 'board/_macro.html' import board_body %}
-<div class="row">
-  <div class="col-md-9">
-    <div class="panel panel-primary">
-      <div class="panel-heading">
-        <a href="{{ url_for('forums.board',boardId=board.id) }}" style="color:#fff"> {{ board.name }} </a>
-      </div>
-      {% for child in board.children -%}
-      {{ board_body(child) }}
+  {% if board.parent_id %}
+    {{ breadcrumb(hrefs={board.parent.name:url_for('forums.board',pk=board.parent_id)},active=board.name) }}
+  {% else %}
+    {{ breadcrumb(active=board.name) }}
+  {% endif %}
+  {% from 'board/_macro.html' import board_body %}
+  <div class="row">
+    <div class="col-md-9">
+      <div class="panel panel-primary">
+        <div class="panel-heading">
+          <a href="{{ url_for('forums.board',pk=board.id) }}" style="color:#fff"> {{ board.name }} </a>
+        </div>
+        {% for child in board.children -%}
+          {{ board_body(child) }}
       {% else %}
-      {{ board_body(board) }}
-      {%- endfor %}
+          {{ board_body(board) }}
+        {%- endfor %}
+      </div>
+      <div class="panel panel-default">
+        {% include "topic/_topic.html" %}
+        {{ p_footer(topics,'forums.board',dict(pk=board.id))}}
+      </div>
     </div>
-    <div class="panel panel-default">
-      {% include "topic/_topic.html" %}
-      {{ p_footer(topics,'forums.board',dict(boardId=board.id))}}
+    <div class="col-md-3" style="padding-left:0">
+      {{ panel_base.board() }}
     </div>
   </div>
-  <div class="col-md-3" style="padding-left:0">
-    {{ panel_base.board() }}
-  </div>
-</div>
 {% endblock %}

+ 1 - 1
templates/board/board_list.html

@@ -6,7 +6,7 @@
 {% if not board.parents %}
 <div class="panel panel-primary">
   <div class="panel-heading">
-    <a href="{{ url_for('forums.board',boardId=board.id) }}" style="color:#fff"> {{ board.name }} </a>
+    <a href="{{ url_for('forums.board',pk=board.id) }}" style="color:#fff"> {{ board.name }} </a>
   </div>
   {% for child in board.children -%}
   {{ board_body(child) }}

+ 26 - 26
templates/topic/ask.html

@@ -1,38 +1,38 @@
 {% extends 'base/base.html' %}
 
 {%- block script %}
-{{ super() }}
-<script src="https://cdn.bootcss.com/marked/0.4.0/marked.min.js"></script>
-<script src="{{ url_for("static",filename="libs/js/org.js") }}"></script>
+  {{ super() }}
+  <script src="https://cdn.bootcss.com/marked/0.4.0/marked.min.js"></script>
+  <script src="{{ url_for("static",filename="libs/js/org.js") }}"></script>
 {%- endblock -%}
 
 {%- block style %}
-{{ super() }}
-<style>
- .tokenfield .token {
-     border: 1px solid #5cb85c;
-     background-color: #5cb85c;
-     color:#eee;
- }
-</style>
+  {{ super() }}
+  <style>
+   .tokenfield .token {
+       border: 1px solid #5cb85c;
+       background-color: #5cb85c;
+       color:#eee;
+   }
+  </style>
 {%- endblock -%}
 
 {% block content %}
-{{ breadcrumb(active=_('Ask'))}}
-<div class="panel panel-primary">
-  <div class="panel-heading">{{ _('Ask') }}</div>
-  <div class="panel-body" style="border-bottom:1px solid #f6e1e1;padding:10px 0;">
-    <div class="row" style="margin:0;padding:0;">
-      <form action="{{ url_for('topic.list') }}" method="POST">
-        {% include "topic/ask/form.html" %}
-        <div class="col-sm-offset-2 col-sm-10">
-          {{ form.content_type(class="input-sm pull-right",style="padding:2")}}
-          <button class="btn btn-sm btn-primary" type="submit">提交问题</button>
-          <button class="btn btn-sm btn-primary" id="topic-preview" type="button">预览</button>
-        </div>
-        <div class="col-sm-offset-2 col-sm-10 topic-content" id="show-preview"></div>
-      </form>
+  {{ breadcrumb(active=_('Ask'))}}
+  <div class="panel panel-primary">
+    <div class="panel-heading">{{ _('Ask') }}</div>
+    <div class="panel-body" style="border-bottom:1px solid #f6e1e1;padding:10px 0;">
+      <div class="row" style="margin:0;padding:0;">
+        <form action="{{ url_for('topic.list') }}" method="POST">
+          {% include "topic/ask/form.html" %}
+          <div class="col-sm-offset-2 col-sm-10">
+            {{ form.content_type(class="input-sm pull-right",style="padding:2")}}
+            <button class="btn btn-sm btn-primary" type="submit">提交问题</button>
+            <button class="btn btn-sm btn-primary" id="topic-preview" type="button">预览</button>
+          </div>
+          <div class="col-sm-offset-2 col-sm-10 topic-content" id="show-preview"></div>
+        </form>
+      </div>
     </div>
   </div>
-</div>
 {% endblock %}

+ 4 - 4
templates/topic/topic.html

@@ -2,10 +2,10 @@
 {% block content %}
 {% set board = topic.board %}
 {% if board.parent_id %}
-{{ breadcrumb(hrefs={board.parent.name:url_for('forums.board',boardId=board.parent_id),
-                     board.name:url_for('forums.board',boardId=board.id)},active=topic.title) }}
+{{ breadcrumb(hrefs={board.parent.name:url_for('forums.board',pk=board.parent_id),
+                     board.name:url_for('forums.board',pk=board.id)},active=topic.title) }}
 {% else %}
-{{ breadcrumb(hrefs={board.name:url_for('forums.board',boardId=board.id)},active=topic.title) }}
+{{ breadcrumb(hrefs={board.name:url_for('forums.board',pk=board.id)},active=topic.title) }}
 {% endif %}
 <div class="row">
   <div class="col-md-9">
@@ -19,7 +19,7 @@
   </div>
   <div class="col-md-3" style="padding-left:0">
     {% include "topic/panel.html" %}
-    {% set ask_url = url_for('topic.ask',boardId=topic.board_id) %}
+    {% set ask_url = url_for('topic.ask',pk=topic.board_id) %}
     {{ panel_base.board() }}
   </div>
 </div>

+ 5 - 5
translations/zh/LC_MESSAGES/messages.po

@@ -212,23 +212,23 @@ msgstr "社区精华帖子"
 msgid "Top Topics"
 msgstr "精华文章"
 
-#: forums/api/user/models.py:178
+#: forums/api/user/db.py:178
 msgid "ALLOW ALL USER"
 msgstr "允许所有人"
 
-#: forums/api/user/models.py:178
+#: forums/api/user/db.py:178
 msgid "ALLOW AUTHENTICATED USER"
 msgstr "只允许登陆用户"
 
-#: forums/api/user/models.py:179
+#: forums/api/user/db.py:179
 msgid "ALLOW OWN"
 msgstr "仅自己"
 
-#: forums/api/user/models.py:183
+#: forums/api/user/db.py:183
 msgid "Chinese"
 msgstr "中文"
 
-#: forums/api/user/models.py:183
+#: forums/api/user/db.py:183
 msgid "English"
 msgstr "英文"