Browse Source

Starting global announcements

Ralfp 12 years ago
parent
commit
f35d64fdb5

+ 10 - 0
misago/apps/announcements/forms.py

@@ -0,0 +1,10 @@
+from misago.apps.threadtype.posting.forms import (NewThreadForm as NewThreadBaseForm,
+                                                  EditThreadForm as EditThreadBaseForm)
+
+class NewThreadForm(NewThreadBaseForm):
+    include_thread_weight = False
+
+
+class EditThreadForm(EditThreadBaseForm):
+    include_thread_weight = False
+    

+ 1 - 1
misago/apps/announcements/views.py → misago/apps/announcements/list.py

@@ -10,7 +10,7 @@ class ThreadsListView(ThreadsListBaseView, ThreadsListModeration, TypeMixin):
         self.forum = Forum.objects.get(special='announcements')
 
     def fetch_threads(self):
-        queryset = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum))
+        queryset = self.request.acl.threads.filter_threads(self.request, self.forum, Thread.objects.filter(forum=self.forum)).order_by('-start')
         self.count = queryset.count()
         self.pagination = make_pagination(self.kwargs.get('page', 0), self.count, self.request.settings.threads_per_page)
         

+ 31 - 0
misago/apps/announcements/posting.py

@@ -0,0 +1,31 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.utils.translation import ugettext as _
+from misago.apps.threadtype.posting import NewThreadBaseView, EditThreadBaseView, NewReplyBaseView, EditReplyBaseView
+from misago.messages import Message
+from misago.models import Forum, Thread, Post
+from misago.apps.announcements.forms import NewThreadForm, EditThreadForm
+from misago.apps.announcements.mixins import TypeMixin
+
+class NewThreadView(NewThreadBaseView, TypeMixin):
+    action = 'new_thread'
+    form_type = NewThreadForm
+
+    def set_forum_context(self):
+        self.forum = Forum.objects.get(special='announcements')
+
+    def response(self):
+        if self.post.moderated:
+            self.request.messages.set_flash(Message(_("New announcement has been posted. It will be hidden from other members until moderator reviews it.")), 'success', 'threads')
+        else:
+            self.request.messages.set_flash(Message(_("New announcement has been posted.")), 'success', 'threads')
+        return redirect(reverse('announcement', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))
+
+
+class EditThreadView(EditThreadBaseView, TypeMixin):
+    action = 'edit_thread'
+    form_type = EditThreadForm
+    
+    def response(self):
+        self.request.messages.set_flash(Message(_("Announcement has been edited.")), 'success', 'threads_%s' % self.post.pk)
+        return redirect(reverse('announcement', kwargs={'thread': self.thread.pk, 'slug': self.thread.slug}) + ('#post-%s' % self.post.pk))

+ 4 - 3
misago/apps/announcements/urls.py

@@ -1,6 +1,7 @@
 from django.conf.urls import patterns, url
 
-urlpatterns = patterns('misago.apps.announcements.views',
-    url(r'^$', 'ThreadsListView', name="announcements"),
-    url(r'^(?P<page>\d+)/$', 'ThreadsListView', name="announcements"),
+urlpatterns = patterns('misago.apps.announcements',
+    url(r'^$', 'list.ThreadsListView', name="announcements"),
+    url(r'^(?P<page>\d+)/$', 'list.ThreadsListView', name="announcements"),
+    url(r'^new/$', 'posting.NewThreadView', name="announcement_start"),
 )

+ 4 - 2
misago/apps/threadtype/posting/forms.py

@@ -6,6 +6,8 @@ from misago.forms import Form
 from misago.validators import validate_sluggable
 
 class PostingForm(Form, ValidatePostLengthMixin):
+    include_thread_weight = True
+    include_close_thread = True
     post = forms.CharField(widget=forms.Textarea)
 
     def __init__(self, data=None, file=None, request=None, forum=None, thread=None, *args, **kwargs):
@@ -24,7 +26,7 @@ class PostingForm(Form, ValidatePostLengthMixin):
                        ]
 
         # Can we change threads states?
-        if (self.request.acl.threads.can_pin_threads(self.forum) and
+        if self.include_thread_weight and (self.request.acl.threads.can_pin_threads(self.forum) and
             (not self.thread or self.request.acl.threads.can_pin_threads(self.forum) >= self.thread.weight)):
             thread_weight = []
             if self.request.acl.threads.can_pin_threads(self.forum) == 2:
@@ -44,7 +46,7 @@ class PostingForm(Form, ValidatePostLengthMixin):
                                                                       initial=current_weight)
 
         # Can we lock threads?
-        if self.request.acl.threads.can_close(self.forum):
+        if self.include_close_thread and self.request.acl.threads.can_close(self.forum):
             self.fields['close_thread'] = forms.BooleanField(required=False)
             if self.thread and self.thread.closed:
                 self.layout[0][1].append(('close_thread', {'inline': _("Open Thread")}))

+ 2 - 7
misago/apps/threadtype/posting/newthread.py

@@ -32,7 +32,7 @@ class NewThreadBaseView(PostingBaseView):
                                             )
 
         # Create our post
-        md, post_preparsed = post_markdown(self.request, form.cleaned_data['post'])
+        self.md, post_preparsed = post_markdown(self.request, form.cleaned_data['post'])
         self.post = Post.objects.create(
                                         forum=self.forum,
                                         thread=self.thread,
@@ -78,9 +78,4 @@ class NewThreadBaseView(PostingBaseView):
             self.request.user.threads += 1
             self.request.user.posts += 1
         self.request.user.last_post = now
-        self.request.user.save(force_update=True)
-
-        # Notify mentioned
-        if md.mentions:
-            self.post.notify_mentioned(self.request, md.mentions)
-            self.post.save(force_update=True)
+        self.request.user.save(force_update=True)

+ 7 - 9
templates/cranefly/announcements/list.html

@@ -27,7 +27,7 @@
   <div class="forum-threads-extra extra-top">
     {{ pager() }}
     {% if user.is_authenticated() and acl.threads.can_start_threads(forum) %}
-    <a href="{% url 'thread_start' forum=forum.pk, slug=forum.slug %}" class="btn btn-inverse pull-right"><i class="icon-plus"></i> {% trans %}New Thread{% endtrans %}</a>
+    <a href="{% url 'announcement_start' %}" class="btn btn-inverse pull-right"><i class="icon-plus"></i> {% trans %}Make Announcement{% endtrans %}</a>
     {% endif %}
   </div>
 
@@ -97,7 +97,7 @@
         {% else %}
         <tr>
           <td colspan="4" class="threads-list-empty">
-            {% trans %}There are no threads in this forum.{% endtrans %}
+            {% trans %}No global announcements are currently defined.{% endtrans %}
           </td>
         </tr>
         {% endfor %}
@@ -105,7 +105,7 @@
     </table>
     {% if user.is_authenticated() and list_form %}
     <div class="threads-actions">
-      <form id="threads_form" class="form-inline pull-right" action="{% url 'forum' slug=forum.slug, forum=forum.id, page=pagination['page'] %}" method="POST">
+      <form id="threads_form" class="form-inline pull-right" action="{% url 'announcements' page=pagination['page'] %}" method="POST">
         <input type="hidden" name="{{ csrf_id }}" value="{{ csrf_token }}">
         {{ form_theme.input_select(list_form['list_action'],width=3) }}
         <button type="submit" class="btn btn-danger">{% trans %}Go{% endtrans %}</button>
@@ -117,9 +117,7 @@
   <div class="forum-threads-extra">
     {{ pager() }}
     {% if user.is_authenticated() and acl.threads.can_start_threads(forum) %}
-    <a href="{% url 'thread_start' forum=forum.pk, slug=forum.slug %}" class="btn btn-inverse pull-right"><i class="icon-plus"></i> {% trans %}New Thread{% endtrans %}</a>
-    {% elif not user.is_authenticated() and not user.is_crawler() %}
-    <p class="lead threads-signin-message"><a href="{% url 'sign_in' %}">{% trans %}Sign in or register to start threads.{% endtrans %}</a></p>
+    <a href="{% url 'announcement_start' %}" class="btn btn-inverse pull-right"><i class="icon-plus"></i> {% trans %}Make Announcement{% endtrans %}</a>
     {% endif %}
   </div>
 
@@ -180,9 +178,9 @@
 <div class="pagination pull-left">
   <ul>
     <li class="count">{{ macros.pager_label(pagination) }}</li>
-    {%- if pagination['prev'] > 1 %}<li><a href="{% url 'forum' slug=forum.slug, forum=forum.id %}" class="tooltip-top" title="{% trans %}First Page{% endtrans %}"><i class="icon-chevron-left"></i> {% trans %}First{% endtrans %}</a></li>{% endif -%}
-    {%- if pagination['prev'] > 0 %}<li><a href="{%- if pagination['prev'] > 1 %}{% url 'forum' slug=forum.slug, forum=forum.id, page=pagination['prev'] %}{% else %}{% url 'forum' slug=forum.slug, forum=forum.id %}{% endif %}" class="tooltip-top" title="{% trans %}Newest Threads{% endtrans %}"><i class="icon-chevron-left"></i></a></li>{% endif -%}
-    {%- if pagination['next'] > 0 %}<li><a href="{% url 'forum' slug=forum.slug, forum=forum.id, page=pagination['next'] %}" class="tooltip-top" title="{% trans %}Older Threads{% endtrans %}"><i class="icon-chevron-right"></i></a></li>{% endif -%}
+    {%- if pagination['prev'] > 1 %}<li><a href="{% url 'announcements' %}" class="tooltip-top" title="{% trans %}First Page{% endtrans %}"><i class="icon-chevron-left"></i> {% trans %}First{% endtrans %}</a></li>{% endif -%}
+    {%- if pagination['prev'] > 0 %}<li><a href="{%- if pagination['prev'] > 1 %}{% url 'announcements' page=pagination['prev'] %}{% else %}{% url 'announcements' %}{% endif %}" class="tooltip-top" title="{% trans %}Newest Threads{% endtrans %}"><i class="icon-chevron-left"></i></a></li>{% endif -%}
+    {%- if pagination['next'] > 0 %}<li><a href="{% url 'announcements' page=pagination['next'] %}" class="tooltip-top" title="{% trans %}Older Threads{% endtrans %}"><i class="icon-chevron-right"></i></a></li>{% endif -%}
   </ul>
 </div>
 {% endif %}

+ 124 - 0
templates/cranefly/announcements/posting.html

@@ -0,0 +1,124 @@
+{% extends "cranefly/layout.html" %}
+{% import "_forms.html" as form_theme with context %}
+{% import "cranefly/editor.html" as editor with context %}
+{% import "cranefly/macros.html" as macros with context %}
+
+{% block title %}{% if thread -%}
+{{ macros.page_title(title=_(get_title()), parent=thread.name) }}
+{%- else -%}
+{{ macros.page_title(title=_(get_title()), parent=_('Global Announcements')) }}
+{%- endif %}{% endblock %}
+
+{% block breadcrumb %}{{ super() }} <span class="divider"><i class="icon-chevron-right"></i></span></li>
+<li><a href="{% url 'announcements' %}">{% trans %}Global Announcements{% endtrans %}</a> <span class="divider"><i class="icon-chevron-right"></i></span></li>
+{% if thread %}<li><a href="{% url 'announcement' thread=thread.pk, slug=thread.slug %}">{{ thread.name }}</a> <span class="divider"><i class="icon-chevron-right"></i></span></li>{% endif %}
+<li class="active">{{ get_title() }}
+{%- endblock %}
+
+{% block container %}
+<div class="page-header header-primary">
+  <div class="container">
+    {{ messages_list(messages) }}
+    <ul class="breadcrumb">
+      {{ self.breadcrumb() }}</li>
+    </ul>
+    <h1>{{ get_title() }} <small>{% if thread %}{{ thread.name }}{% else %}{% trans %}Global Announcements{% endtrans %}{% endif %}</small></h1>
+  </div>
+</div>
+<div class="container container-primary">
+  <div class="row">
+    <div class="span8 offset2">
+      <div class="posting">
+        <div class="form-container">
+
+          <div class="form-header">
+            <h1>{{ get_title() }}</h1>
+          </div>
+
+          {% if message %}
+          <div class="messages-list">
+            {{ macros.draw_message(message) }}
+          </div>
+          {% endif %}
+
+          {% if preview %}
+          <div class="form-preview">
+            <div class="markdown js-extra">
+              {{ preview|markdown_final|safe }}
+            </div>
+          </div>
+          {% endif %}
+
+          <form action="{{ get_action() }}" method="post">
+            <input type="hidden" name="{{ csrf_id }}" value="{{ csrf_token }}">
+            {% if 'thread_name' in form.fields %}
+            {{ form_theme.row_widget(form.fields.thread_name, width=8) }}
+            <hr>
+            <h4>Message Body</h4>
+            {% endif %}
+            {{ editor.editor(form.fields.post, get_button(), rows=8, extra=get_extra()) }}
+            {% if intersect(form.fields, ('edit_reason', 'thread_weight', 'close_thread')) %}
+            <hr>
+            {% if 'edit_reason' in form.fields %}
+            {{ form_theme.row_widget(form.fields.edit_reason, width=8) }}
+            {% endif %}
+
+            <div class="form-actions">
+              <button type="submit" class="btn btn-primary">{{ get_button() }}</button>
+              <button id="editor-preview" name="preview" type="submit" class="btn">{% trans %}Preview{% endtrans %}</button>
+            </div>
+            {% endif %}
+          </form>
+
+        </div>
+      </div>
+    </div>
+  </div>
+</div>
+{% endblock %}
+
+{% block stylesheets %}{{ super() }}
+<link href="{{ STATIC_URL }}cranefly/highlight/styles/monokai.css" rel="stylesheet">
+{% endblock %}
+
+{% block javascripts %}{{ super() }}
+  <script src="{{ STATIC_URL }}cranefly/highlight/highlight.pack.js"></script>
+  <script type="text/javascript">
+    hljs.tabReplace = '    ';
+    hljs.initHighlightingOnLoad();
+    EnhancePostsMD();
+  </script>
+  {{ editor.js() }}
+{% endblock %}
+
+
+{% macro get_action() -%}
+{% if action == 'new_thread' -%}
+{% url 'announcement_start' %}
+{%- elif action == 'edit_thread' -%}
+{% url 'announcement_edit' thread=thread.pk, slug=thread.slug %}
+{%- endif %}
+{%- endmacro %}
+
+
+{% macro get_title() -%}
+{% if action == 'new_thread' -%}
+{% trans %}Post New Announcement{% endtrans %}
+{%- elif action == 'edit_thread' -%}
+{% trans %}Edit Announcement{% endtrans %}
+{%- endif %}
+{%- endmacro %}
+
+
+{% macro get_button() -%}
+{% if action == 'new_thread' -%}
+{% trans %}Post Announcement{% endtrans %}
+{%- else -%}
+{% trans %}Save Changes{% endtrans %}
+{%- endif %}
+{%- endmacro %}
+
+
+{% macro get_extra() %}
+  <button id="editor-preview" name="preview" type="submit" class="btn pull-right">{% trans %}Preview{% endtrans %}</button>
+{% endmacro %}