articles.py 5.2 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 24
from rp.models import Article
from .votes import UDList


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

cynddl's avatar
cynddl committed
31 32
    filter_tag = None

33 34 35 36 37 38
    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
39 40 41 42
        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
43

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

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

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

        return context
59 60


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

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

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

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


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


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

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

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

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

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

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

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