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