articles.py 3.3 KB
Newer Older
1
2
3
from django.http import HttpResponseRedirect
from django.views.generic.detail import DetailView
from django.views.generic.edit import UpdateView
4
from django.utils.translation import ugettext_lazy as _
cynddl's avatar
cynddl committed
5
from django.urls import reverse, reverse_lazy
6
7
8
from django import forms

from crispy_forms.helper import FormHelper
cynddl's avatar
cynddl committed
9
from crispy_forms.layout import Layout, Field, Div, HTML
10
11
from crispy_forms.bootstrap import AppendedText

cynddl's avatar
cynddl committed
12
13
from taggit.models import Tag
from rp.forms import TagMultipleChoiceField
14

luxcem's avatar
luxcem committed
15
16
17
18
from rp.models import Article
from .votes import UDList


cynddl's avatar
cynddl committed
19
class ArticleListFlux(UDList):
luxcem's avatar
luxcem committed
20
    model = Article
cynddl's avatar
cynddl committed
21
22
23
24
25
    paginate_by = 10

    def get_queryset(self):
        filter_view = self.kwargs.get("filter_view", "draft")

26
27
        if filter_view in ["published", "draft", "rejected"]:
            qs = Article.objects.filter(status=filter_view.upper())
cynddl's avatar
cynddl committed
28
        else:
29
            qs = Article.objects.filter(status="NEW")
cynddl's avatar
cynddl committed
30
31
32
33
34
35

        return qs.order_by('-created_at')

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["filter_view"] = self.kwargs.get("filter_view", "draft")
36
        context["nb_draft"] = Article.objects.filter(status="DRAFT").count()
cynddl's avatar
cynddl committed
37
        return context
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52


class ArticleDetailView(DetailView):
    model = Article
    preview = False

    def get_context_data(self, **kwargs):
        context = super(ArticleDetailView, self).get_context_data(**kwargs)
        context['is_preview'] = self.preview
        return context


class ArticleEdit(UpdateView):
    model = Article
    fields = ['screenshot', 'url', 'lang', 'title', 'tags', 'extracts']
cynddl's avatar
cynddl committed
53
    success_url = reverse_lazy("rp:article-list")
54
55
56
57
58
59

    def form_valid(self, form):
        self.object = form.save()

        if "preview" in self.request.POST:
            self.success_url = reverse("rp:article-preview", args=[self.object.id])
cynddl's avatar
cynddl committed
60
61
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
62
        elif "publish" in self.request.POST:
63
            self.object.publish()
64
65
66
67
68
69
70
71
72
73

        return HttpResponseRedirect(self.get_success_url())

    def get_form(self, form_class=None):
        form = super().get_form(form_class)
        form.fields["screenshot"].widget = forms.widgets.FileInput()

        form.helper = FormHelper()
        form.helper.form_tag = False

cynddl's avatar
cynddl committed
74
75
        # Change the layout of the tags field
        form.fields["tags"] = TagMultipleChoiceField(
76
            queryset=Tag.objects.all(), required=False)
cynddl's avatar
cynddl committed
77

78
79
80
81
82
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
83
84
85
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
            'tags',
            'extracts',
            css_class="col-sm-8")

        right_layout = Div(
            'screenshot',
            HTML(
                """
                {% if form.screenshot.value %}
                <img class="img-responsive mb-4"
                     src="/media/{{ form.screenshot.value }}">
                {% endif %}
                """
            ),
            css_class="col-sm-4")

        form.helper.layout = Layout(
            Div(left_layout, right_layout, css_class="row"))

        return form