Browse Source

The topictracker is working now. But I still need to implement the `untrack` functionality.

sh4nks 11 years ago
parent
commit
76f9f8574f

+ 15 - 9
flaskbb/forum/views.py

@@ -219,21 +219,27 @@ def memberlist():
         paginate(page, current_app.config['POSTS_PER_PAGE'], False)
         paginate(page, current_app.config['POSTS_PER_PAGE'], False)
 
 
     return render_template("forum/memberlist.html",
     return render_template("forum/memberlist.html",
-                           users=users,
+                           users=users)
-                           per_page=current_app.config['USERS_PER_PAGE'])
 
 
 
 
 @forum.route("/topictracker")
 @forum.route("/topictracker")
-def topic_tracker():
+def topictracker():
-    #return render_template("forum/topictracker.html", topics=topics)
+    page = request.args.get("page", 1, type=int)
-    pass
+    topics = current_user.tracked_topics.\
+        paginate(page, current_app.config['TOPICS_PER_PAGE'], False)
+    return render_template("forum/topictracker.html", topics=topics)
 
 
 
 
 @forum.route("/topictracker/<topic_id>/add")
 @forum.route("/topictracker/<topic_id>/add")
-def add_to_topictrack(topic_id):
+def add_to_topictracker(topic_id):
-    pass
+    topic = Topic.query.filter_by(id=topic_id).first()
+    current_user.track_topic(topic)
+    current_user.save()
+    return redirect(url_for("forum.view_topic", topic_id=topic.id))
 
 
 
 
 @forum.route("/topictracker/<topic_id>/delete")
 @forum.route("/topictracker/<topic_id>/delete")
-def remove_from_topictrack(topic_id):
+def remove_from_topictracker(topic_id):
-    pass
+    topic = Topic.query.filter_by(id=topic_id).first()
+    current_user.untrack_topic.remove(topic)
+    return redirect(url_for("forum.topictracker"))

+ 3 - 0
flaskbb/templates/forum/topic.html

@@ -23,6 +23,9 @@
     {% if current_user|delete_topic(topic.first_post.user_id, topic.forum) %}
     {% if current_user|delete_topic(topic.first_post.user_id, topic.forum) %}
     <a href="{{ url_for('forum.delete_topic', topic_id=topic.id) }}" class="btn btn-primary">Delete Topic</a>
     <a href="{{ url_for('forum.delete_topic', topic_id=topic.id) }}" class="btn btn-primary">Delete Topic</a>
     {% endif %}
     {% endif %}
+    {% if current_user.is_authenticated() %}
+    <a href="{{ url_for('forum.add_to_topictracker', topic_id=topic.id) }}" class="btn btn-primary">Track Topic</a>
+    {% endif %}
 </div>
 </div>
 
 
 <table class="table table-bordered">
 <table class="table table-bordered">

+ 65 - 0
flaskbb/templates/forum/topictracker.html

@@ -0,0 +1,65 @@
+{% extends 'layout.html' %}
+{% from 'macros.html' import render_pagination %}
+
+{% block content %}
+<ul class="breadcrumb">
+    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li class="active">Tracked Topics</li>
+</ul>
+
+<div class="pull-left" style="padding-bottom: 10px">
+    {{ render_pagination(topics, url_for('forum.topictracker')) }}
+</div> <!-- end span pagination -->
+
+
+<table class="table table-bordered">
+    <thead>
+        <tr>
+            <th colspan="5">
+                Topic Tracker
+            </th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <td colspan="2">Thread</td>
+
+            <td>Posts</td>
+
+            <td>Views</td>
+
+            <td>Last Post</td>
+        </tr>
+
+        {% for topic in topics.items %}
+        <tr>
+            <td width="4%"></td>
+            <td>
+                <div>
+                    <a href="{{ url_for('forum.view_topic', topic_id=topic.id) }}">{{ topic.title }}</a> <br />
+                    <small>by <a href="{{ url_for('user.profile', username=topic.user.username) }}">{{ topic.user.username }}</a></small>
+                </div>
+            </td>
+            <td>
+                {{ topic.post_count }}
+            </td>
+            <td>
+                {{ topic.views }}
+            </td>
+            <td>
+                <a href="{{ url_for('forum.view_topic', topic_id=topic.id) }}#pid{{topic.last_post.id}}">{{ topic.last_post.date_created|time_since }}</a><br />
+                <small>by <a href="{{ url_for('user.profile', username=topic.last_post.user.username) }}">{{ topic.last_post.user.username }}</a></small>
+            </td>
+        </tr>
+        {% else %}
+        <tr>
+            <td colspan="5">
+                No Topics so far.
+            </td>
+        </tr>
+        {% endfor %}
+
+    </tbody>
+</table>
+
+{% endblock %}

+ 1 - 1
flaskbb/templates/layout.html

@@ -48,7 +48,7 @@
                                 <span class="caret"></span>
                                 <span class="caret"></span>
                             </button>
                             </button>
                             <ul class="dropdown-menu" role="menu">
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('forum.topic_tracker') }}"><span class="glyphicon glyphicon-book"></span> Topic Tracker</a></li>
+                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="glyphicon glyphicon-book"></span> Topic Tracker</a></li>
                                 <li class="divider"></li>
                                 <li class="divider"></li>
 
 
                                 <li><a href="{{ url_for('user.settings') }}"><span class="glyphicon glyphicon-cog"></span> Settings</a></li>
                                 <li><a href="{{ url_for('user.settings') }}"><span class="glyphicon glyphicon-cog"></span> Settings</a></li>

+ 30 - 1
flaskbb/user/models.py

@@ -16,7 +16,7 @@ from werkzeug import generate_password_hash, check_password_hash
 from flask import current_app
 from flask import current_app
 from flask.ext.login import UserMixin, AnonymousUserMixin
 from flask.ext.login import UserMixin, AnonymousUserMixin
 from flaskbb.extensions import db, cache
 from flaskbb.extensions import db, cache
-from flaskbb.forum.models import Post, Topic
+from flaskbb.forum.models import Post, Topic, topictracker
 
 
 
 
 groups_users = db.Table('groups_users',
 groups_users = db.Table('groups_users',
@@ -90,6 +90,12 @@ class User(db.Model, UserMixin):
                         backref=db.backref('users', lazy='dynamic'),
                         backref=db.backref('users', lazy='dynamic'),
                         lazy='dynamic')
                         lazy='dynamic')
 
 
+    tracked_topics = \
+        db.relationship("Topic", secondary=topictracker,
+                        primaryjoin=(topictracker.c.user_id == id),
+                        backref=db.backref("topicstracked", lazy="dynamic"),
+                        lazy="dynamic")
+
     def __repr__(self):
     def __repr__(self):
         return "Username: %s" % self.username
         return "Username: %s" % self.username
 
 
@@ -177,6 +183,29 @@ class User(db.Model, UserMixin):
         return Post.query.filter(Post.user_id == self.id).\
         return Post.query.filter(Post.user_id == self.id).\
             paginate(page, current_app.config['TOPICS_PER_PAGE'], False)
             paginate(page, current_app.config['TOPICS_PER_PAGE'], False)
 
 
+    def track_topic(self, topic):
+        """
+        Tracks the specified topic
+        """
+        if not self.is_tracking_topic(topic):
+            self.tracked_topics.append(topic)
+            return self
+
+    def untrack_topic(self, topic):
+        """
+        Untracks the specified topic
+        """
+        if self.is_following_topic(topic):
+            self.tracked_topics.remove(topic)
+            return self
+
+    def is_tracking_topic(self, topic):
+        """
+        Checks if the user is already tracking this topic
+        """
+        return self.tracked_topics.filter(
+            topictracker.c.topic_id == topic.id).count() > 0
+
     def add_to_group(self, group):
     def add_to_group(self, group):
         """
         """
         Adds the user to the `group` if he isn't in it.
         Adds the user to the `group` if he isn't in it.