articles.py 3.66 KB
Newer Older
1 2 3
from django.http import HttpResponseRedirect
from django.views.generic.detail import DetailView
from django.views.generic.edit import UpdateView
4
from django.utils.translation import ugettext_lazy as _
cynddl's avatar
cynddl committed
5
from django.urls import reverse, reverse_lazy
6 7 8
from django import forms

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

cynddl's avatar
cynddl committed
12 13
from taggit.models import Tag
from rp.forms import TagMultipleChoiceField
14

luxcem's avatar
luxcem committed
15 16 17 18
from rp.models import Article
from .votes import UDList


cynddl's avatar
cynddl committed
19
class ArticleListFlux(UDList):
luxcem's avatar
luxcem committed
20
    model = Article
cynddl's avatar
cynddl committed
21 22 23 24 25 26 27 28
    paginate_by = 10

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

        if filter_view == "published":
            qs = Article.objects.filter(status="PUBLISHED")
        elif filter_view == "draft":
cynddl's avatar
cynddl committed
29
            qs = Article.objects.extra(where=[
30
                "(und_score_up + und_score_down >= 3) or priority",
cynddl's avatar
cynddl committed
31 32
                "status='PENDING'"
            ])
luxcem's avatar
luxcem committed
33 34
        elif filter_view == "rejected":
            qs = Article.objects.filter(status="REJECTED")
cynddl's avatar
cynddl committed
35 36 37 38 39 40 41 42
        else:
            qs = Article.objects.filter(status="PENDING")

        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")
cynddl's avatar
cynddl committed
43
        context["nb_draft"] = Article.objects.extra(where=[
44
            "(und_score_up + und_score_down >= 3) or priority",
cynddl's avatar
cynddl committed
45 46
            "status='PENDING'"
        ]).count()
cynddl's avatar
cynddl committed
47
        return context
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62


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


class ArticleEdit(UpdateView):
    model = Article
    fields = ['screenshot', 'url', 'lang', 'title', 'tags', 'extracts']
cynddl's avatar
cynddl committed
63
    success_url = reverse_lazy("rp:article-list")
64 65 66 67 68 69

    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
70 71
        elif "view" in self.request.POST:
            self.success_url = reverse("rp:article-view", args=[self.object.id])
72
        elif "publish" in self.request.POST:
73
            self.object.publish()
74 75 76 77 78 79 80 81 82 83

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

88 89 90 91 92
        left_layout = Div(
            Div(
                Field('title', wrapper_class='col-sm-10'),
                Field('lang', wrapper_class='col-sm-2'),
                css_class="row"),
93 94 95
            AppendedText(
                'url',
                _('<a href="%s">Go to link</a>') % form.initial['url']),
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
            '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