78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
from django.contrib.auth.decorators import login_required
|
|
from django.shortcuts import get_object_or_404
|
|
from django.urls import reverse_lazy
|
|
from django.utils.decorators import method_decorator
|
|
from django.views.generic import (CreateView, DetailView, ListView,
|
|
RedirectView, UpdateView)
|
|
|
|
from .models import Category, NewsItem
|
|
|
|
|
|
class CategoryList(ListView):
|
|
model = Category
|
|
|
|
|
|
@method_decorator(login_required, name="dispatch")
|
|
class NewsItemCreate(CreateView):
|
|
model = NewsItem
|
|
fields = [
|
|
"title",
|
|
"category",
|
|
"body",
|
|
"origin_text",
|
|
"origin_link",
|
|
"header_img",
|
|
"tags",
|
|
"is_published",
|
|
"is_featured",
|
|
]
|
|
success_url = reverse_lazy("dashboard:dashboard")
|
|
|
|
def form_valid(self, form):
|
|
form.instance.owner = self.request.user
|
|
return super().form_valid(form)
|
|
|
|
|
|
class NewsItemDetail(DetailView):
|
|
model = NewsItem
|
|
|
|
|
|
class NewsItemList(ListView):
|
|
category = None
|
|
tag = None
|
|
paginate_by = 6
|
|
|
|
def get_queryset(self):
|
|
category_slug = self.kwargs.get("category", None)
|
|
self.tag = self.kwargs.get("tag", None)
|
|
if category_slug:
|
|
self.category = get_object_or_404(Category, slug=category_slug)
|
|
return NewsItem.objects.filter(category=self.category).filter(
|
|
is_published=True
|
|
)
|
|
elif self.tag:
|
|
return NewsItem.objects.filter(tags=self.tag).filter(is_published=True)
|
|
else:
|
|
return NewsItem.objects.filter(is_published=True)
|
|
|
|
def get_context_data(self, *, object_list=None, **kwargs):
|
|
context = super(NewsItemList, self).get_context_data(**kwargs)
|
|
context["category"] = self.category
|
|
context["tag"] = self.tag
|
|
return context
|
|
|
|
|
|
class NewsItemRedirectView(RedirectView):
|
|
def get_redirect_url(self, *args, **kwargs):
|
|
url = get_object_or_404(NewsItem, origin_text=kwargs["origin_text"])
|
|
url.origin_times_followed += 1
|
|
url.save()
|
|
return url.origin_link
|
|
|
|
|
|
class TagList(ListView):
|
|
template_name = "news/tag_list.html"
|
|
|
|
def get_queryset(self):
|
|
return NewsItem.tags.tag_model.objects.all()
|