Browse Source

Started workin on the topic templates

sh4nks 9 years ago
parent
commit
44fdfca453

+ 2 - 0
flaskbb/message/views.py

@@ -57,6 +57,7 @@ def view_conversation(conversation_id):
 
     if conversation.unread:
         conversation.unread = False
+        current_user.invalidate_cache(permissions=False)
         conversation.save()
 
     form = MessageForm()
@@ -163,6 +164,7 @@ def new_conversation():
                       user_id=to_user.id,
                       unread=True,
                       shared_id=shared_id)
+            to_user.invalidate_cache(permissions=False)
 
             flash(_("Message sent."), "success")
             return redirect(url_for("message.sent"))

+ 33 - 1
flaskbb/themes/aurora/src/flaskbb.scss

@@ -171,7 +171,7 @@ p.flaskbb-stats {
 }
 
 .controls-row {
-    padding: 0;
+    padding: 1em 0;
     margin: 0;
 
     .pagination {
@@ -198,3 +198,35 @@ p.flaskbb-stats {
         font-weight: bold;
     }
 }
+
+.post-quickreply {
+    padding: 0;
+    min-height: 0;
+}
+
+.post-quickreply > .md-editor {
+
+}
+
+.post-quickreply > .md-editor.active {
+    border-color: none;
+    box-shadow: none;
+}
+
+.post-quickreply > .md-editor .md-footer, .md-editor>.md-header {
+    background: #F6F9FC;
+}
+
+.post-quickreply > .md-editor>textarea {
+    border-top: 1px solid #cad7e1;
+    border-bottom: none;
+    background: #fff;
+    padding-left: 3px;
+}
+
+.post-quickreply > .md-editor>.md-preview {
+    border-top: 1px solid #cad7e1;
+    border-right: 1px solid #cad7e1;
+    border-bottom: none;
+    background: #eee;
+}

+ 24 - 1
flaskbb/themes/aurora/static/css/flaskbb.css

@@ -108,7 +108,7 @@ p.flaskbb-stats {
   padding: 0; }
 
 .controls-row {
-  padding: 0;
+  padding: 1em 0;
   margin: 0; }
   .controls-row .pagination {
     padding: 0;
@@ -128,4 +128,27 @@ p.flaskbb-stats {
   .dropdown-messages .author-name {
     font-weight: bold; }
 
+.post-quickreply {
+  padding: 0;
+  min-height: 0; }
+
+.post-quickreply > .md-editor.active {
+  border-color: none;
+  box-shadow: none; }
+
+.post-quickreply > .md-editor .md-footer, .md-editor > .md-header {
+  background: #F6F9FC; }
+
+.post-quickreply > .md-editor > textarea {
+  border-top: 1px solid #cad7e1;
+  border-bottom: none;
+  background: #fff;
+  padding-left: 3px; }
+
+.post-quickreply > .md-editor > .md-preview {
+  border-top: 1px solid #cad7e1;
+  border-right: 1px solid #cad7e1;
+  border-bottom: none;
+  background: #eee; }
+
 /*# sourceMappingURL=flaskbb.css.map */

+ 5 - 7
flaskbb/themes/aurora/templates/forum/edit_forum.html

@@ -107,7 +107,7 @@
             </div>
         </div>
         <div class="row">
-            <div class="col-md-2">
+            <div class="col-md-2 col-sm-2 col-xs-2">
                 <div class="pull-left">
                     <a class="btn btn-default" href="{{ forum.url }}">
                         <span class="fa fa-arrow-left"></span> {% trans %}Back{% endtrans %}
@@ -115,7 +115,7 @@
                 </div>
             </div>
 
-            <div class="col-md-10 col-sm-10">
+            <div class="col-md-10 col-sm-10 col-xs-10">
                 <div class="pull-right">
                     <div class="form-group">
 
@@ -145,20 +145,18 @@
                 </div>
             </div>
 
-            <div class="col-md-12">
+            <div class="col-md-12 col-sm-12 col-xs-12">
                 <div class="pull-right">
-                    <div class="form-group">
+                    <div class="form-group ">
 
-                        <div class="col-md-8">
+                        <div class="form-inline">
                             <select class="form-control" id="forum" name="forum">
                                 <option selected value="">{% trans %}Move to...{% endtrans %}</option>
                                 {% for forum in available_forums %}
                                     <option value={{forum.id}}>{{ forum.title }}</option>
                                 {% endfor %}
                             </select>
-                        </div>
 
-                        <div class="col-md-4">
                             <button name="move" class="btn btn-info">
                                 <span class="fa fa-plane"></span> {% trans %}Move{% endtrans %}
                             </button>

+ 188 - 0
flaskbb/themes/aurora/templates/forum/topic.html

@@ -0,0 +1,188 @@
+{% extends theme("layout.html") %}
+{% set page_title = _("%(title)s - Topic", title=topic.title) %}
+{% set active_forum_nav=True %}
+
+{% block css %}
+    <link rel="stylesheet" href="{{ url_for('static', filename='css/bootstrap-markdown.min.css') }}">
+{% endblock %}
+
+{% block content %}
+{% from theme('macros.html') import render_pagination, form_field %}
+
+<ol class="breadcrumb flaskbb-breadcrumb">
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
+    <li><a href="{{ topic.forum.category.url }}">{{ topic.forum.category.title }}</a></li>
+    <li><a href="{{ topic.forum.url }}">{{ topic.forum.title }}</a></li>
+    <li class="active">{{ topic.title }}</li>
+</ol>
+
+
+<div class="topic-view">
+    {% include theme('forum/topic_controls.html') %}
+
+    <div class="panel panel-default topic-panel">
+        <div class="panel-heading topic-head">
+            <a href="{{ topic.url }}">{{ topic.title }}</a>
+        </div>
+        <div class="panel-body topic-body">
+            {% for post, user in posts.items %}
+            <tr>
+                <td >
+                    <span class="pull-right">
+                        <strong>#{%- if posts.page == 1 -%} {{ loop.index }} {%- else -%} {{ loop.index + (posts.page - 1) * flaskbb_config["POSTS_PER_PAGE"] }} {%- endif -%}</strong>
+                    </span>
+                    <span class="pull-left">
+                        <a href="
+                        {%- if posts.page > 1 -%}
+                            {{ topic.url }}?page={{ posts.page }}#pid{{ post.id }}
+                        {%- else -%}
+                            {{ topic.url }}#pid{{ post.id }}
+                        {%- endif -%}
+                            ">{{ post.date_created|format_date('%d %B %Y') }}</a>
+                        {% if post.user_id and post.date_modified %}
+                        <small>
+                            ({% trans %}Last modified{% endtrans %}: {{ post.date_modified|format_date }} {% trans %}by{% endtrans %}
+                            <a href="{{ url_for('user.profile', username=post.modified_by) }}">
+                                {{ post.modified_by }}
+                            </a>.)
+                        </small>
+                        {% endif %}
+                    </span>
+                </td>
+            </tr>
+
+            <tr>
+            <td>
+                <table class="table table-borderless">
+                    <tr>
+                    {% if post.user_id %}
+                        {% if user.avatar %}
+                        <td width="1">
+                            <img src="{{ user.avatar }}" alt="Avatar" height="100" width="100">
+                        </td>
+                        {% endif %}
+                        <td>
+                            <a href="{{ user.url }}">
+                                <span style="font-weight:bold">{{ user.username }}</span> <!-- TODO: Implement userstyles -->
+                            </a>
+                                {%- if user|is_online %}
+                                <span class="label label-success">Online</span>
+                                {%- else %}
+                                <span class="label label-default">Offline</span>
+                                {%- endif %}
+                                <div class="profile primary-group">
+                                {{ user.primary_group.name }}
+                                </div>
+                        </td>
+
+                        <td class="pull-right">
+                            {% trans %}Posts{% endtrans %}: {{ user.post_count }}<br />
+                            {% trans %}Registered since{% endtrans %}: {{ user.date_joined|format_date('%b %d %Y') }}<br />
+                        </td>
+                    {% else %}
+                        <td>
+                            <strong>{{ post.username }}</strong>
+                            <br />
+                            {% trans %}Guest{% endtrans %}
+                        </td>
+                    {% endif %}
+                    </tr>
+                </table>
+            </td>
+            </tr>
+
+            <tr>
+                <td>
+                    <div class="post_body" id="pid{{ post.id }}">
+                    {% autoescape false %}
+                        {{ post.content|markup }}
+                        <!-- Signature Begin -->
+                        {% if post.user_id and user.signature %}
+                        <div class="signature">
+                            <hr>
+                            {{ user.signature|markup }}
+                        </div>
+                        {% endif %}
+                        <!-- Signature End -->
+                    {% endautoescape %}
+                    </div>
+                </td>
+            </tr>
+            <tr>
+                <td>
+                    <span class="pull-left">
+                        {% if current_user.is_authenticated() and post.user_id and post.user_id != current_user.id %}
+                        <a href="{{ url_for('message.new_conversation', to_user=post.user.username) }}">{% trans %}PM{% endtrans %}</a>
+                        {% endif %}
+                        {% if user.website %}
+                        {% if current_user.is_authenticated() %}| {% endif %}<a href="{{ user.website }}">{% trans %}Website{% endtrans %}</a>
+                        {% endif %}
+                    </span>
+
+                    <span class="pull-right">
+                        {% if current_user.is_authenticated() %}
+                        <a href="{{ url_for('forum.report_post', post_id=post.id) }}" onclick="window.open(this.href, 'wio_window','width=500,height=500'); return false;">
+                            {% trans %}Report{% endtrans %}
+                        </a> |
+                        {% endif %}
+                        {% if current_user|edit_post(post) %}
+                        <a href="{{ url_for('forum.edit_post', post_id=post.id) }}">{% trans %}Edit{% endtrans %}</a> |
+                        {% endif %}
+                        {% if topic.first_post_id == post.id %}
+                            {% if current_user|delete_topic(topic) %}
+                            <form class="inline-form" method="post" action="{{ url_for('forum.delete_topic', topic_id=topic.id, slug=topic.slug) }}">
+                                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+                                <button class="btn btn-link">{% trans %}Delete{% endtrans %}</button> |
+                            </form>
+                            {% endif %}
+                        {% else %}
+                            {% if current_user|delete_post(post) %}
+                            <form class="inline-form" method="post" action="{{ url_for('forum.delete_post', post_id=post.id) }}">
+                                <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+                                <button class="btn btn-link">{% trans %}Delete{% endtrans %}</button> |
+                            </form>
+                            {% endif %}
+                        {% endif %}
+                        {% if current_user|post_reply(topic) %}
+                            <!-- Quick quote -->
+                            <a href="#" class="quote_btn" data-post-id="{{ post.id }}">{% trans %}Quote{% endtrans %}</a> |
+                            <!-- Full quote/reply -->
+                            <a href="{{ url_for('forum.reply_post', topic_id=topic.id, post_id=post.id) }}">{% trans %}Reply{% endtrans %}</a>
+                        {% endif %}
+                    </span>
+                </td>
+            </tr>
+            {% endfor %}
+
+        </div>
+    </div>
+
+    {% include theme('forum/topic_controls.html') %}
+    {% from theme("macros.html") import render_field, render_quickreply, render_submit_field %}
+{% if form %}
+
+    <form class="form" action="#" method="post">
+        {{ form.hidden_tag() }}
+
+        <div id="quickpost" class="post post-bg">
+            <div class="post-quickreply col-md-12 col-sm-12 col-xs-12">
+                    {{ render_quickreply(form.content, div_class="new-message", rows=7, cols=75, placeholder="", **{'data-provide': 'markdown', 'data-autofocus': 'false', 'id': 'quickreply-editor'}) }}
+            </div>
+            <div class="new-post-submit">
+                <div class="post-options pull-left">
+                    <span class="label label-info">Markdown</span>
+                    <a class="label label-success" href="#">help</a> <!-- TODO: add markdown cheat sheet -->
+                    <a class="label label-success" href="#">emojis</a> <!-- TODO: add emoji cheat sheet -->
+                </div>
+                {{ render_submit_field(form.submit, input_class="btn btn-success pull-right") }}
+            </div>
+        </div>
+    </form>
+{% endif %}
+</div>
+{% endblock %}
+
+{% block scripts %}
+    <script type="text/javascript" src="{{ url_for('static', filename='js/marked.js') }}"></script>
+    <script type="text/javascript" src="{{ url_for('static', filename='js/bootstrap-markdown.js') }}"></script>
+{% endblock %}

+ 75 - 0
flaskbb/themes/aurora/templates/forum/topic_controls.html

@@ -0,0 +1,75 @@
+<div class="row controls-row">
+<div class="pull-left">
+    {{ render_pagination(posts, topic.url) }}
+</div> <!-- end span pagination -->
+
+{% if current_user.is_authenticated() %}
+    <div class="pull-right">
+        {% if current_user.is_tracking_topic(topic) %}
+        <form class="inline-form" method="post" action="{{ url_for('forum.untrack_topic', topic_id=topic.id, slug=topic.slug) }}">
+            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+            <button class="btn btn-default">
+                <span class="fa fa-tag" aria-hidden="true"></span> {% trans %}Untrack Topic{% endtrans %}
+            </button>
+        </form>
+        {% else %}
+        <form class="inline-form" method="post" action="{{ url_for('forum.track_topic', topic_id=topic.id, slug=topic.slug) }}">
+            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+            <button class="btn btn-default">
+                <span class="fa fa-tag" aria-hidden="true"></span> {% trans %}Track Topic{% endtrans %}
+            </button>
+        </form>
+        {% endif %}
+
+        {% if current_user|post_reply(topic) %}
+        <a href="{{ url_for('forum.new_post', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-primary">
+            <span class="fa fa-pencil"></span> {% trans %}Reply{% endtrans %}
+        </a>
+        {% endif %}
+    </div>
+{% endif %}
+
+<div class="pull-right">
+{% if current_user|delete_topic(topic) %}
+    <form class="inline-form" method="post" action="{{ url_for('forum.delete_topic', topic_id=topic.id, slug=topic.slug) }}">
+        <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+        <button class="btn btn-danger">
+            <span class="fa fa-trash-o"></span> {% trans %}Delete Topic{% endtrans %}
+        </button>
+    </form>
+{% endif %}
+{% if current_user|can_moderate(topic.forum) %}
+    {% if not topic.locked %}
+        <form class="inline-form" method="post" action="{{ url_for('forum.lock_topic', topic_id=topic.id, slug=topic.slug) }}">
+            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+            <button class="btn btn-warning">
+                <span class="fa fa-lock"></span> {% trans %}Lock Topic{% endtrans %}
+            </button>
+        </form>
+    {% else %}
+        <form class="inline-form" method="post" action="{{ url_for('forum.unlock_topic', topic_id=topic.id, slug=topic.slug) }}">
+            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+            <button class="btn btn-warning">
+                <span class="fa fa-unlock"></span> {% trans %}Unlock Topic{% endtrans %}
+            </button>
+        </form>
+    {% endif %}
+
+    {% if not topic.important %}
+        <form class="inline-form" method="post" action="{{ url_for('forum.highlight_topic', topic_id=topic.id, slug=topic.slug) }}">
+            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+            <button class="btn btn-success">
+                <span class="fa fa-star"></span> {% trans %}Highlight Topic{% endtrans %}
+            </button>
+        </form>
+    {% else %}
+        <form class="inline-form" method="post" action="{{ url_for('forum.trivialize_topic', topic_id=topic.id, slug=topic.slug) }}">
+            <input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
+            <button class="btn btn-success">
+                <span class="fa fa-star-o"></span> {% trans %}Trivialize Topic{% endtrans %}
+            </button>
+        </form>
+    {% endif %}
+{% endif %}
+</div>
+</div>

+ 134 - 0
flaskbb/themes/aurora/templates/user/profile.html

@@ -0,0 +1,134 @@
+{% extends theme("layout.html") %}
+{% block content %}
+
+    <ul class="breadcrumb flaskbb-breadcrumb">
+        <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
+        <li class="active">{{ user.username }}</li>
+    </ul>
+
+
+    <div class="row">
+        <!-- left column -->
+        <div class="col-md-2 col-sm-3 col-xs-12">
+            <div class="panel panel-default panel-widget">
+                <div class="panel-heading panel-widget-heading">
+                    <a href="{{ user.url }}">{{ user.username }}</a>
+                </div>
+
+                <div class="panel-body panel-widget-body">
+                    <div class="profile-picture">
+                        {% if user.avatar %}
+                        <img src="{{ user.avatar }}" alt="Avatar" class="profile-avatar">
+                        {% endif %}
+                    </div>
+
+                    <div class="profile-online">
+                        {% if user|is_online %}
+                        <span class="label label-success">Online</span>
+                        {% else %}
+                        <span class="label label-default">Offline</span>
+                        {% endif %}
+                    </div>
+
+                    <div class="profile-pm">
+                        {% if current_user.is_authenticated() %}
+                        <a href="{{ url_for('message.new_conversation') }}?to_user={{ user.username }}">{% trans %}Send a Message{% endtrans %}</a>
+                        {% endif %}
+                    </div>
+
+                    <div class="profile-topics">
+                        <a href="{{ url_for('user.view_all_topics', username=user.username) }}">{% trans %}All Topics{% endtrans %}</a>
+                    </div>
+
+                    <div class="profile-posts">
+                        <a href="{{ url_for('user.view_all_posts', username=user.username) }}">{% trans %}All Posts{% endtrans %}</a>
+                    </div>
+
+                </div>
+            </div> <!-- end profile widget -->
+        </div> <!-- end col -->
+
+
+        <!-- middle column -->
+        <div class="col-md-7 col-sm-5 col-xs-12">
+            <div class="panel panel-default panel-widget">
+                <div class="panel-heading panel-widget-heading">{% trans %}Info{% endtrans %}</div>
+                <div class="panel-body panel-widget-body">
+
+                    {% if user.notes %}
+                        {{ user.notes|markup|safe }}
+                    {% else %}
+                        {% trans %}User has not added any notes about him.{% endtrans %}
+                    {% endif %}
+
+                </div>
+            </div> <!-- end profile widget -->
+
+            {% if user.signature %}
+            <div class="panel panel-default panel-widget">
+                <div class="panel-heading panel-widget-heading">{% trans %}Signature{% endtrans %}</div>
+                <div class="panel-body panel-widget-body">
+
+                    {{ user.signature|markup|safe }}
+
+                </div>
+            </div> <!-- end profile widget -->
+            {% endif %}
+        </div> <!-- end col -->
+
+
+        <!-- right column -->
+        <div class="col-md-3 col-sm-4 col-xs-12">
+            <div class="panel panel-default panel-widget">
+                <div class="panel-heading panel-widget-heading">{% trans %}User Stats{% endtrans %}</div>
+                <div class="panel-body panel-widget-body">
+
+                <div class="profile-stats-field">
+                        <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Group{% endtrans %}:</p></div>
+                        <div class="col-md-7 col-sm-6 col-xs-6"><p>{{ user.primary_group.name }}</p></div>
+                    </div>
+
+                    <div class="profile-stats-field">
+                        <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Joined{% endtrans %}:</p></div>
+                        <div class="col-md-7 col-sm-6 col-xs-6"><p>{{ user.date_joined|format_date('%b %d %Y') }}</p></div>
+                    </div>
+
+                    <div class="profile-stats-field">
+                        <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Posts{% endtrans %}:</p></div>
+                        <div class="col-md-7 col-sm-6 col-xs-6"><p>{{ user.post_count }} ({{ user.posts_per_day }} per day)</p></div>
+                    </div>
+
+                    <div class="profile-stats-field">
+                        <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Last seen{% endtrans %}:</p></div>
+                        <div class="col-md-7 col-sm-6 col-xs-6"><p>{%- if user.lastseen -%} {{ user.lastseen|time_since }} {%- else -%} {% trans %}Never seen{% endtrans %} {%- endif -%}</p></div>
+                    </div>
+
+                    <div class="profile-stats-field">
+                        <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Last post{% endtrans %}:</p></div>
+                        <div class="col-md-7 col-sm-6 col-xs-6"><p>
+                            {%- if user.last_post -%}
+                            <a href="{{ user.last_post.url }}">{{ user.last_post.date_created|time_since }}</a>
+                            {%- else -%}
+                                {% trans %}Never{% endtrans %}
+                            {%- endif -%}
+                      </p></div>
+                    </div>
+
+                    <div class="profile-stats-field">
+                      <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Location{% endtrans %}:</p></div>
+                      <div class="col-md-7 col-sm-6 col-xs-6"><p>{%- if user.location -%} {{ user.location }} {%- else -%} {% trans %}No Info{% endtrans %} {%- endif -%}</p></div>
+                    </div>
+
+                    <div class="profile-stats-field">
+                      <div class="col-md-5 col-sm-6 col-xs-6"><p class="stats-right">{% trans %}Birthday{% endtrans %}:</p></div>
+                      <div class="col-md-7 col-sm-6 col-xs-6"><p>{% if user.birthday %} {{ user.birthday|format_date('%b %d %Y') }} {% else %} {% trans %}No Info{% endtrans %} {% endif %} {% if user.gender %} ({{ user.gender }}) {% endif %}</p></div>
+                    </div>
+
+                </div>
+            </div> <!-- end panel-widget -->
+
+        </div> <!-- end col -->
+    </div> <!-- end row -->
+
+</div>
+{% endblock %}

+ 5 - 4
flaskbb/user/models.py

@@ -383,7 +383,7 @@ class User(db.Model, UserMixin, CRUDMixin):
             filter(Conversation.unread, Conversation.user_id == self.id).all()
         return unread_messages
 
-    def invalidate_cache(self, permissions_only=True):
+    def invalidate_cache(self, permissions=True, messages=True):
         """Invalidates this objects cached metadata.
 
         :param permissions_only: If set to ``True`` it will only invalidate
@@ -391,11 +391,12 @@ class User(db.Model, UserMixin, CRUDMixin):
                                  also invalidate the user's unread message
                                  cache.
         """
-        if not permissions_only:
+        if messages:
             cache.delete_memoized(self.get_unread_messages, self)
 
-        cache.delete_memoized(self.get_permissions, self)
-        cache.delete_memoized(self.get_groups, self)
+        if permissions:
+            cache.delete_memoized(self.get_permissions, self)
+            cache.delete_memoized(self.get_groups, self)
 
     def ban(self):
         """Bans the user. Returns True upon success."""