Browse Source

add topic edit

honmaple 8 years ago
parent
commit
41b2fa1823

+ 15 - 7
maple/admin/admin.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-31 21:42:11 (CST)
-# Last Update:星期二 2016-7-26 17:15:22 (CST)
+# Last Update:星期六 2016-7-30 13:7:51 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -18,11 +18,22 @@ from maple.permission.models import Permiss, Route
 from flask import abort
 from flask_admin import Admin
 from flask_admin.contrib.sqla import ModelView
-from flask_admin.form import SecureForm
 from flask_wtf import Form
 from flask_principal import Permission, RoleNeed
 
-admin = Admin(app, name='HonMaple', template_mode='bootstrap3')
+admin = Admin(app,
+              url=app.config.get('ADMIN_URL', '/admin'),
+              name='HonMaple',
+              template_mode='bootstrap3')
+
+
+class BaseForm(Form):
+    def __init__(self, formdata=None, obj=None, prefix=u'', **kwargs):
+        self._obj = obj
+        super(BaseForm, self).__init__(formdata=formdata,
+                                       obj=obj,
+                                       prefix=prefix,
+                                       **kwargs)
 
 
 class BaseModelView(ModelView):
@@ -30,10 +41,7 @@ class BaseModelView(ModelView):
     session = db.session
     page_size = 10
     can_view_details = True
-
-    form_base_class = Form
-
-    # form_base_class = SecureForm
+    form_base_class = BaseForm
 
     def is_accessible(self):
         permission = Permission(RoleNeed('super'))

+ 8 - 4
maple/admin/admin_user.py

@@ -6,13 +6,15 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-07-02 20:12:26 (CST)
-# Last Update:星期日 2016-7-24 15:7:4 (CST)
+# Last Update:星期六 2016-7-30 13:44:11 (CST)
 #          By:
 # Description:
 # **************************************************************************
-from maple import db, app
+from maple import db
 from .admin import BaseModelView
 from maple.user.models import User, UserInfor, UserSetting, Role
+from wtforms import PasswordField
+from wtforms.validators import DataRequired
 
 
 class UserModelView(BaseModelView):
@@ -20,9 +22,11 @@ class UserModelView(BaseModelView):
     column_searchable_list = ['username', 'email']
     column_filters = ['email', 'is_superuser', 'is_confirmed', 'register_time']
     column_editable_list = ['is_confirmed', 'is_superuser']
-    form_columns = ('username', 'email', 'password', 'roles', 'is_confirmed')
-    # inline_models = (UserInfor, UserSetting, Role)
     column_details_exclude_list = ['infor', 'setting']
+    form_columns = ('username', 'email', 'roles', 'is_confirmed')
+    # inline_models = (UserInfor, UserSetting, Role)
+    form_extra_fields = {'password': PasswordField('Password',
+                                                   [DataRequired()])}
 
 
 class UserInforModelView(BaseModelView):

+ 12 - 11
maple/auth/views.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-06-17 13:25:39 (CST)
-# Last Update:星期一 2016-7-25 20:44:44 (CST)
+# Last Update:星期六 2016-7-30 12:23:21 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -24,16 +24,17 @@ def check_time(func):
     def wrapper(*args, **kw):
         time = redis_data.hget('user:%s' % str(current_user.id),
                                'send_email_time')
-        print(time)
-        try:
-            time = time.split('.')[0]
-            time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S')
-            print(time)
-            if datetime.now() < time + timedelta(seconds=360):
-                return jsonify(judge=False, error="你获取的验证链接还未过期,请尽快验证")
-        except TypeError:
-            set_email_send(current_user.id)
-        except ValueError:
+        if time:
+            try:
+                time = time.split('.')[0]
+                time = datetime.strptime(time, '%Y-%m-%d %H:%M:%S')
+                if datetime.now() < time + timedelta(seconds=360):
+                    return jsonify(judge=False, error="你获取的验证链接还未过期,请尽快验证")
+            except TypeError:
+                set_email_send(current_user.id)
+            except ValueError:
+                set_email_send(current_user.id)
+        else:
             set_email_send(current_user.id)
         return func(*args, **kw)
 

+ 1 - 3
maple/board/views.py

@@ -6,18 +6,16 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-06-03 14:32:06 (CST)
-# Last Update:星期五 2016-7-29 12:34:1 (CST)
+# Last Update:星期六 2016-7-30 22:13:1 (CST)
 #          By:
 # Description:
 # **************************************************************************
 from flask import g, render_template, request
-from maple import cache
 from maple.helpers import is_num
 from maple.topic.models import Topic
 from maple.forums.models import Board
 
 
-@cache.cached(timeout=60)
 def board(child_b):
     page = is_num(request.args.get('page'))
     if child_b is None:

+ 1 - 1
maple/extensions.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:02:50 (CST)
-# Last Update:星期五 2016-7-29 12:31:50 (CST)
+# Last Update:星期五 2016-7-29 14:12:55 (CST)
 #          By:
 # Description:
 # **************************************************************************

+ 2 - 2
maple/main/models.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:32:12 (CST)
-# Last Update:星期日 2016-7-24 18:54:28 (CST)
+# Last Update:星期六 2016-7-30 12:5:38 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -63,4 +63,4 @@ class RedisData(object):
 
 def set_email_send(uid):
     redis_data.hset('user:%s' % str(uid), 'send_email_time',
-                    datetime.now())
+                    datetime.utcnow())

+ 27 - 1
maple/topic/controls.py

@@ -6,7 +6,7 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-06-15 10:22:42 (CST)
-# Last Update:星期一 2016-7-25 20:50:29 (CST)
+# Last Update:星期六 2016-7-30 21:19:24 (CST)
 #          By:
 # Description:
 # **************************************************************************
@@ -113,6 +113,32 @@ class TopicModel(object):
         RedisData.set_topics()
         return topic
 
+    def put(form, topicId):
+        topic = Topic.query.filter_by(uid=topicId).first_or_404()
+        topic.title = form.title.data
+        topic.content = form.content.data
+        topic.content = form.content.data
+        topic.is_markdown = True if form.choice.data == 1 else False
+        tags = sp(',|;|,|;| ', form.tags.data)
+        tags = [x for x in list(set(tags)) if x != ''][:4]
+        post_tags = []
+        for tag in tags:
+            if tag != '':
+                exsit_tag = Tags.query.filter_by(tagname=tag).first()
+                if exsit_tag is not None:
+                    post_tags.append(exsit_tag)
+                    if exsit_tag not in current_user.following_tags:
+                        current_user.following_tags.append(exsit_tag)
+                else:
+                    t = Tags()
+                    t.tagname = tag
+                    post_tags.append(t)
+                    current_user.following_tags.append(t)
+        topic.tags = post_tags
+        topic.board_id = form.category.data
+        db.session.commit()
+        return topic
+
 
 class ReplyModel(object):
     def post_data(form, uid):

+ 51 - 21
maple/topic/permission.py

@@ -6,17 +6,61 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-07-16 16:40:53 (CST)
-# Last Update:星期一 2016-7-25 19:57:23 (CST)
+# Last Update:星期六 2016-7-30 22:2:39 (CST)
 #          By:
 # Description:
 # **************************************************************************
-from flask import (redirect, url_for, flash, request)
+from flask import (redirect, url_for, flash, request, jsonify, g)
 from flask_login import login_required, current_user
 from maple.permission.base import RestBase
 from maple.permission.permission import EditTopicNeed
 from flask_principal import Permission, RoleNeed
 from flask_babelex import gettext as _
 from functools import wraps
+from .models import Topic
+
+
+def ask_permission(func):
+    @wraps(func)
+    def decorator(*args, **kwargs):
+        permission = Permission(RoleNeed('confirmed'))
+        if not permission.can():
+            flash(
+                _("You haven't confirm your account,Please confirmed"),
+                'warning')
+            return redirect(url_for('user.user',
+                                    user_url=current_user.username))
+        return func(*args, **kwargs)
+
+    return decorator
+
+
+def edit_permission(func):
+    @wraps(func)
+    def decorator(*args, **kwargs):
+        topicId = kwargs.get('topicId')
+        topic = Topic.query.filter_by(uid=topicId).first_or_404()
+        permission = Permission(EditTopicNeed(topic.id))
+        if not permission.can():
+            flash(_('You have no permission'), 'warning')
+            return redirect(url_for('topic.topic', topicId=topicId))
+        return func(*args, **kwargs)
+
+    return decorator
+
+
+def vote_permission(func):
+    @wraps(func)
+    def decorator(*args, **kwargs):
+        if not g.user.is_authenticated:
+            topicId = kwargs.get('topicId')
+            return jsonify(judge=False,
+                           url=url_for('auth.login',
+                                       next=url_for('topic.topic',
+                                                    topicId=topicId)))
+        return func(*args, **kwargs)
+
+    return decorator
 
 
 class TopicPermission(RestBase):
@@ -44,12 +88,13 @@ class TopicPermission(RestBase):
             return True
 
     @login_required
+    @edit_permission
     def put(self, topicId):
         def callback():
-            flash(_("You have no permission"), 'warning')
-            return redirect(url_for('topic.topic', topicId=topicId))
+            return jsonify(judge=False, error=_('You have no permission'))
 
-        permission = Permission(EditTopicNeed(topicId))
+        topic = Topic.query.filter_by(uid=topicId).first_or_404()
+        permission = Permission(EditTopicNeed(topic.id))
         if not permission.can():
             self.callback = callback
             return True
@@ -69,25 +114,10 @@ class ReplyPermission(RestBase):
 
     def callback(self):
         flash(
-            _("You haven't confirm your account,Please confirmed"),
-            'warning')
+            _("You haven't confirm your account,Please confirmed"), 'warning')
         return redirect(url_for('user.user', user_url=current_user.username))
 
 
-def ask_permission(func):
-    @wraps(func)
-    def decorator(*args, **kwargs):
-        permission = Permission(RoleNeed('confirmed'))
-        if not permission.can():
-            flash(
-                _("You haven't confirm your account,Please confirmed"),
-                'warning')
-            return redirect(url_for('user.user',
-                                    user_url=current_user.username))
-        return func(*args, **kwargs)
-
-    return decorator
-
 preview_permission = ask_permission
 topic_permission = TopicPermission()
 reply_permission = ReplyPermission()

+ 3 - 2
maple/topic/urls.py

@@ -6,12 +6,12 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-07-15 18:12:22 (CST)
-# Last Update:星期日 2016-7-24 20:15:36 (CST)
+# Last Update:星期六 2016-7-30 20:47:52 (CST)
 #          By:
 # Description:
 # **************************************************************************
 from flask import Blueprint
-from .views import ask, good, preview, vote_up, vote_down
+from .views import ask, good, preview, vote_up, vote_down, edit
 from .views import TopicAPI, ReplyAPI
 
 site = Blueprint('topic', __name__)
@@ -21,6 +21,7 @@ site.add_url_rule('/good', view_func=good)
 site.add_url_rule('/preview', view_func=preview, methods=['POST'])
 site.add_url_rule('/up/<topicId>', view_func=vote_up, methods=['POST'])
 site.add_url_rule('/down/<topicId>', view_func=vote_down, methods=['POST'])
+site.add_url_rule('/edit/<topicId>', view_func=edit)
 
 topic_view = TopicAPI.as_view('topic')
 # /topic

+ 28 - 9
maple/topic/views.py

@@ -6,15 +6,16 @@
 # Author: jianglin
 # Email: xiyang0807@gmail.com
 # Created: 2016-05-20 13:47:04 (CST)
-# Last Update:星期四 2016-7-28 21:14:7 (CST)
+# Last Update:星期六 2016-7-30 21:58:29 (CST)
 #          By:
 # Description:
 # **************************************************************************
-from flask import (render_template, redirect, url_for, request, g, jsonify,
+from flask import (render_template, redirect, url_for, request, jsonify,
                    current_app)
 from flask.views import MethodView
 from flask_login import login_required
-from flask_maple.forms import flash_errors
+from flask_maple.forms import flash_errors, return_errors
+from flask_babelex import gettext as _
 from maple import db
 from maple.helpers import replies_page
 from maple.helpers import is_num
@@ -24,7 +25,7 @@ from .models import Topic
 from .forms import TopicForm, ReplyForm
 from .controls import TopicModel, ReplyModel, vote
 from .permission import (topic_permission, reply_permission, ask_permission,
-                         preview_permission)
+                         vote_permission, preview_permission, edit_permission)
 
 
 @login_required
@@ -40,6 +41,19 @@ def ask():
     return render_template('topic/ask.html', **data)
 
 
+@login_required
+@edit_permission
+def edit(topicId):
+    topic = Topic.query.filter_by(uid=topicId).first_or_404()
+    form = TopicForm()
+    form.title.data = topic.title
+    form.category.data = topic.board_id
+    form.tags.data = ','.join([tag.tagname for tag in topic.tags])
+    form.content.data = topic.content
+    data = {'title': _('Edit -'), 'form': form, 'topic': topic}
+    return render_template('topic/edit.html', **data)
+
+
 def good():
     page = is_num(request.args.get('page'))
     topics = Topic.query.filter_by(is_good=True).paginate(
@@ -61,9 +75,8 @@ def preview():
         return Filters.safe_markdown(content)
 
 
+@vote_permission
 def vote_up(topicId):
-    if not g.user.is_authenticated:
-        return jsonify(judge=False, url=url_for('auth.login'))
     topic = Topic.query.filter_by(uid=topicId).first_or_404()
     if not topic.vote:
         topic.vote = 1
@@ -74,9 +87,8 @@ def vote_up(topicId):
     return jsonify(judge=True, html=html)
 
 
+@vote_permission
 def vote_down(topicId):
-    if not g.user.is_authenticated:
-        return jsonify(judge=False, url=url_for('auth.login'))
     topic = Topic.query.filter_by(uid=topicId).first_or_404()
     if not topic.vote:
         topic.vote = -1
@@ -125,7 +137,14 @@ class TopicAPI(MethodView):
             return redirect(url_for('topic.ask'))
 
     def put(self, topicId):
-        return 'put'
+        form = TopicForm()
+        if form.validate_on_submit():
+            TopicModel.put(form, topicId)
+            return jsonify(judge=True)
+        else:
+            if form.errors:
+                return_errors(form)
+            return redirect(url_for('topic.ask'))
 
     def delete(self, topicId):
         return 'delete'

+ 1 - 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-7-24 20:50:19 (CST)
+# Last Update:星期六 2016-7-30 13:23:46 (CST)
 #          By:
 # Description:
 # **************************************************************************

+ 56 - 0
templates/topic/_form.html

@@ -0,0 +1,56 @@
+{% macro ask(form) -%}
+{{ base(form) }}
+<div class="col-sm-offset-2 col-sm-10">
+    {{ form.choice(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" id="show-preview">
+</div>
+{%- endmacro %}
+
+{% macro edit(form) -%}
+{{ base(form) }}
+<div class="col-sm-offset-2 col-sm-10">
+    {{ form.choice(class="input-sm pull-right",style="padding:2")}}
+    <button class="btn btn-sm btn-primary" id="topic-put-btn" type="button">提交问题</button>
+    <button class="btn btn-sm btn-primary" id="topic-preview" type="button">预览</button>
+</div>
+<div class="col-sm-offset-2 col-sm-10" id="show-preview">
+</div>
+{%- endmacro %}
+
+{% macro base(form) -%}
+{% import 'topic/_placeholder.html' as place %}
+<div class="row" style="padding:0;margin:0;">
+    <div class="col-sm-2">
+        {{ form.hidden_tag() }}
+        {{ form.title.label(class="control-label") }}
+        {{ place.title() }}
+    </div>
+    <div class="col-sm-10" style="margin-bottom:8px;">
+        {{ form.title(class="form-control") }}
+    </div>
+</div>
+<div class="col-sm-2">
+    {{ form.category.label(class="control-label") }}
+    {{ place.category() }}
+</div>
+<div class="col-sm-10" style="margin-bottom:8px;">
+    {{ form.category(class="form-control") }}
+</div>
+<div class="col-sm-2">
+    {{ form.tags.label(class="control-label") }}
+    {{ place.tags() }}
+</div>
+<div class="col-sm-10" style="margin-bottom:8px;">
+    {{ form.tags(class="form-control",id="tokenfield",placeholder="节点请以英文逗号隔开.请勿输入超过4个节点") }}
+</div>
+<div class="col-sm-2">
+    {{ form.content.label(class="control-label") }}
+    {{ place.content() }}
+</div>
+<div class="col-sm-10" style="margin-bottom:8px;">
+    {{ form.content(class="form-control",rows="8",onchange="preview()",placeholder="请输入问题描述") }}
+</div>
+{%- endmacro %}

+ 43 - 0
templates/topic/_placeholder.html

@@ -0,0 +1,43 @@
+{% macro title() -%}
+<span style="font-size:12px;color:#999">
+    (请用简短的话语描述你的问题)
+</span>
+{%- endmacro %}
+
+{% macro category() -%}
+<span style="font-size:12px;color:#999">
+    (请输入分类)
+</span>
+{%- endmacro %}
+
+{% macro tags() -%}
+<span style="font-size:12px;color:#999">
+    (请输入节点)
+</span>
+{%- endmacro %}
+
+{% macro content() -%}
+<table style="font-size:12px;color:#999">
+    <tr>
+        <th colspan="2">默认语法支持部分html标签</th>
+    </tr>
+    <tr>
+        <td>b:</td>
+        <td>加粗</td>
+    </tr>
+    <tr>
+        <td>i:</td>
+        <td>倾斜</td>
+    </tr>
+    <tr>
+        <td>br:</td>
+        <td>换行</td>
+    </tr>
+    <tr>
+        <td valign="top">font:</td>
+        <td> 设置字体(目前仅允许设置字体颜色)
+            <p>注:字体颜色请勿设置成白色或与白色相近的颜色</p>
+        </td>
+    </tr>
+</table>
+{%- endmacro %}

+ 4 - 73
templates/topic/ask.html

@@ -26,85 +26,16 @@
      color:#eee;
  }
 </style>
-{{ breadcrumb(active='提问')}}
+{{ breadcrumb(active=_('Ask'))}}
 <div class="panel panel-primary">
-    <div class="panel-heading">
-        提问
-    </div>
+    <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.post') }}" method="POST">
-                <div class="col-sm-2">
-                    {{ form.hidden_tag() }}
-                    {{ form.title.label(class="control-label") }}
-                    <span style="font-size:12px;color:#999">
-                        (请用简短的话语描述你的问题)
-                    </span>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.title(class="form-control") }}
-                </div>
-                <div class="col-sm-2">
-                    {{ form.category.label(class="control-label") }}
-                    <span style="font-size:12px;color:#999">
-                        (请输入分类)
-                    </span>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.category(class="form-control") }}
-                </div>
-                <div class="col-sm-2">
-                    {{ form.tags.label(class="control-label") }}
-                    <span style="font-size:12px;color:#999">
-                        (请输入节点)
-                    </span>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.tags(class="form-control",id="tokenfield",placeholder="节点请以英文逗号隔开.请勿输入超过4个节点") }}
-                </div>
-                <div class="col-sm-2">
-                    {{ form.content.label(class="control-label") }}
-                    <table style="font-size:12px;color:#999">
-                        <tr>
-                            <th colspan="2">默认语法支持部分html标签</th>
-                        </tr>
-                        {{ html() }}
-                    </table>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.content(class="form-control",rows="8",onchange="preview()",placeholder="请输入问题描述") }}
-                </div>
-                <div class="col-sm-offset-2 col-sm-10">
-                    {{ form.choice(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" id="show-preview">
-                </div>
+                {% from 'topic/_form.html' import ask %}
+                {{ ask(form) }}
             </form>
         </div>
     </div>
 </div>
 {% endblock %}
-
-
-{% macro html() -%}
-<tr>
-    <td>b:</td>
-    <td>加粗</td>
-</tr>
-<tr>
-    <td>i:</td>
-    <td>倾斜</td>
-</tr>
-<tr>
-    <td>br:</td>
-    <td>换行</td>
-</tr>
-<tr>
-    <td valign="top">font:</td>
-    <td> 设置字体(目前仅允许设置字体颜色)
-        <p>注:字体颜色请勿设置成白色或与白色相近的颜色</p>
-    </td>
-</tr>
-{%- endmacro %}

+ 51 - 57
templates/topic/edit.html

@@ -1,70 +1,64 @@
 {% extends 'base/base.html' %}
+{% block script -%}
+{{ super() }}
+<script type="text/javascript">
+ $(document).ready(function(){
+     $('#topic-preview').click(function() {
+         var content = $('#content').val();
+         $.post("{{ url_for('topic.preview') }}", {
+             content: $("#content").val(),
+             choice: $("#choice").val()
+         }, function(data) {
+             $("#show-preview").html(data);
+         });
+     });
+     $('#tokenfield').tokenfield({
+         limit:4
+     });
+     $('#topic-put-btn').click(function() {
+         var form_data = $("form#topic-put").serializeArray();
+         var data = {};
+         $.each(form_data,function() {
+             data[this.name] = this.value;
+         })
+         data = JSON.stringify(data);
+         $.ajax ({
+             type : "PUT",
+             url : '{{ url_for('topic.topic',topicId=topic.uid) }}',
+             data:data,
+             contentType: 'application/json;charset=UTF-8',
+             success: function(result) {
+                 if (result.judge === true) {
+                     window.location.href= '{{ url_for('topic.topic',topicId=topic.uid)}}';
+                 }else {
+                     alert(result.error);
+                 }
+             }
+         })
+     })
+ });
+</script>
+{%- endblock script %}
 {% block content %}
 {{ breadcrumb(active='编辑')}}
+<style>
+ .tokenfield .token {
+     border: 1px solid #5cb85c;
+     background-color: #5cb85c;
+     color:#eee;
+ }
+</style>
 <div class="panel panel-primary">
     <div class="panel-heading">
-        发帖
+        {{ _('Edit' )}}
     </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.topic') }}" method="PUT">
-                <div class="col-sm-2">
-                    {{ form.hidden_tag() }}
-                    {{ form.title.label(class="control-label") }}
-                    <span style="font-size:12px;color:#999">
-                        (请用简短的话语描述你的问题)
-                    </span>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.title(class="form-control") }}
-                </div>
-                <div class="col-sm-2">
-                    {{ form.tags.label(class="control-label") }}
-                    <span style="font-size:12px;color:#999">
-                        (请输入节点)
-                    </span>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.tags(class="form-control",placeholder="节点请以逗号,空格隔开.请勿输入超过4个节点") }}
-                </div>
-                <div class="col-sm-2">
-                    {{ form.content.label(class="control-label") }}
-                    <table style="font-size:12px;color:#999">
-                        <tr>
-                            <th colspan="2">默认语法支持部分html标签</th>
-                        </tr>
-                        {{ html() }}
-                    </table>
-                </div>
-                <div class="col-sm-10" style="margin-bottom:8px;">
-                    {{ form.content(class="form-control",style="border-radius:0px;margin-top:0",rows="8",onchange="preview()",placeholder="请输入问题描述") }}
-                </div>
-                <div class="col-sm-offset-2 col-sm-10">
-                    <button class="btn btn-sm btn-primary" type="submit">提交问题</button>
-                </div>
+            <form id="topic-put">
+                {% from 'topic/_form.html' import edit %}
+                {{ edit(form) }}
             </form>
         </div>
     </div>
 </div>
 {% endblock %}
-
-{% macro html() -%}
-<tr>
-    <td>b:</td>
-    <td>加粗</td>
-</tr>
-<tr>
-    <td>i:</td>
-    <td>倾斜</td>
-</tr>
-<tr>
-    <td>br:</td>
-    <td>换行</td>
-</tr>
-<tr>
-    <td valign="top">font:</td>
-    <td> 设置字体(目前仅允许设置字体颜色)
-        <p>注:字体颜色请勿设置成白色或与白色相近的颜色</p>
-    </td>
-</tr>
-{%- endmacro %}

+ 13 - 0
templates/topic/panel.html

@@ -5,6 +5,11 @@
     {% else %}
     <button type="button" class="btn btn-info btn-block topicfollow" id="{{ topic.id }}">关注问题</button>
     {% endif %}
+    {% if current_user.is_authenticated and current_user == topic.author %}
+    <a class="btn btn-success btn-block" href="{{ url_for('topic.edit',topicId=topic.uid)}}">
+        编辑问题
+    </a>
+    {%- endif %}
     {% if topic.id | is_collected %}
     <span class="btn btn-default btn-block">已收藏</span>
     {% else %}
@@ -16,6 +21,13 @@
                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                     <h4 class="modal-title" id="sidecollectLabel">收藏夹</h4>
                 </div>
+                {% if not current_user.collects.all() %}
+                <div class="modal-body">
+                    <a href="{{ url_for('mine.collect') }}" style="text-decoration:none">
+                        <i class="icon icon-plus"></i> 创建
+                    </a>
+                </div>
+                {% else %}
                 <form action="{{ url_for('mine.collect_detail',topicId=topic.uid)}}" method="POST">
                     {{ form.hidden_tag() }}
                     <div class="modal-body">
@@ -35,6 +47,7 @@
                         <button type="submit" class="btn btn-primary">提交</button>
                     </div>
                 </form>
+                {% endif %}
             </div>
         </div>
     </div>