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