Browse Source

Finished portal plugin

sh4nks 11 years ago
parent
commit
9acd3c256d

+ 167 - 50
flaskbb/plugins/portal/templates/index.html

@@ -1,85 +1,202 @@
 {% extends theme("layout.html") %}
 
+{% block css %}
+  {{  super() }}
+
+  <style>
+  /* news posts */
+  .portal-info {
+      font-size:15px;
+      color:#999999;
+      padding: 0;
+      margin-top:5px;
+      margin-bottom:10px;
+      margin-right: 0px;
+      margin-left: 0px;
+  }
+  .portal-info ul {
+      list-style-type:none;
+  }
+  .portal-info li {
+      display:inline;
+      padding-right:10px;
+  }
+
+  .portal-info a {
+      color:#999999;
+  }
+  .portal-content h1,
+  .portal-content h2,
+  .portal-content h3,
+  .portal-content h4,
+  .portal-content h5 {
+      font-weight:500;
+  }
+
+  /* recent topics */
+  .portal-topic:not(:first-child) {
+    padding-top: 5px;
+    clear: both;
+
+    border-top: 1px solid #ddd;
+  }
+
+  .portal-topic-name {
+    float: left;
+  }
+
+  .portal-topic-updated-by {
+    float: right;
+  }
+
+  .portal-topic-updated {
+    color:#999999;
+    clear: both;
+    float: right;
+
+  }
+
+  /* stats */
+  .portal-stats {
+    color:#999999;
+  }
+  .portal-stats:not(:first-child) {
+    padding-top: 5px;
+    clear: both;
+  }
+
+  .portal-stats-left {
+    float: left;
+  }
+
+  .portal-stats-right {
+    float: right;
+  }
+  </style>
+{% endblock %}
+
 {% block content %}
   <div class="container main-content">
     <div class="row">
 
       <!-- Left -->
-      <div class="col-md-4">
+      <div class="col-md-8">
         <div class="panel panel-default">
           <div class="panel-heading">
-            <h3 class="panel-title">Lorem Ipsum</h3>
+            <h3 class="panel-title">News</h3>
           </div>
           <div class="panel-body">
+          {% for topic in news %}
+            <h1><a href="{{ topic.url }}">{{ topic.title }}</a></h1>
+            <ul class="portal-info">
+                <li><i class="fa fa-calendar"></i> {{ topic.date_created|format_date('%b %d %Y') }}</li>
+                <li><i class="fa fa-user"></i> <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a></li>
+                <li><i class="fa fa-comment"></i> <a href="{{ topic.url }}">Comments ({{ topic.post_count }})</a></li>
+            </ul>
+            <div class="portal-content">
+                {{ topic.first_post.content | markup | safe }}<br />
+            </div>
 
+            {% if not loop.last %}<hr>{% endif %}
+          {% endfor %}
 
           </div> <!-- /.panel-body -->
         </div>
 
-        <div class="panel panel-default">
-          <div class="panel-heading">
-            <h3 class="panel-title">Lorem Ipsum</h3>
-          </div>
-          <div class="panel-body">
-
-          </div>
-        </div>
-      </div>
-
-      <!-- Middle -->
-      <div class="col-md-4">
-        <div class="panel panel-default">
-          <div class="panel-heading">
-            <form class="form-inline" role="form">
-              <div class="form-group">
-                <label class="sr-only" for="searchManga">Search</label>
-                <input type="email" class="form-control" id="search" placeholder="Search Topics">
-              </div>
-            </form>
-          </div>
-        </div>
-
-        <div class="panel panel-default">
-          <div class="panel-heading">
-            <h3 class="panel-title">Lorem Ipsum</h3>
-          </div>
-          <div class="panel-body">
-          </div> <!-- /.panel-body -->
-        </div>
       </div>
 
       <!-- Right -->
       <div class="col-md-4">
         <div class="panel panel-default">
           <div class="panel-heading">
-            <h3 class="panel-title">Login</h3>
+            <h3 class="panel-title">Recent Topics</h3>
           </div>
           <div class="panel-body">
-            <form role="form">
-              <div class="form-group">
-                <label for="username">Username</label>
-                <input type="email" class="form-control" id="username" placeholder="username">
-              </div>
-              <div class="form-group">
-                <label for="exampleInputPassword1">Password</label>
-                <input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
-              </div>
-              <div class="checkbox">
-                <label>
-                  <input type="checkbox"> Remember Me
-                </label>
-              </div>
-              <button type="submit" class="btn btn-default">Login</button>
-            </form>
+          {% for topic in recent_topics %}
+
+              <div class="portal-topic">
+                <div class="portal-topic-name">
+                  <a href="{{ topic.url }}">{{ topic.title }}</a>
+                </div>
+                <div class="portal-topic-updated-by">
+                  <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a>
+                </div>
+                <div class="portal-topic-updated">
+                  {{ topic.date_created | time_since }}
+                </div>
+              </div> <!-- /.topic -->
+
+          {% endfor %}
           </div>
         </div>
 
         <div class="panel panel-default">
           <div class="panel-heading">
-            <h3 class="panel-title">Lorem Ipsum</h3>
+            <h3 class="panel-title">Statistics</h3>
           </div>
           <div class="panel-body">
 
+                <div class="portal-stats">
+                  <div class="portal-stats-left">
+                    Topics
+                  </div>
+                  <div class="portal-stats-right">
+                    {{ topic_count }}
+                  </div>
+                </div>
+
+                <div class="portal-stats">
+                  <div class="portal-stats-left">
+                    Posts
+                  </div>
+                  <div class="portal-stats-right">
+                    {{ post_count }}
+                  </div>
+                </div>
+
+                <div class="portal-stats">
+                  <div class="portal-stats-left">
+                    Registered Users
+                  </div>
+                  <div class="portal-stats-right">
+                    {{ user_count }}
+                  </div>
+                </div>
+
+                {% if newest_user %}
+                <div class="portal-stats">
+                  <div class="portal-stats-left">
+                    Newest User
+                  </div>
+                  <div class="portal-stats-right">
+                    <a href="{{ newest_user.url }}">{{ newest_user.username }}</a>
+                  </div>
+                </div>
+                {% endif %}
+
+                <div class="portal-stats">
+                  <div class="portal-stats-left">
+                    Online Users
+                  </div>
+
+                  <div class="portal-stats-right">
+                    {{ online_users }}
+                  </div>
+                </div>
+
+                {% if config["REDIS_ENABLED"] %}
+                <div class="portal-stats">
+                  <div class="portal-stats-left">
+                    Guests online
+                  </div>
+
+                  <div class="portal-stats-right">
+                    {{ online_guests }}
+                  </div>
+                </div>
+                {% endif %}
+            </td>
+        </tr>
           </div>
         </div>
       </div>

+ 29 - 5
flaskbb/plugins/portal/views.py

@@ -1,9 +1,11 @@
-from flask import Blueprint
+from flask import Blueprint, current_app
 from flaskbb.utils.helpers import render_template
-from flaskbb.forum.models import Topic
+from flaskbb.forum.models import Topic, Post
+from flaskbb.user.models import User
+from flaskbb.utils.helpers import time_diff, get_online_users
 
 
-FORUM_IDS = [1]
+FORUM_IDS = [1, 2]
 
 portal = Blueprint("portal", __name__, template_folder="templates")
 
@@ -14,5 +16,27 @@ def inject_portal_link():
 
 @portal.route("/")
 def index():
-    topics = Topic.query.filter(Topic.forum_id.in_(FORUM_IDS)).all()
-    return render_template("index.html", topics=topics)
+    news = Topic.query.filter(Topic.forum_id.in_(FORUM_IDS)).all()
+    recent_topics = Topic.query.order_by(Topic.date_created).limit(5).offset(0)
+
+    user_count = User.query.count()
+    topic_count = Topic.query.count()
+    post_count = Post.query.count()
+    newest_user = User.query.order_by(User.id.desc()).first()
+
+    # Check if we use redis or not
+    if not current_app.config["REDIS_ENABLED"]:
+        online_users = User.query.filter(User.lastseen >= time_diff()).count()
+
+        # Because we do not have server side sessions, we cannot check if there
+        # are online guests
+        online_guests = None
+    else:
+        online_users = len(get_online_users())
+        online_guests = len(get_online_users(guest=True))
+
+    return render_template("index.html", news=news, recent_topics=recent_topics,
+                           user_count=user_count, topic_count=topic_count,
+                           post_count=post_count, newest_user=newest_user,
+                           online_guests=online_guests,
+                           online_users=online_users)

+ 0 - 29
flaskbb/static/css/flaskbb.css

@@ -188,32 +188,3 @@ margin-bottom: 0px;
   border-top-right-radius: 0;
 }
 /* End sidebar */
-
-
-.blog-info {
-    font-size:15px;
-    color:#999999;
-    padding: 0;
-    margin-top:5px;
-    margin-bottom:10px;
-    margin-right: 0px;
-    margin-left: 0px;
-}
-.blog-info ul {
-    list-style-type:none;
-}
-.blog-info li {
-    display:inline;
-    padding-right:10px;
-}
-
-.blog-info a {
-    color:#999999;
-}
-.blog-content h1,
-.blog-content h2,
-.blog-content h3,
-.blog-content h4,
-.blog-content h5 {
-    font-weight:500;
-}