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

10
11
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin

12
from crispy_forms.helper import FormHelper
cynddl's avatar
cynddl committed
13
from crispy_forms.layout import Layout, Field, Div, HTML
14
15
from crispy_forms.bootstrap import AppendedText

cynddl's avatar
cynddl committed
16
17
from taggit.models import Tag
from rp.forms import TagMultipleChoiceField
18

luxcem's avatar
luxcem committed
19
20
21
22
from rp.models import Article
from .votes import UDList


23
24
25
26
class ArticleList(ListView):
    model = Article
    paginate_by = 10
    template_name = "rp/article_list_public.html"
27
28
    filter_lang = None

cynddl's avatar
cynddl committed
29
30
    filter_tag = None

31
32
33
34
35
36
    def get_queryset(self):
        if self.filter_lang in ["EN", "FR"]:
            qs = Article.objects.filter(lang=self.filter_lang)
        else:
            qs = Article.objects.filter()

cynddl's avatar
cynddl committed
37
38
39
40
        filter_tag = self.kwargs.get("filter_tag", self.filter_tag)
        if filter_tag is not None:
            qs = qs.filter(tags__name__in=[filter_tag])

41
        return qs.order_by('-created_at')
cynddl's avatar
cynddl committed
42
43
44
45
46
47
48
49
50

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)

        qs = Tag.objects.annotate(num_times=Count('taggit_taggeditem_items')).all()
        qs = qs.order_by('-num_times')
        context["tags"] = qs

        return context
51
52


cynddl's avatar
cynddl committed
53
class ArticleListFlux(UDList):
luxcem's avatar
luxcem committed
54
    model = Article
cynddl's avatar
cynddl committed
55
56
57
58
59
    paginate_by = 10

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

60
61
        if filter_view in ["published", "draft", "rejected"]:
            qs = Article.objects.filter(status=filter_view.upper())
cynddl's avatar
cynddl committed
62
        else:
63
            qs = Article.objects.filter(status="NEW")
cynddl's avatar
cynddl committed
64
65
66
67
68
69

        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")
70
        context["nb_draft"] = Article.objects.filter(status="DRAFT").count()
cynddl's avatar
cynddl committed
71
        return context
72
73
74
75
76
77
78
79
80
81
82
83


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


84
class ArticleEdit(PermissionRequiredMixin, UpdateView):
85
    model = Article
86
87
    permission_required = 'can_edit'

88
    fields = ['screenshot', 'url', 'lang', 'title', 'tags', 'extracts']
cynddl's avatar
cynddl committed
89
    success_url = reverse_lazy("rp:article-list")
90

91
92
93
94
95
96
97
98
99
100
101
    def get(self, request, **kwargs):
        self.object = self.get_object()

        if 'fetch_content' in self.request.GET:
            self.object.fetch_content()
        elif 'fetch_image' in self.request.GET:
            self.object.fetch_image()

        context = self.get_context_data(object=self.object)
        return self.render_to_response(context)

102
103
104
105
106
    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
107
108
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
109
        elif "publish" in self.request.POST:
110
            self.object.publish()
111
            self.object.save()
112
113
114
115
116
117
118
119
120
121

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

126
127
128
129
130
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
131
132
133
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
            '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