articles.py 3.99 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
26
27
28

class ArticleList(ListView):
    model = Article
    paginate_by = 10
    template_name = "rp/article_list_public.html"


cynddl's avatar
cynddl committed
29
class ArticleListFlux(UDList):
luxcem's avatar
luxcem committed
30
    model = Article
cynddl's avatar
cynddl committed
31
32
33
34
35
    paginate_by = 10

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

36
37
        if filter_view in ["published", "draft", "rejected"]:
            qs = Article.objects.filter(status=filter_view.upper())
cynddl's avatar
cynddl committed
38
        else:
39
            qs = Article.objects.filter(status="NEW")
cynddl's avatar
cynddl committed
40
41
42
43
44
45

        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")
46
        context["nb_draft"] = Article.objects.filter(status="DRAFT").count()
cynddl's avatar
cynddl committed
47
        return context
48
49
50
51
52
53
54
55
56
57
58
59


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


60
class ArticleEdit(PermissionRequiredMixin, UpdateView):
61
    model = Article
62
63
    permission_required = 'can_edit'

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

67
68
69
70
71
72
73
74
75
76
77
    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)

78
79
80
81
82
    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
83
84
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
85
        elif "publish" in self.request.POST:
86
            self.object.publish()
87
            self.object.save()
88
89
90
91
92
93
94
95
96
97

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

102
103
104
105
106
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
107
108
109
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
            '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