Browse Source

国际化,时区设置 增加翻译文件,优化jinja2模板

honmaple 8 years ago
parent
commit
39d5a13178
54 changed files with 435 additions and 296 deletions
  1. 3 0
      babel.cfg
  2. 36 0
      manager.py
  3. 60 0
      maple/LANG/zh/LC_MESSAGES/messages.po
  4. 3 4
      maple/__init__.py
  5. 1 1
      maple/auth/__init__.py
  6. 40 0
      maple/auth/views.py
  7. 1 1
      maple/board/views.py
  8. 22 2
      maple/extensions.py
  9. 1 9
      maple/filters.py
  10. 7 9
      maple/setting/views.py
  11. 27 2
      maple/tag/views.py
  12. 1 4
      maple/templates/auth/forget.html
  13. 1 4
      maple/templates/auth/login.html
  14. 1 4
      maple/templates/auth/register.html
  15. 5 3
      maple/templates/base/base.html
  16. 19 0
      maple/templates/base/head.html
  17. 8 0
      maple/templates/base/paginate.html
  18. 1 4
      maple/templates/forums/about.html
  19. 2 10
      maple/templates/forums/board.html
  20. 2 9
      maple/templates/forums/board_list.html
  21. 1 3
      maple/templates/forums/forums.html
  22. 1 4
      maple/templates/forums/help.html
  23. 1 3
      maple/templates/forums/index.html
  24. 2 9
      maple/templates/forums/notice.html
  25. 7 11
      maple/templates/forums/tag.html
  26. 1 4
      maple/templates/forums/tag_list.html
  27. 2 9
      maple/templates/forums/userlist.html
  28. 1 5
      maple/templates/mine/collect.html
  29. 2 8
      maple/templates/mine/collect_list.html
  30. 1 4
      maple/templates/setting/password.html
  31. 1 4
      maple/templates/setting/privacy.html
  32. 1 4
      maple/templates/setting/setting.html
  33. 2 5
      maple/templates/topic/ask.html
  34. 4 7
      maple/templates/topic/content.html
  35. 1 4
      maple/templates/topic/edit.html
  36. 2 9
      maple/templates/topic/replies.html
  37. 2 9
      maple/templates/topic/topic.html
  38. 2 10
      maple/templates/topic/topic_good.html
  39. 1 1
      maple/templates/topic/topic_list_base.html
  40. 1 7
      maple/templates/user/collect.html
  41. 1 5
      maple/templates/user/follower.html
  42. 2 7
      maple/templates/user/following.html
  43. 1 3
      maple/templates/user/following_collect.html
  44. 1 3
      maple/templates/user/following_tag.html
  45. 1 3
      maple/templates/user/following_topic.html
  46. 1 3
      maple/templates/user/following_user.html
  47. 1 4
      maple/templates/user/notebook.html
  48. 1 6
      maple/templates/user/reply.html
  49. 1 7
      maple/templates/user/topic.html
  50. 3 5
      maple/templates/user/user.html
  51. 32 19
      maple/topic/models.py
  52. 10 9
      maple/topic/views.py
  53. 20 1
      maple/user/models.py
  54. 83 35
      requirements.txt

+ 3 - 0
babel.cfg

@@ -0,0 +1,3 @@
+[python: **.py]
+[jinja2: **/templates/**/**.html]
+extensions=jinja2.ext.autoescape,jinja2.ext.with_

+ 36 - 0
manager.py

@@ -10,6 +10,7 @@
 from flask_script import Manager
 from flask_migrate import Migrate, MigrateCommand
 from maple import app, db
+import os
 
 migrate = Migrate(app, db)
 manager = Manager(app)
@@ -20,6 +21,41 @@ def run():
     return app.run()
 
 
+@manager.command
+def init_db():
+    """
+    Drops and re-creates the SQL schema
+    """
+    db.drop_all()
+    db.configure_mappers()
+    db.create_all()
+    db.session.commit()
+
+
+@manager.command
+def babel_init():
+    pybabel = 'pybabel'
+    os.system(pybabel +
+              ' extract -F babel.cfg -k lazy_gettext -o messages.pot maple')
+    os.system(pybabel + ' init -i messages.pot -d maple/LANG -l zh')
+    os.unlink('messages.pot')
+
+
+@manager.command
+def babel_update():
+    pybabel = 'pybabel'
+    os.system(pybabel +
+              ' extract -F babel.cfg -k lazy_gettext -o messages.pot maple')
+    os.system(pybabel + ' update -i messages.pot -d maple/LANG')
+    os.unlink('messages.pot')
+
+
+@manager.command
+def babel_compile():
+    pybabel = 'pybabel'
+    os.system(pybabel + ' compile -d maple/LANG')
+
+
 @manager.option('-h', '--host', dest='host', default='127.0.0.1')
 @manager.option('-p', '--port', dest='port', type=int, default=8000)
 @manager.option('-w', '--workers', dest='workers', type=int, default=2)

+ 60 - 0
maple/LANG/zh/LC_MESSAGES/messages.po

@@ -0,0 +1,60 @@
+# Chinese translations for PROJECT.
+# Copyright (C) 2016 ORGANIZATION
+# This file is distributed under the same license as the PROJECT project.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2016.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PROJECT VERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
+"POT-Creation-Date: 2016-06-16 14:36+0800\n"
+"PO-Revision-Date: 2016-06-16 14:36+0800\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language: zh\n"
+"Language-Team: zh <LL@li.org>\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Babel 2.3.4\n"
+
+#: maple/extensions.py:91
+msgid "Please login to access this page."
+msgstr ""
+
+#: maple/forums/forms.py:20
+msgid "Choice"
+msgstr ""
+
+#: maple/mine/forms.py:21
+msgid "Name:"
+msgstr ""
+
+#: maple/mine/forms.py:22
+msgid "Description:"
+msgstr ""
+
+#: maple/templates/auth/register.html:3
+msgid "register"
+msgstr ""
+
+#: maple/templates/base/base.html:24
+msgid "社区"
+msgstr ""
+
+#: maple/topic/forms.py:21
+msgid "Title:"
+msgstr ""
+
+#: maple/topic/forms.py:22 maple/topic/forms.py:35
+msgid "Content:"
+msgstr ""
+
+#: maple/topic/forms.py:24
+msgid "Category:"
+msgstr ""
+
+#: maple/topic/forms.py:28
+msgid "Tags:"
+msgstr ""
+

+ 3 - 4
maple/__init__.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 12:35:52 (CST)
-# Last Update:星期三 2016-6-15 11:22:42 (CST)
+# Last Update:星期五 2016-6-17 13:35:31 (CST)
 #          By:jianglin
 # Description:
 # **************************************************************************
@@ -25,7 +25,6 @@ def create_app():
     app.config.from_object('config.config')
     app.url_map._rules.clear()
     app.url_map._rules_by_endpoint.clear()
-    app.config['SERVER_NAME'] = 'localhost:5000'
     app.url_map.default_subdomain = 'forums'
     app.add_url_rule(app.static_url_path + '/<path:filename>',
                      endpoint='static',
@@ -35,9 +34,9 @@ def create_app():
 
 
 def register(app):
+    register_babel(app)
     register_form(app)
     register_principal(app)
-    register_babel(app)
     register_jinja2(app)
     register_maple(app)
     register_routes(app)
@@ -60,7 +59,7 @@ def register_routes(app):
     app.register_blueprint(site, url_prefix='/t')
     from maple.docs.views import site
     app.register_blueprint(site, subdomain='docs')
-    import maple.auth.auth
+    import maple.auth.views
     import maple.admin.admin
 
 

+ 1 - 1
maple/auth/__init__.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-31 21:35:58 (CST)
-# Last Update:星期二 2016-5-31 21:35:59 (CST)
+# Last Update:星期五 2016-6-17 13:34:23 (CST)
 #          By:
 # Description:
 # **************************************************************************

+ 40 - 0
maple/auth/views.py

@@ -0,0 +1,40 @@
+#!/usr/bin/env python
+# -*- coding=UTF-8 -*-
+# **************************************************************************
+# Copyright © 2016 jianglin
+# File Name: views.py
+# Author: jianglin
+# Email: xiyang0807@gmail.com
+# Created: 2016-06-17 13:25:39 (CST)
+# Last Update:星期五 2016-6-17 13:36:59 (CST)
+#          By:
+# Description:
+# **************************************************************************
+from flask_maple import Auth
+from maple import app, mail, db
+from maple.user.models import User, UserInfor, UserSetting, Role
+
+
+class Login(Auth):
+    def register_models(self, form):
+        user = self.User()
+        user.username = form.username.data
+        user.password = user.set_password(form.password.data)
+        user.email = form.email.data
+        userinfor = UserInfor()
+        user.infor = userinfor
+        usersetting = UserSetting()
+        user.setting = usersetting
+        role = Role()
+        role.rolename = 'unconfirmed'
+        user.roles.append(role)
+        self.db.session.add(user)
+        self.db.session.commit()
+        return user
+
+    def confirm_models(self, user):
+        user.is_confirmed = True
+        self.db.session.commit()
+
+
+auth = Login(app, db=db, mail=mail, user_model=User, use_principal=True)

+ 1 - 1
maple/board/views.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-06-03 14:32:06 (CST)
-# Last Update:星期四 2016-6-16 0:50:37 (CST)
+# Last Update:星期五 2016-6-17 14:0:47 (CST)
 #          By:
 # Description:
 # **************************************************************************

+ 22 - 2
maple/extensions.py

@@ -6,10 +6,11 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:02:50 (CST)
-# Last Update:星期四 2016-6-16 13:21:16 (CST)
+# Last Update:星期五 2016-6-17 13:36:25 (CST)
 #          By:
 # Description:
 # **************************************************************************
+from flask import request, g
 from flask.json import JSONEncoder
 from flask_wtf.csrf import CsrfProtect
 from flask_maple import Bootstrap, Error, Captcha
@@ -45,9 +46,28 @@ def register_babel(app):
 
     app.json_encoder = CustomJSONEncoder
 
+    @babel.localeselector
+    def get_locale():
+        user = getattr(g, 'user', None)
+        if user is not None:
+            if g.user.is_authenticated:
+                return user.setting.locale or 'zh'
+        return request.accept_languages.best_match(app.config[
+            'LANGUAGES'].keys())
+
+    @babel.timezoneselector
+    def get_timezone():
+        user = getattr(g, 'user', None)
+        if user is not None:
+            if g.user.is_authenticated:
+                return user.setting.timezone or 'UTC'
+        return 'UTC'
+
 
 def register_maple(app):
-    Bootstrap(app, css=('styles/monokai.css','styles/mine.css' ), use_auth=True)
+    Bootstrap(app,
+              css=('styles/monokai.css', 'styles/mine.css'),
+              use_auth=True)
     Captcha(app)
     Error(app)
 

+ 1 - 9
maple/filters.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-06-15 00:39:29 (CST)
-# Last Update:星期四 2016-6-16 1:31:14 (CST)
+# Last Update:星期五 2016-6-17 13:36:44 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -61,14 +61,6 @@ class Filters(object):
         if diff.seconds <= 90:
             return default
 
-        # periods = ((diff.days / 365, "year", "years"),
-        #            (diff.days / 30, "month", "months"),
-        #            (diff.days / 7, "week", "weeks"),
-        #            (diff.days, "day", "days"),
-        #            (diff.seconds / 3600, "hour", "hours"),
-        #            (diff.seconds / 60, "minute", "minutes"),
-        #            (diff.seconds, "second", "seconds"), )
-
         for period, singular, plural in periods:
 
             if period:

+ 7 - 9
maple/setting/views.py

@@ -6,11 +6,11 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 18:04:43 (CST)
-# Last Update:星期三 2016-6-15 10:19:5 (CST)
+# Last Update:星期四 2016-6-16 18:53:30 (CST)
 #          By:jianglin
 # Description: user setting include password , infor and privacy
 # **************************************************************************
-from flask import (Blueprint, render_template, request, url_for, redirect,
+from flask import (Blueprint, render_template, request, url_for, redirect, g,
                    flash)
 from flask_maple.forms import flash_errors
 from flask_login import current_user, login_required
@@ -33,11 +33,10 @@ def setting():
         if form.errors:
             flash_errors(form)
             return redirect(url_for('setting.setting'))
-        else:
-            form.introduce.data = infor.introduce
-            form.school.data = infor.school
-            form.word.data = infor.word
-            return render_template('setting/setting.html', form=form)
+        form.introduce.data = infor.introduce
+        form.school.data = infor.school
+        form.word.data = infor.word
+        return render_template('setting/setting.html', form=form)
 
 
 @site.route('/password', methods=['GET', 'POST'])
@@ -55,8 +54,7 @@ def password():
         if form.errors:
             flash_errors(form)
             return redirect(url_for('setting.password'))
-        else:
-            return render_template('setting/password.html', form=form)
+        return render_template('setting/password.html', form=form)
 
 
 @site.route('/privacy', methods=['GET', 'POST'])

+ 27 - 2
maple/tag/views.py

@@ -6,14 +6,17 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:18:19 (CST)
-# Last Update:星期二 2016-6-14 23:20:14 (CST)
+# Last Update:星期五 2016-6-17 13:28:58 (CST)
 #          By:
 # Description:
 # **************************************************************************
-from flask import Blueprint, render_template, request
+from flask import Blueprint, render_template, request, url_for
 from maple import app
 from maple.helpers import is_num
 from maple.topic.models import Tags, Topic
+from urllib.parse import urljoin
+from werkzeug.contrib.atom import AtomFeed
+from maple.filters import Filters
 
 site = Blueprint('tag', __name__)
 
@@ -34,3 +37,25 @@ def tag(tag):
         tag = Tags.query.filter_by(tagname=tag).first_or_404()
         data = {'tag': tag, 'topics': topics}
         return render_template('forums/tag.html', **data)
+
+
+@site.route('/<tag>/feed')
+def rss(tag):
+    feed = AtomFeed('Recent Topics',
+                    feed_url=request.url,
+                    url=request.url_root,
+                    subtitle='I like solitude, yearning for freedom')
+    topics = Topic.query.join(Topic.tags).filter(Tags.tagname == tag).limit(
+        10).all()
+    for topic in topics:
+        feed.add(
+            topic.title,
+            Filters.safe_markdown(topic.content)
+            if topic.is_markdown else topic.content,
+            content_type='html',
+            author=topic.author.username,
+            url=urljoin(request.url_root,
+                        url_for('topic.topic', uid=topic.uid)),
+            updated=topic.publish,
+            published=topic.publish)
+    return feed.get_response()

+ 1 - 4
maple/templates/auth/forget.html

@@ -1,10 +1,7 @@
 {% extends "base/base.html" %}
 {% block content %}
 {% import 'maple/auth.html' as auth %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">忘记密码</li>
-</ol>
+{{ breadcrumb(active='忘记密码')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
         <a href="{{ url_for('auth.forget') }}" style="color:#fff">忘记密码</a>

+ 1 - 4
maple/templates/auth/login.html

@@ -1,10 +1,7 @@
 {% extends "base/base.html" %}
 {%- block content -%}
 {% import 'maple/auth.html' as auth %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">登陆</li>
-</ol>
+{{ breadcrumb(active='登陆')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
         <a href="{{ url_for('auth.login') }}" style="color:#fff">登陆页</a>

+ 1 - 4
maple/templates/auth/register.html

@@ -5,10 +5,7 @@
 
 {% block content %}
 {% import 'maple/auth.html' as auth %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">注册</li>
-</ol>
+{{ breadcrumb(active='注册')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
         <a href="{{ url_for('auth.register') }}" style="color:#fff">注册页</a>

+ 5 - 3
maple/templates/base/base.html

@@ -1,6 +1,8 @@
 {% extends 'maple/base.html' %}
-{% from 'base/paginate.html' import paginate %}
+{% from 'base/paginate.html' import paginate%}
+{% from 'base/paginate.html' import footer as p_footer %}
 {% import 'base/link.html' as link_base %}
+{% from 'base/head.html' import breadcrumb %}
 {% block script %}
 {{ super()}}
 <script type="text/javascript" src="{{ url_for('static',filename='styles/order.js')}}"></script>
@@ -21,7 +23,7 @@
         </div>
         <div class="collapse navbar-collapse">
             <ul class="nav navbar-nav">
-                <li><a href="{{ url_for('forums.forums')}}">社区</a></li>
+                <li><a href="{{ url_for('forums.forums')}}">社区{{ _('社区')}}</a></li>
                 <li><a href="{{ url_for('docs.docs')}}">文档</a></li>
                 <li><a href="#">博客</a></li>
                 <li><a href="{{ url_for('topic.good')}}">精华文章</a></li>
@@ -67,6 +69,6 @@
     <a href="{{ url_for('tag.tag')}}" ><span class="btn btn-sm btn-primary pull-right">所有标签</span></a>
     <a href="{{ url_for('forums.userlist')}}"><span class="btn btn-sm btn-primary pull-right">用户列表</span></a>
     <a href="{{ url_for('forums.notice')}}"><span class="btn btn-sm btn-primary pull-right">消息通知</span></a>
-    {% block content %}{% endblock %}
+    {% block content %} {% endblock %}
 </div>
 {% endblock %}

+ 19 - 0
maple/templates/base/head.html

@@ -0,0 +1,19 @@
+{% macro breadcrumb(hrefs=None,active=None) -%}
+<ol class="breadcrumb" style="margin:0">
+    {% if not active %}
+    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
+    {% else %}
+    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
+    {{ breadcrumb_list(hrefs) }}
+    <li class="active">{{ active }}</li>
+    {% endif %}
+</ol>
+{%- endmacro %}
+
+{% macro breadcrumb_list(hrefs) -%}
+{% if hrefs %}
+{% for k,v in hrefs.items() %}
+<li><a href="{{ v }}">{{ k }}</a></li>
+{% endfor %}
+{% endif %}
+{%- endmacro %}

+ 8 - 0
maple/templates/base/paginate.html

@@ -37,3 +37,11 @@
     {%- endif -%}
   </ul>
 {%- endmacro %}
+
+{% macro footer(pagination, endpoint,kw=None) %}
+  {% if pagination.pages > 1 %}
+    <div class="panel-footer">
+      {{ paginate(pagination,endpoint,kw)}}
+    </div>
+  {% endif %}
+{%- endmacro %}

+ 1 - 4
maple/templates/forums/about.html

@@ -1,9 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">关于</li>
-</ol>
+{{ breadcrumb(active='关于')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
         关于

+ 2 - 10
maple/templates/forums/board.html

@@ -10,21 +10,13 @@
 {{ super()}}
 {% endblock %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li><a href="{{ url_for('board.board')}}">{{ g.parent_b}}</a></li>
-    <li class="active">{{ board.board}}</li>
-</ol>
+{{ breadcrumb(hrefs={g.parent_b:url_for('board.board')},active=board.board)}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">
             {% from 'topic/topic_list.html' import view as board_view %}
             {{ board_view(topics)}}
-            {% if topics.pages > 1 %}
-            <div class="panel-footer">
-                {{ paginate(topics,'board.board',dict(child_b=board.board))}}
-            </div>
-            {% endif %}
+            {{ p_footer(topics,'board.board',dict(child_b=board.board))}}
         </div>
     </div>
     <div class="col-md-3" style="padding-left:0">

+ 2 - 9
maple/templates/forums/board_list.html

@@ -9,10 +9,7 @@
 {{ super()}}
 {% endblock %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">{{ g.parent_b}}</li>
-</ol>
+{{ breadcrumb(active=g.parent_b)}}
 {% if topics.page == 1 %}
 <div class="panel panel-primary">
     <div class="panel-heading">
@@ -27,11 +24,7 @@
         <div class="panel panel-default">
             {% from 'topic/topic_list.html' import view as board_view %}
             {{ board_view(topics)}}
-            {% if topics.pages > 1 %}
-            <div class="panel-footer">
-                {{ paginate(topics,'board.board') }}
-            </div>
-            {% endif %}
+            {{ p_footer(topics,'board.board')}}
         </div>
     </div>
     <div class="col-md-3" style="padding-left:0">

+ 1 - 3
maple/templates/forums/forums.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb(active='版块')}}
 {% for parent_board,child_boards in boards.items() %}
 <div class="panel panel-primary">
     <div class="panel-heading">

+ 1 - 4
maple/templates/forums/help.html

@@ -1,9 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">help</li>
-</ol>
+{{ breadcrumb(active='help')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
         帮助中心

+ 1 - 3
maple/templates/forums/index.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb() }}
 <div class="panel panel-default hidden-xs">
     <div class="panel-body" style="text-align: center;">
         <div class="media" style="width: 480px; margin:0px auto; text-align: left;">

+ 2 - 9
maple/templates/forums/notice.html

@@ -1,10 +1,7 @@
 {% extends 'base/base.html' %}
 {% import 'base/link.html' as link %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">消息通知</li>
-</ol>
+{{ breadcrumb(active='消息通知')}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">
@@ -17,11 +14,7 @@
                 {{ notice }}
                 {% endfor %}
             </div>
-            {% if notices.pages > 1 %}
-            <div class="panel-footer">
-                {{paginate(notices, 'forums.notice')}}
-            </div>
-            {% endif %}
+            {{ p_footer(notices, 'forums.notice')}}
             {% else %}
             <div class="panel-body">
                 <span class="text-center" style="display:block;width:100%;color:#999">

+ 7 - 11
maple/templates/forums/tag.html

@@ -9,12 +9,7 @@
 {{ super()}}
 {% endblock %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li><a href="{{ url_for('tag.tag') }}">所有标签</a></li>
-    <li class="active">{{ tag.tagname }}</li>
-</ol>
-
+{{ breadcrumb(hrefs={'所有标签':url_for('tag.tag')},active=tag.tagname)}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">
@@ -27,14 +22,15 @@
                 <button class="btn btn-sm btn-default tagfollow" id="{{ tag.id}}" style="padding:0 5px">关注</button>
                 {% endif %}
                 {% endif %}
+                <span class="pull-right">
+                    <a href="{{ url_for('tag.rss',tag=tag.tagname)}}">
+                        <i class="icon-rss" style="padding:2px">Rss</i>
+                    </a>
+                </span>
             </div>
             {% from 'topic/topic_list.html' import view as board_view %}
             {{ board_view(topics)}}
-            {% if topics.pages > 1 %}
-            <div class="panel-footer">
-                {{paginate(topics, 'tag.tag',kw=dict(tag=tag.tagname))}}
-            </div>
-            {% endif %}
+            {{ p_footer(topics, 'tag.tag',kw=dict(tag=tag.tagname))}}
         </div>
     </div>
     <div class="col-md-3" style="padding-left:0">

+ 1 - 4
maple/templates/forums/tag_list.html

@@ -1,10 +1,7 @@
 {% extends 'base/base.html' %}
 {% import 'base/link.html' as link %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">所有标签</li>
-</ol>
+{{ breadcrumb(active='所有标签')}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-primary">

+ 2 - 9
maple/templates/forums/userlist.html

@@ -1,10 +1,7 @@
 {% extends 'base/base.html' %}
 {% import 'base/link.html' as link %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">所有用户</li>
-</ol>
+{{ breadcrumb(active='所有用户')}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">
@@ -16,11 +13,7 @@
                 {{ user.username }}
             </div>
             {% endfor %}
-            {% if users.pages > 1 %}
-            <div class="panel-footer">
-                {{paginate(users, 'forums.userlist')}}
-            </div>
-            {% endif %}
+            {{ p_footer(users, 'forums.userlist')}}
         </div>
     </div>
     <div class="col-md-3">

+ 1 - 5
maple/templates/mine/collect.html

@@ -55,11 +55,7 @@
 </script>
 {% endblock %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li><a href="{{ url_for('mine.collect')}}">我的收藏</a></li>
-    <li class="active">{{ collect.name }}</li>
-</ol>
+{{ breadcrumb(hrefs={'我的收藏':url_for('mine.collect')},active=collect.name)}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">

+ 2 - 8
maple/templates/mine/collect_list.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb(active='我的收藏')}}
 <div class="row">
     <div class="col-md-9">
         <ul class="nav nav-tabs">
@@ -23,11 +21,7 @@
                 {% endif %}
             </div>
             {% endfor %}
-            {% if collects.pages  > 1 %}
-            <div class="panel-footer">
-                {{ paginate(collects,'mine.collect')}}
-            </div>
-            {% endif %}
+            {{ p_footer(collects,'mine.collect')}}
         </div>
     </div>
     <div class="col-md-3" style="padding-left:0">

+ 1 - 4
maple/templates/setting/password.html

@@ -1,10 +1,7 @@
 {% extends 'base/base.html' %}
 {% import 'base/link.html' as link %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">密码修改</li>
-</ol>
+{{ breadcrumb(active='密码修改')}}
 <div class="row">
     <div class="col-md-3" style="padding-right:0">
         <div class="list-group">

+ 1 - 4
maple/templates/setting/privacy.html

@@ -1,10 +1,7 @@
 {% extends 'base/base.html' %}
 {% import 'base/link.html' as link %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">隐私设置</li>
-</ol>
+{{ breadcrumb(active='隐私设置')}}
 <div class="row">
     <div class="col-md-3" style="padding-right:0">
         <div class="list-group">

+ 1 - 4
maple/templates/setting/setting.html

@@ -1,10 +1,7 @@
 {% extends 'base/base.html' %}
 {% import 'base/link.html' as link %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">资料修改</li>
-</ol>
+{{ breadcrumb(active='资料修改')}}
 <div class="row">
     <div class="col-md-3" style="padding-right:0">
         <div class="list-group">

+ 2 - 5
maple/templates/topic/ask.html

@@ -13,13 +13,10 @@
      })
  });
 </script>
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">提问</li>
-</ol>
+{{ breadcrumb(active='提问')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
-        发帖
+        提问
     </div>
     <div class="panel-body" style="border-bottom:1px solid #f6e1e1;padding:10px 0;">
         <div class="row" style="margin:0;padding:0;">

+ 4 - 7
maple/templates/topic/content.html

@@ -1,12 +1,8 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    {% set board = topic.board %}
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li><a href="{{ url_for('board.board',parent_b=board.parent_board)}}">{{ board.parent_board }}</a></li>
-    <li><a href="{{ url_for('board.board',parent_b=board.parent_board,child_b=board.board)}}">{{ board.board }}</a></li>
-    <li class="active">{{ topic.title }}</li>
-</ol>
+{% set board = topic.board %}
+{{ breadcrumb(hrefs={board.parent_board:url_for('board.board',parent_b=board.parent_board),
+board.board:url_for('board.board',parent_b=board.parent_board,child_b=board.board)},active=topic.title)}}
 {% set last_reply = topic.replies.first() %}
 <style>
  .vote {
@@ -23,6 +19,7 @@
      background-color: #fff;
  }
 </style>
+{% from 'base/paginate.html' import footer as p_footer %}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">

+ 1 - 4
maple/templates/topic/edit.html

@@ -1,9 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">分类</li>
-</ol>
+{{ breadcrumb(active='编辑')}}
 <div class="panel panel-primary">
     <div class="panel-heading">
         发帖

+ 2 - 9
maple/templates/topic/replies.html

@@ -99,12 +99,7 @@
     </div>
     {% set num = num + 1 %}
     {% endfor %}
-    {% if replies.pages > 1 %}
-    <div class="panel-footer">
-        {% from 'base/paginate.html' import paginate %}
-        {{ paginate(replies,'topic.topic',dict(uid=topic.uid))}}
-    </div>
-    {% endif %}
+    {{ p_footer(replies,'topic.topic',dict(uid=topic.uid))}}
     {% else %}
     <div class="panel-body">
         <span class="text-center" style="display:block;width:100%;color:#999">
@@ -115,9 +110,7 @@
 </div>
 <div class="panel panel-default">
     {% if g.user.is_authenticated %}
-    <div class="panel-heading">
-        回帖
-    </div>
+    <div class="panel-heading"> 回帖 </div>
     <div class="panel-body">
         <form action="{{ url_for('topic.reply',uid=topic.id)}}" method="POST">
             {{ form.hidden_tag() }}

+ 2 - 9
maple/templates/topic/topic.html

@@ -10,20 +10,13 @@
 {{ super()}}
 {% endblock %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">所有主题</li>
-</ol>
+{{ breadcrumb(active='所有主题')}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">
             {% from 'topic/topic_list.html' import view as board_view %}
             {{ board_view(topics)}}
-            {% if topics.pages > 1 %}
-            <div class="panel-footer">
-                {{ paginate(topics,'topic.topic')}}
-            </div>
-            {% endif %}
+            {{ p_footer(topics,'topic.topic')}}
         </div>
     </div>
     <div class="col-md-3" style="padding-left:0">

+ 2 - 10
maple/templates/topic/topic_good.html

@@ -10,21 +10,13 @@
 {{ super()}}
 {% endblock %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li><a href="{{ url_for('topic.topic')}}">所有主题</a></li>
-    <li class="active">精华文章</li>
-</ol>
+{{ breadcrumb(hrefs={'所有主题':url_for('topic.topic')},active='精华文章')}}
 <div class="row">
     <div class="col-md-9">
         <div class="panel panel-default">
             {% from 'topic/topic_list.html' import view as board_view %}
             {{ board_view(topics)}}
-            {% if topics.pages > 1 %}
-            <div class="panel-footer">
-                {{ paginate(topics,'topic.topic')}}
-            </div>
-            {% endif %}
+            {{ p_footer(topics,'topic.topic')}}
         </div>
     </div>
     <div class="col-md-3" style="padding-left:0">

+ 1 - 1
maple/templates/topic/topic_list_base.html

@@ -13,7 +13,7 @@
                 <div class="media-heading"> <a href="{{url_for('topic.topic',uid=topic.uid)}}" style="color:#555">{{ topic.title}}</a></div>
                 <span class="visible-xs-inline">
                     <small style="font-size:10px;">由{{ link_base.user(topic.author.username) }}</small>
-                    <small style="color:#999;">
+                    <small style="color:#999;font-size:10px;">
                         {{ topic.publish | timesince }}
                         发布
                     </small>

+ 1 - 7
maple/templates/user/collect.html

@@ -1,5 +1,3 @@
-{% import 'base/link.html' as link_base %}
-{% from 'base/paginate.html' import paginate %}
 <div class="panel panel-default">
     <div class="panel-heading clearfix">
         <span style="float:right">
@@ -27,11 +25,7 @@
         </div>
     </div>
     {% endfor  %}
-    {% if collects.pages > 1 %}
-    <div class="panel-footer">
-        {{ paginate(collects,'user.collect')}}
-    </div>
-    {% endif %}
+    {{ p_footer(collects,'user.collect')}}
     {% else %}
     <div class="panel-body" style="border:1px dashed #337ab7;margin:5px;">
         <span class="text-center" style="display:block;width:100%;color:#999">

+ 1 - 5
maple/templates/user/follower.html

@@ -7,9 +7,5 @@
         {{ follower.username }}
     </div>
     {% endfor  %}
-    {% if followers.pages > 1 %}
-    <div class="panel-footer">
-        {{ paginate(followers,'user.follower')}}
-    </div>
-    {% endif %}
+    {{ p_footer(followers,'user.follower')}}
 </div>

+ 2 - 7
maple/templates/user/following.html

@@ -1,9 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">我的关注</li>
-</ol>
+{{ breadcrumb(active='我的关注')}}
 <div class="row">
     <div class="col-md-3" style="padding-right:0">
         {% include 'user/infor.html' %}
@@ -28,9 +25,7 @@
                 {{ following}}
             </div>
             {% endfor  %}
-            <div class="panel-footer">
-                {{ paginate(followings,'user.following')}}
-            </div>
+            {{ p_footer(followings,'user.following')}}
         </div>
     </div>
 </div>

+ 1 - 3
maple/templates/user/following_collect.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb(active='关注的收藏夹')}}
 <div class="row">
     <div class="col-md-9"   style="background:#fff;border:1px solid #eee">
         <ul class="nav nav-tabs">

+ 1 - 3
maple/templates/user/following_tag.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb(active='关注的节点')}}
 <div class="row">
     <div class="col-md-9"  style="background:#fff;border:1px solid #eee">
         <ul class="nav nav-tabs">

+ 1 - 3
maple/templates/user/following_topic.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb(active='关注的问题')}}
 <div class="row">
     <div class="col-md-9"   style="background:#fff;border:1px solid #eee">
         <ul class="nav nav-tabs">

+ 1 - 3
maple/templates/user/following_user.html

@@ -1,8 +1,6 @@
 {% extends 'base/base.html' %}
 {% block content %}
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-</ol>
+{{ breadcrumb(active='关注的用户')}}
 <div class="row">
     <div class="col-md-9"   style="background:#fff;border:1px solid #eee">
         <ul class="nav nav-tabs">

+ 1 - 4
maple/templates/user/notebook.html

@@ -1,4 +1,3 @@
-{% from 'base/paginate.html' import paginate %}
 <div class="panel panel-default">
     <div class="panel-heading clearfix">
         <span style="float:right"> 排序1 / 排序2</span>
@@ -8,7 +7,5 @@
         {{ notebook.content}}
     </div>
     {% endfor  %}
-    <div class="panel-footer">
-        {{ paginate(notebooks,'user.notebook')}}
-    </div>
+    {{ p_footer(notebooks,'user.notebook')}}
 </div>

+ 1 - 6
maple/templates/user/reply.html

@@ -1,4 +1,3 @@
-{% from 'base/paginate.html' import paginate %}
 <div class="panel panel-default">
     <div class="panel-heading clearfix">
         <span style="float:right">
@@ -22,11 +21,7 @@
         </span>
     </div>
     {% endfor  %}
-    {% if replies.pages > 1 %}
-    <div class="panel-footer">
-        {{ paginate(replies,'user.reply')}}
-    </div>
-    {% endif %}
+    {{ p_footer(replies,'user.reply')}}
     {% else %}
     <div class="panel-body" style="border:1px dashed #337ab7;margin:5px;">
         <span class="text-center" style="display:block;width:100%;color:#999">

+ 1 - 7
maple/templates/user/topic.html

@@ -1,5 +1,3 @@
-{% import 'base/link.html' as link_base %}
-{% from 'base/paginate.html' import paginate %}
 <div class="panel panel-default">
     <div class="panel-heading clearfix">
         <span style="float:right">
@@ -23,11 +21,7 @@
         </div>
     </div>
     {% endfor  %}
-    {% if topics.pages > 1 %}
-    <div class="panel-footer">
-        {{ paginate(topics,'user.topic')}}
-    </div>
-    {% endif %}
+    {{ p_footer(topics,'user.topic')}}
     {% else %}
     <div class="panel-body" style="border:1px dashed #337ab7;margin:5px;">
         <span class="text-center" style="display:block;width:100%;color:#999">

+ 3 - 5
maple/templates/user/user.html

@@ -1,5 +1,4 @@
 {% extends 'base/base.html' %}
-{% import 'base/link.html' as link %}
 {% block content %}
 <script type="text/javascript">
  $(document).ready(function(){
@@ -21,10 +20,9 @@
      }
  });
 </script>
-<ol class="breadcrumb" style="margin-bottom:0;">
-    <li><a href="{{ url_for('forums.forums') }}"><span class="glyphicon glyphicon-home" aria-hidden="true"></span>社区首页</a></li>
-    <li class="active">{{ g.user_url }}</li>
-</ol>
+{% import 'base/link.html' as link_base %}
+{% from 'base/paginate.html' import footer as p_footer %}
+{{ breadcrumb(active=g.user_url)}}
 <div class="row">
     <div class="col-md-3" style="padding-right:0">
         {% set user = g.user_url | get_user_infor %}

+ 32 - 19
maple/topic/models.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:32:12 (CST)
-# Last Update:星期三 2016-6-15 18:52:38 (CST)
+# Last Update:星期五 2016-6-17 10:44:16 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -14,12 +14,9 @@ from maple import db
 from datetime import datetime
 from sqlalchemy import event
 
-tag_topic = db.Table('tag_topic',
-                     db.Column('tags_id',
-                               db.Integer,
-                               db.ForeignKey('tags.id')),
-                     db.Column('topics_id',
-                               db.Integer,
+tag_topic = db.Table('tag_topic', db.Column('tags_id', db.Integer,
+                                            db.ForeignKey('tags.id')),
+                     db.Column('topics_id', db.Integer,
                                db.ForeignKey('topics.id')))
 
 
@@ -45,8 +42,7 @@ class Topic(db.Model):
     tags = db.relationship('Tags',
                            secondary=tag_topic,
                            lazy='dynamic',
-                           backref="topics",
-                           )
+                           backref="topics", )
 
     author_id = db.Column(db.Integer,
                           db.ForeignKey('users.id',
@@ -58,12 +54,12 @@ class Topic(db.Model):
     board_id = db.Column(db.Integer,
                          db.ForeignKey('boards.id',
                                        ondelete="CASCADE"))
-    board = db.relationship('Board',
-                            backref=db.backref('topics',
-                                               cascade='all,delete-orphan',
-                                               lazy='dynamic',
-                                               order_by='Topic.publish.desc()')
-                            )
+    board = db.relationship(
+        'Board',
+        backref=db.backref('topics',
+                           cascade='all,delete-orphan',
+                           lazy='dynamic',
+                           order_by='Topic.publish.desc()'))
 
     is_good = db.Column(db.Boolean, default=False)
     is_top = db.Column(db.Boolean, default=False)
@@ -133,8 +129,25 @@ class Collect(db.Model):
 class Like(db.Model):
     __tablename__ = 'likes'
     id = db.Column(db.Integer, primary_key=True)
-    author_id = db.Column(db.Integer,
-                          db.ForeignKey('users.id'))
-    reply_id = db.Column(db.Integer,
-                         db.ForeignKey('replies.id'))
+    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))
+    reply_id = db.Column(db.Integer, db.ForeignKey('replies.id'))
     like_time = db.Column(db.DateTime, default=datetime.now())
+
+
+# class TopicCount(db.Model):
+#     __tablename__ = 'topic_counts'
+#     id = db.Column(db.Integer, primary_key=True)
+#     topic_id = db.Column(db.Integer,
+#                          db.ForeignKey('topics.id',
+#                                        ondelete="CASCADE"))
+#     topic = db.relationship("Topic",
+#                             backref="counts",
+#                             cascade='all,delete-orphan',
+#                             single_parent=True,
+#                             uselist=False)
+#     read = db.Column(db.Integer, default=0)
+#     reply = db.Column(db.Integer, default=0)
+#     vote = db.Column(db.Integer, default=0)
+
+#     def __repr__(self):
+#         return '<TopicCount %r>' % self.id

+ 10 - 9
maple/topic/views.py

@@ -6,12 +6,12 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:47:04 (CST)
-# Last Update:星期四 2016-6-16 13:16:4 (CST)
+# Last Update:星期四 2016-6-16 19:6:20 (CST)
 #          By:
 # Description:
 # **************************************************************************
-from flask import (Blueprint, render_template, redirect, url_for, request,
-                   Markup, abort)
+from flask import (Blueprint, render_template, redirect, url_for, request, g,
+                   session, Markup, abort)
 from flask.views import MethodView
 from flask_login import login_required
 from flask_maple.forms import flash_errors
@@ -31,7 +31,9 @@ site = Blueprint('topic', __name__)
 @site.route('/ask')
 @login_required
 def ask():
-    form = TopicForm()
+    form = session.get('topicform', None)
+    if form is None:
+        form = TopicForm()
     boardId = request.args.get('boardId')
     if boardId is not None:
         board = Board.query.filter_by(id=boardId).first()
@@ -95,10 +97,7 @@ class TopicAPI(MethodView):
         else:
             if form.errors:
                 flash_errors(form)
-                form.title.data = form.title.data
-            else:
-                pass
-            form.title.data = form.title.data
+            session['topicform'] = form
             return redirect(url_for('topic.ask'))
 
     # def put(self, uid):
@@ -118,7 +117,9 @@ class ReplyAPI(MethodView):
         topic = Topic.query.filter_by(id=uid).first()
         if form.validate_on_submit():
             ReplyModel.post_data(form, uid)
-            return redirect(url_for('topic.topic', uid=topic.uid,_anchor='replies-content'))
+            return redirect(url_for('topic.topic',
+                                    uid=topic.uid,
+                                    _anchor='replies-content'))
         else:
             if form.errors:
                 flash_errors(form)

+ 20 - 1
maple/user/models.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:24:19 (CST)
-# Last Update:星期三 2016-6-15 18:34:50 (CST)
+# Last Update:星期四 2016-6-16 18:17:47 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -158,10 +158,29 @@ class UserSetting(db.Model):
     rep_list = db.Column(db.Integer, nullable=False, default=1)
     ntb_list = db.Column(db.Integer, nullable=False, default=3)
     collect_list = db.Column(db.Integer, nullable=False, default=2)
+    locale = db.Column(db.String(32), default='zh')
+    timezone = db.Column(db.String(32), default='UTC')
 
     def __repr__(self):
         return "<UserSetting %r>" % self.id
 
+
+class OpenID(db.Model):
+    __tablename__ = 'openids'
+    id = db.Column(db.Integer, primary_key=True)
+    openid = db.Column(db.Integer, nullable=False)
+    openid_type = db.Column(db.String, nullable=False)
+    nickname = db.Column(db.String, nullable=False)
+    email = db.Column(db.String)
+    avatar = db.Column(db.String)
+    user_id = db.Column(db.Integer,
+                        db.ForeignKey('users.id',
+                                      ondelete="CASCADE"))
+    user = db.relationship('User',
+                           backref=db.backref('openids',
+                                              cascade='all,delete-orphan',
+                                              lazy='dynamic'))
+
 # class Invite(db.Model):
 #     __tablename__ = 'invites'
 #     id = db.Column(db.Integer, primary_key=True)

+ 83 - 35
requirements.txt

@@ -1,36 +1,84 @@
-autopep8==1.2.2
-bcloud==3.8.2
-binwalk==2.1.1
-cssselect==0.9.1
-decorator==4.0.10
-flake8==2.5.4
-importmagic==0.1.7
-ipython==4.2.0
-ipython-genutils==0.1.0
-jedi==0.9.0
-keyring==9.0
-lxml==3.6.0
-mccabe==0.4.0
-packaging==16.7
-path.py==8.2.1
-pbr==1.8.1
-pep8==1.7.0
-pexpect==4.0.1
-pickleshare==0.7.2
-ptyprocess==0.5.1
-pycrypto==2.6.1
-pyflakes==1.0.0
-pygobject==3.20.0
-pyinotify==0.9.6
-pyparsing==2.1.4
-pyxdg==0.25
-ranger==1.7.2
-simplegeneric==0.8.1
+17MonIP==0.2.7
+alembic==0.8.6
+amqp==1.4.9
+aniso8601==1.1.0
+anyjson==0.3.3
+Babel==2.3.4
+billiard==3.3.0.23
+bleach==1.4.2
+blinker==1.3
+celery==3.1.23
+cffi==1.5.2
+click==6.6
+cov-core==1.15.0
+coverage==4.0.3
+cssmin==0.2.0
+decorator==4.0.9
+dominate==2.2.0
+elasticsearch==2.3.0
+eventlet==0.19.0
+Flask==0.11.1
+Flask-Admin==1.4.0
+flask-allows==0.1.0
+Flask-Assets==0.11
+Flask-Babel==0.11.1
+Flask-BabelPlus==1.0.1
+Flask-Bootstrap==3.3.5.7
+Flask-Cache==0.13.1
+Flask-DebugToolbar==0.10.0
+Flask-Login==0.3.2
+Flask-Mail==0.9.1
+Flask-Maple==0.3.4
+Flask-Migrate==1.8.0
+Flask-Plugins==1.6.1
+Flask-Principal==0.4.0
+Flask-Redis==0.1.0
+Flask-RESTful==0.3.5
+Flask-Script==2.0.5
+Flask-SocketIO==2.2
+Flask-SQLAlchemy==2.1
+Flask-Themes2==0.1.4
+Flask-WhooshAlchemy==0.56
+Flask-WTF==0.12
+gevent==1.1.1
+greenlet==0.4.9
+gunicorn==19.4.5
+hiredis==0.2.0
+html5lib==0.9999999
+itsdangerous==0.24
+Jinja2==2.8
+jsmin==2.2.0
+kombu==3.0.35
+Mako==1.0.4
+MarkupSafe==0.23
+misaka==2.0.0
+mistune==0.7.1
+Pillow==3.2.0
+psycopg2==2.6.1
+pycparser==2.14
+Pygments==2.1
+pyparsing==2.1.1
+python-dateutil==2.5.3
+python-editor==1.0
+python-engineio==0.9.0
+python-socketio==1.2
+pytz==2016.4
+redis==2.10.5
+requests==2.9.1
+simplejson==3.8.1
 six==1.10.0
-stevedore==1.12.0
-team==1.0
-traitlets==4.2.1
-virtualenv==15.0.2
-virtualenv-clone==0.2.6
-virtualenvwrapper==4.7.1
-yapf==0.7.1
+speaklater==1.3
+SQLAlchemy==1.0.13
+sqlalchemy-elasticquery==0.0.3
+SQLAlchemy-Searchable==0.10.1
+SQLAlchemy-Utils==0.31.6
+Unidecode==0.4.19
+urllib3==1.15.1
+uuid==1.30
+validators==0.10
+visitor==0.1.2
+webassets==0.11.1
+Werkzeug==0.11.10
+Whoosh==2.7.0
+WTForms==2.1
+yapf==0.7.0