from django.http import HttpResponseRedirect
from django.views.generic.detail import DetailView
from django.views.generic.list import ListView
from django.views.generic.edit import UpdateView
from django.utils.translation import ugettext_lazy as _
from django.urls import reverse, reverse_lazy
from django.db.models import Count
from django import forms
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, Field, Div, HTML
from crispy_forms.bootstrap import AppendedText
from taggit.models import Tag
from rp.forms import TagMultipleChoiceField
from rp.models import Article
from .votes import UDList
class ArticleList(ListView):
model = Article
paginate_by = 10
template_name = "rp/article_list_public.html"
filter_lang = None
filter_tag = None
def get_queryset(self):
if self.filter_lang in ["EN", "FR"]:
qs = Article.objects.filter(lang=self.filter_lang)
else:
qs = Article.objects.filter()
if self.request.GET.get('q', '') != '':
qs = qs.filter(title__contains=self.request.GET.get('q', ''))
filter_tag = self.kwargs.get("filter_tag", self.filter_tag)
if filter_tag is not None:
qs = qs.filter(tags__name__in=[filter_tag])
return qs.order_by('-created_at')
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
context["search"] = self.request.GET.get("q", '')
return context
class ArticleListFlux(UDList):
model = Article
paginate_by = 10
def get_queryset(self):
filter_view = self.kwargs.get("filter_view", "draft")
if filter_view in ["published", "draft", "rejected"]:
qs = Article.objects.filter(status=filter_view.upper())
else:
qs = Article.objects.filter(status="NEW")
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")
context["nb_draft"] = Article.objects.filter(status="DRAFT").count()
return context
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(PermissionRequiredMixin, UpdateView):
model = Article
permission_required = 'can_edit'
fields = ['screenshot', 'url', 'lang', 'title', 'tags', 'extracts']
success_url = reverse_lazy("rp:article-list")
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)
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])
elif "view" in self.request.POST:
self.success_url = reverse("rp:article-view", args=[self.object.id])
elif "publish" in self.request.POST:
self.object.publish()
self.object.save()
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
# Change the layout of the tags field
form.fields["tags"] = TagMultipleChoiceField(
queryset=Tag.objects.all(), required=False)
left_layout = Div(
Div(
Field('title', wrapper_class='col-sm-10'),
Field('lang', wrapper_class='col-sm-2'),
css_class="row"),
AppendedText(
'url',
_('Go to link') % form.initial['url']),
'tags',
'extracts',
css_class="col-sm-8")
right_layout = Div(
'screenshot',
HTML(
"""
{% if form.screenshot.value %}
{% endif %}
"""
),
css_class="col-sm-4")
form.helper.layout = Layout(
Div(left_layout, right_layout, css_class="row"))
return form