Rafał Pitoń 10 лет назад
Родитель
Сommit
31e12b96b4

+ 0 - 1
misago/forums/urls.py

@@ -4,5 +4,4 @@ from django.conf.urls import patterns, include, url
 urlpatterns = patterns('misago.forums.views',
     url(r'^category/(?P<forum_slug>[\w\d-]+)-(?P<forum_id>\d+)/$', 'category', name='category'),
     url(r'^redirect/(?P<forum_slug>[\w\d-]+)-(?P<forum_id>\d+)/$', 'redirect', name='redirect'),
-    url(r'^forum/(?P<forum_slug>[\w\d-]+)-(?P<forum_id>\d+)/$', 'forum', name='forum'),
 )

+ 1 - 1
misago/templates/misago/forums/subforums.html

@@ -6,6 +6,6 @@
         Forums in {{ forum }}
         {% endblocktrans %}</h3>
     </div>
-    {% include "misago/forums/forums.html" %}
+    {% include "misago/forums/forums.html" with forums=forum.subforums %}
   </div>
 </div>

+ 46 - 0
misago/templates/misago/threads/list.html

@@ -0,0 +1,46 @@
+{% extends "misago/base.html" %}
+{% load i18n misago_stringutils %}
+
+
+{% block title %}{{ forum.name }} | {{ block.super }}{% endblock title %}
+
+
+{% block meta-description %}{{ forum.description|striplinebreaks }}{% endblock meta-description %}
+
+
+{% block content %}
+<div{% if forum.css %} class="page-{{ forum.css_class }}"{% endif %}>
+  <div class="page-header">
+    <div class="container">
+      {% if path %}
+      <ol class="breadcrumb">
+        {% for crumb in path|slice:":-1" %}
+        <li>
+          <a href="{{ crumb.get_absolute_url }}">{{ crumb.name }}</a>{% if not forloop.last %}<span class="fa fa-chevron-right"></span>{% endif %}
+        </li>
+        {% endfor %}
+      </ol>
+      {% endif %}
+
+      <h1>{{ forum.name }}</h1>
+    </div>
+  </div>
+  <div class="container">
+    {% if forum.description %}
+    <div class="lead">
+      {{ forum.description|escape|urlize|linebreaks }}
+    </div>
+    {% endif %}
+
+    {% if forum.subforums %}
+    {% include "misago/forums/subforums.html" with category=forum %}
+    {% endif %}
+  </div>
+</div>
+{% endblock content %}
+
+
+{% block javascripts %}
+{{ block.super }}
+{% include "misago/forums/js.html" %}
+{% endblock javascripts %}

+ 2 - 2
misago/threads/models/__init__.py

@@ -1,4 +1,4 @@
 # flake8: noqa
-#from misago.threads.models.thread import Thread
-#from misago.threads.models.post import Post
+from misago.threads.models.post import Post
 from misago.threads.models.prefix import Prefix
+from misago.threads.models.thread import Thread

+ 9 - 0
misago/threads/urls.py

@@ -0,0 +1,9 @@
+from django.conf.urls import patterns, include, url
+
+from misago.threads.views.threads import ForumView, ThreadView
+
+
+urlpatterns = patterns('',
+    url(r'^forum/(?P<forum_slug>[\w\d-]+)-(?P<forum_id>\d+)/$', ForumView.as_view(), name='forum'),
+    url(r'^forum/(?P<forum_slug>[\w\d-]+)-(?P<forum_id>\d+)/(?P<page>\d+)/$', ForumView.as_view(), name='forum'),
+)

+ 102 - 0
misago/threads/views/generic.py

@@ -0,0 +1,102 @@
+"""
+Module with basic views for use by inheriting actions
+"""
+from django.shortcuts import render
+from django.views.generic import View
+
+from misago.acl import add_acl
+from misago.core.shortcuts import get_object_or_404, paginate, validate_slug
+from misago.forums.lists import get_forums_list, get_forum_path
+from misago.forums.models import Forum
+from misago.forums.permissions import allow_see_forum, allow_browse_forum
+
+
+class ForumMixin(object):
+    """
+    Mixin for getting forums
+    """
+    def get_forum(self, request, **kwargs):
+        forum = self.fetch_forum(request, **kwargs)
+        self.check_forum_permissions(request, forum)
+
+        if kwargs.get('forum_slug'):
+            validate_slug(forum, kwargs.get('forum_slug'))
+
+        return forum
+
+    def fetch_forum(self, request, **kwargs):
+        return get_object_or_404(
+            Forum, id=kwargs.get('forum_id'), role='forum')
+
+    def check_forum_permissions(self, request, forum):
+        add_acl(request.user, forum)
+        allow_see_forum(request.user, forum)
+        allow_browse_forum(request.user, forum)
+
+
+class ViewBase(ForumMixin, View):
+    templates_dir = ''
+    template = ''
+
+    def final_template(self):
+        return '%s/%s' % (self.templates_dir, self.template)
+
+    def process_context(self, request, context):
+        """
+        Simple hook for extending and manipulating template context.
+        """
+        return context
+
+    def render(self, request, context=None, template=None):
+        context = self.process_context(request, context or {})
+        template = template or self.final_template()
+        return render(request, template, context)
+
+
+class ForumView(ViewBase):
+    """
+    Basic view for threads lists
+    """
+    template = 'list.html'
+
+    def get_threads(self, request, forum, **kwargs):
+        return forum.thread_set
+
+    def dispatch(self, request, *args, **kwargs):
+        forum = self.get_forum(request, **kwargs)
+        forum.subforums = get_forums_list(request.user, forum)
+        threads = self.get_threads(request, forum, **kwargs)
+
+        return self.render(request, {
+            'forum': forum,
+            'path': get_forum_path(forum),
+        })
+
+
+class ThreadView(ViewBase):
+    """
+    Basic view for threads
+    """
+    def fetch_thread(self, request, **kwargs):
+        pass
+
+    def dispatch(self, request, *args, **kwargs):
+        thread = self.fetch_thread(request, **kwargs)
+
+
+class PostView(ViewBase):
+    """
+    Basic view for posts
+    """
+    def fetch_post(self, request, **kwargs):
+        pass
+
+    def dispatch(self, request, *args, **kwargs):
+        post = self.fetch_post(request, **kwargs)
+
+
+class EditorView(ViewBase):
+    """
+    Basic view for starting/replying/editing
+    """
+    pass

+ 13 - 0
misago/threads/views/threads.py

@@ -0,0 +1,13 @@
+from misago.threads.views import generic
+
+
+class ThreadsMixin(object):
+    templates_dir = 'misago/threads'
+
+
+class ForumView(ThreadsMixin, generic.ForumView):
+    pass
+
+
+class ThreadView(ThreadsMixin, generic.ThreadView):
+    pass

+ 1 - 0
misago/urls.py

@@ -16,6 +16,7 @@ urlpatterns += patterns('',
     url(r'^', include('misago.users.urls')),
     url(r'^', include('misago.notifications.urls')),
     url(r'^', include('misago.forums.urls')),
+    url(r'^', include('misago.threads.urls')),
     # UI Server view that handles realtime updates of Misago UI
     url(r'^ui-server/$', 'misago.core.uiviews.uiserver', name="ui_server"),
 )