articles.py 5.18 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
Thibaut Broggi's avatar
Thibaut Broggi committed
8
from django.db.models import Q
9 10
from django import forms

11 12
from django.contrib.auth.mixins import (LoginRequiredMixin,
                                        PermissionRequiredMixin)
13

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

cynddl's avatar
cynddl committed
18 19
from taggit.models import Tag
from rp.forms import TagMultipleChoiceField
20

luxcem's avatar
luxcem committed
21 22 23
from rp.models import Article


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

cynddl's avatar
cynddl committed
30 31
    filter_tag = None

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

Thibaut Broggi's avatar
Thibaut Broggi committed
38 39 40 41
        search_keywords = self.request.GET.get('q', '')
        if search_keywords != '':
            qs = qs.filter(Q(title__icontains=search_keywords)
                           | Q(extracts__icontains=search_keywords))
Thibaut Broggi's avatar
Thibaut Broggi committed
42

cynddl's avatar
cynddl committed
43 44 45 46
        filter_tag = self.kwargs.get("filter_tag", self.filter_tag)
        if filter_tag is not None:
            qs = qs.filter(tags__name__in=[filter_tag])

47
        return qs.order_by('-created_at')
cynddl's avatar
cynddl committed
48 49 50 51 52 53 54

    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
55
        context["search"] = self.request.GET.get('q', '')
cynddl's avatar
cynddl committed
56 57

        return context
58 59


60
class ArticleListFlux(LoginRequiredMixin, ListView):
luxcem's avatar
luxcem committed
61
    model = Article
cynddl's avatar
cynddl committed
62 63 64 65 66
    paginate_by = 10

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

67 68
        if filter_view in ["published", "draft", "rejected"]:
            qs = Article.objects.filter(status=filter_view.upper())
cynddl's avatar
cynddl committed
69
        else:
70
            qs = Article.objects.filter(status="NEW")
cynddl's avatar
cynddl committed
71 72 73 74 75 76

        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")
77
        context["nb_draft"] = Article.objects.filter(status="DRAFT").count()
cynddl's avatar
cynddl committed
78
        return context
79 80


81
class ArticleDetailView(LoginRequiredMixin, DetailView):
82 83 84 85 86 87 88 89 90
    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


91
class ArticleEdit(PermissionRequiredMixin, UpdateView):
92
    model = Article
93
    permission_required = 'rp.can_edit'
94

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

98 99 100 101 102 103 104
    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()
105 106
        elif 'fetch_metadata' in self.request.GET:
            self.object.fetch_metadata()
107 108 109 110

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

111 112 113 114 115
    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
116 117
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
118
        elif "publish" in self.request.POST:
119
            self.object.publish()
120
            self.object.save()
121 122 123 124 125 126 127 128 129 130

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

135 136 137 138 139
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
140 141 142
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
            '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