articles.py 4.42 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
7
8
from django import forms

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

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

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

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


22
23
24
25
class ArticleList(ListView):
    model = Article
    paginate_by = 10
    template_name = "rp/article_list_public.html"
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    filter_lang = None

    def get_queryset(self):
        if self.filter_lang in ["EN", "FR"]:
            qs = Article.objects.filter(lang=self.filter_lang)
        else:
            qs = Article.objects.filter()

        return qs.order_by('-created_at')
    #
    # def get_context_data(self, **kwargs):
    #     context = super().get_context_data(**kwargs)
    #     context["filter_lang"] = self.filter_lang
    #     return context
40
41


cynddl's avatar
cynddl committed
42
class ArticleListFlux(UDList):
luxcem's avatar
luxcem committed
43
    model = Article
cynddl's avatar
cynddl committed
44
45
46
47
48
    paginate_by = 10

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

49
50
        if filter_view in ["published", "draft", "rejected"]:
            qs = Article.objects.filter(status=filter_view.upper())
cynddl's avatar
cynddl committed
51
        else:
52
            qs = Article.objects.filter(status="NEW")
cynddl's avatar
cynddl committed
53
54
55
56
57
58

        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")
59
        context["nb_draft"] = Article.objects.filter(status="DRAFT").count()
cynddl's avatar
cynddl committed
60
        return context
61
62
63
64
65
66
67
68
69
70
71
72


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


73
class ArticleEdit(PermissionRequiredMixin, UpdateView):
74
    model = Article
75
76
    permission_required = 'can_edit'

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

80
81
82
83
84
85
86
87
88
89
90
    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)

91
92
93
94
95
    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
96
97
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
98
        elif "publish" in self.request.POST:
99
            self.object.publish()
100
            self.object.save()
101
102
103
104
105
106
107
108
109
110

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

115
116
117
118
119
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
120
121
122
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
            '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