views.py 7.44 KB
Newer Older
Skia's avatar
Skia committed
1 2 3
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView, RedirectView
from django.views.generic.edit import UpdateView, CreateView, DeleteView
Skia's avatar
Skia committed
4
from django.views.generic.detail import SingleObjectMixin
Skia's avatar
Skia committed
5 6 7 8 9
from django.utils.translation import ugettext_lazy as _
from django.core.urlresolvers import reverse, reverse_lazy
from django.utils import timezone
from django.conf import settings
from django import forms
Skia's avatar
Skia committed
10
from django.db import models
Skia's avatar
Skia committed
11 12
from django.core.exceptions import PermissionDenied

Skia's avatar
Skia committed
13 14
from math import inf

15
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin, TabedViewMixin
Skia's avatar
Skia committed
16
from forum.models import Forum, ForumMessage, ForumTopic, ForumMessageMeta
Skia's avatar
Skia committed
17

Skia's avatar
Skia committed
18
class ForumMainView(ListView):
Skia's avatar
Skia committed
19 20 21
    queryset = Forum.objects.filter(parent=None)
    template_name = "forum/main.jinja"

Skia's avatar
Skia committed
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
class ForumMarkAllAsRead(RedirectView):
    permanent = False
    url = reverse_lazy('forum:last_unread')

    def get(self, request, *args, **kwargs):
        try:
            fi = request.user.forum_infos
            fi.last_read_date = timezone.now()
            fi.save()
        except: pass
        return super(ForumMarkAllAsRead, self).get(request, *args, **kwargs)

class ForumLastUnread(ListView):
    model = ForumTopic
    template_name = "forum/last_unread.jinja"

    def get_queryset(self):
        l = ForumMessage.objects.exclude(readers=self.request.user).filter(
                date__gt=self.request.user.forum_infos.last_read_date).values_list('topic') # TODO try to do better
Skia's avatar
Skia committed
41
        return self.model.objects.filter(id__in=l).annotate(models.Max('messages__date')).order_by('-messages__date__max').select_related('author')
Skia's avatar
Skia committed
42

43
class ForumCreateView(CanCreateMixin, CreateView):
Skia's avatar
Skia committed
44
    model = Forum
45
    fields = ['name', 'parent', 'owner_club', 'is_category', 'edit_groups', 'view_groups']
Skia's avatar
Skia committed
46 47 48 49
    template_name = "core/create.jinja"

    def get_initial(self):
        init = super(ForumCreateView, self).get_initial()
Skia's avatar
Skia committed
50 51 52
        try:
            parent = Forum.objects.filter(id=self.request.GET['parent']).first()
            init['parent'] = parent
53
            init['owner_club'] = parent.owner_club
Skia's avatar
Skia committed
54
        except: pass
Skia's avatar
Skia committed
55 56
        return init

57 58 59 60 61 62
class ForumEditForm(forms.ModelForm):
    class Meta:
        model = Forum
        fields = ['name', 'parent', 'owner_club', 'is_category', 'edit_groups', 'view_groups']
    recursive = forms.BooleanField(label=_("Apply rights and club owner recursively"), required=False)

63
class ForumEditView(CanEditPropMixin, UpdateView):
Skia's avatar
Skia committed
64 65
    model = Forum
    pk_url_kwarg = "forum_id"
66
    form_class = ForumEditForm
Skia's avatar
Skia committed
67 68 69
    template_name = "core/edit.jinja"
    success_url = reverse_lazy('forum:main')

70 71 72 73 74 75 76 77 78 79 80 81
    def form_valid(self, form):
        ret = super(ForumEditView, self).form_valid(form)
        if form.cleaned_data['recursive']:
            self.object.apply_rights_recursively()
        return ret

class ForumDeleteView(CanEditPropMixin, DeleteView):
    model = Forum
    pk_url_kwarg = "forum_id"
    template_name = "core/delete_confirm.jinja"
    success_url = reverse_lazy('forum:main')

82
class ForumDetailView(CanViewMixin, DetailView):
Skia's avatar
Skia committed
83 84 85 86
    model = Forum
    template_name = "forum/forum.jinja"
    pk_url_kwarg = "forum_id"

Skia's avatar
Skia committed
87 88 89 90 91
    def get_context_data(self, **kwargs):
        kwargs = super(ForumDetailView, self).get_context_data(**kwargs)
        kwargs['topics'] = self.object.topics.annotate(models.Max('messages__date')).order_by('-messages__date__max')
        return kwargs

92
class ForumTopicCreateView(CanCreateMixin, CreateView):
Skia's avatar
Skia committed
93 94
    model = ForumMessage
    fields = ['title', 'message']
Skia's avatar
Skia committed
95 96 97 98 99 100 101 102 103
    template_name = "core/create.jinja"

    def dispatch(self, request, *args, **kwargs):
        self.forum = get_object_or_404(Forum, id=self.kwargs['forum_id'], is_category=False)
        if not request.user.can_view(self.forum):
            raise PermissionDenied
        return super(ForumTopicCreateView, self).dispatch(request, *args, **kwargs)

    def form_valid(self, form):
Skia's avatar
Skia committed
104 105 106
        topic = ForumTopic(title=form.instance.title, author=self.request.user, forum=self.forum)
        topic.save()
        form.instance.topic = topic
Skia's avatar
Skia committed
107 108 109
        form.instance.author = self.request.user
        return super(ForumTopicCreateView, self).form_valid(form)

Skia's avatar
Skia committed
110
class ForumTopicEditView(CanEditMixin, UpdateView):
Skia's avatar
Skia committed
111
    model = ForumTopic
Skia's avatar
Skia committed
112
    fields = ['forum']
Skia's avatar
Skia committed
113 114 115
    pk_url_kwarg = "topic_id"
    template_name = "core/edit.jinja"

116
class ForumTopicDetailView(CanViewMixin, DetailView):
Skia's avatar
Skia committed
117 118 119 120
    model = ForumTopic
    pk_url_kwarg = "topic_id"
    template_name = "forum/topic.jinja"
    context_object_name = "topic"
Skia's avatar
Skia committed
121
    queryset = ForumTopic.objects.select_related('forum__parent')
Skia's avatar
Skia committed
122

Skia's avatar
Skia committed
123 124
    def get_context_data(self, **kwargs):
        kwargs = super(ForumTopicDetailView, self).get_context_data(**kwargs)
Skia's avatar
Skia committed
125
        msg = self.object.messages.exclude(readers=self.request.user).filter(date__gte=self.request.user.forum_infos.last_read_date).order_by('id').first()
Skia's avatar
Skia committed
126 127 128
        try:
            kwargs['first_unread_message_id'] = msg.id
        except:
Skia's avatar
Skia committed
129
            kwargs['first_unread_message_id'] = inf
Skia's avatar
Skia committed
130 131
        return kwargs

Skia's avatar
Skia committed
132 133 134 135 136 137
class ForumMessageEditView(CanEditMixin, UpdateView):
    model = ForumMessage
    fields = ['title', 'message']
    template_name = "core/edit.jinja"
    pk_url_kwarg = "message_id"

Skia's avatar
Skia committed
138 139 140 141 142 143 144 145 146 147
    def form_valid(self, form):
        ForumMessageMeta(message=self.object, user=self.request.user, action="EDIT").save()
        return super(ForumMessageEditView, self).form_valid(form)

class ForumMessageDeleteView(SingleObjectMixin, RedirectView):
    model = ForumMessage
    pk_url_kwarg = "message_id"
    permanent = False

    def get_redirect_url(self, *args, **kwargs):
Skia's avatar
Skia committed
148
        self.object = self.get_object()
Skia's avatar
Skia committed
149 150 151 152 153 154 155 156 157 158
        if self.object.can_be_moderated_by(self.request.user):
            ForumMessageMeta(message=self.object, user=self.request.user, action="DELETE").save()
        return self.object.get_absolute_url()

class ForumMessageUndeleteView(SingleObjectMixin, RedirectView):
    model = ForumMessage
    pk_url_kwarg = "message_id"
    permanent = False

    def get_redirect_url(self, *args, **kwargs):
Skia's avatar
Skia committed
159
        self.object = self.get_object()
Skia's avatar
Skia committed
160 161 162 163
        if self.object.can_be_moderated_by(self.request.user):
            ForumMessageMeta(message=self.object, user=self.request.user, action="UNDELETE").save()
        return self.object.get_absolute_url()

164
class ForumMessageCreateView(CanCreateMixin, CreateView):
Skia's avatar
Skia committed
165 166 167 168 169 170 171 172 173 174 175 176 177
    model = ForumMessage
    fields = ['title', 'message']
    template_name = "core/create.jinja"

    def dispatch(self, request, *args, **kwargs):
        self.topic = get_object_or_404(ForumTopic, id=self.kwargs['topic_id'])
        if not request.user.can_view(self.topic):
            raise PermissionDenied
        return super(ForumMessageCreateView, self).dispatch(request, *args, **kwargs)

    def get_initial(self):
        init = super(ForumMessageCreateView, self).get_initial()
        try:
Skia's avatar
Skia committed
178 179 180 181
            message = ForumMessage.objects.select_related('author').filter(id=self.request.GET['quote_id']).first()
            init['message'] = "> ##### %s\n" % (_("%(author)s said") % {'author': message.author.get_short_name()})
            init['message'] += "\n".join([
                "> " + line for line in message.message.split('\n')
Skia's avatar
Skia committed
182
                ])
Skia's avatar
Skia committed
183 184 185
            init['message'] += "\n\n"
        except Exception as e:
            print(repr(e))
Skia's avatar
Skia committed
186 187 188 189 190 191 192
        return init

    def form_valid(self, form):
        form.instance.topic = self.topic
        form.instance.author = self.request.user
        return super(ForumMessageCreateView, self).form_valid(form)

Skia's avatar
Skia committed
193