articles.py 3.66 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
26
27
28
    paginate_by = 10

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

        if filter_view == "published":
            qs = Article.objects.filter(status="PUBLISHED")
        elif filter_view == "draft":
cynddl's avatar
cynddl committed
29
            qs = Article.objects.extra(where=[
30
                "(und_score_up + und_score_down >= 3) or priority",
cynddl's avatar
cynddl committed
31
32
                "status='PENDING'"
            ])
luxcem's avatar
luxcem committed
33
34
        elif filter_view == "rejected":
            qs = Article.objects.filter(status="REJECTED")
cynddl's avatar
cynddl committed
35
36
37
38
39
40
41
42
        else:
            qs = Article.objects.filter(status="PENDING")

        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")
cynddl's avatar
cynddl committed
43
        context["nb_draft"] = Article.objects.extra(where=[
44
            "(und_score_up + und_score_down >= 3) or priority",
cynddl's avatar
cynddl committed
45
46
            "status='PENDING'"
        ]).count()
cynddl's avatar
cynddl committed
47
        return context
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62


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
63
    success_url = reverse_lazy("rp:article-list")
64
65
66
67
68
69

    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
70
71
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
72
        elif "publish" in self.request.POST:
73
            self.object.publish()
74
75
76
77
78
79
80
81
82
83

        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
84
85
        # Change the layout of the tags field
        form.fields["tags"] = TagMultipleChoiceField(
86
            queryset=Tag.objects.all(), required=False)
cynddl's avatar
cynddl committed
87

88
89
90
91
92
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
93
94
95
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
            '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