diff --git a/links/admin.py b/links/admin.py index 8c38f3f..f5cd01d 100644 --- a/links/admin.py +++ b/links/admin.py @@ -1,3 +1,16 @@ from django.contrib import admin -# Register your models here. +from .models import Category, Link + + +@admin.register(Category) +class CategoryAdmin(admin.ModelAdmin): + list_display = ["title", "slug", "parent"] + prepopulated_fields = {"slug": ("title",)} + + +@admin.register(Link) +class LinkAdmin(admin.ModelAdmin): + list_display = ["title", "website", "category", "is_published", "followed"] + list_filter = ["category", "is_published"] + ordering = ["title"] diff --git a/links/models.py b/links/models.py index 71a8362..64bf863 100644 --- a/links/models.py +++ b/links/models.py @@ -1,3 +1,46 @@ from django.db import models +from django.urls import reverse_lazy +from django.utils.text import slugify -# Create your models here. + +class Category(models.Model): + title = models.CharField(max_length=40, unique=True) + slug = models.SlugField(max_length=40, unique=True) + introduction = models.TextField(blank=True, null=True) + parent = models.ForeignKey( + "self", blank=True, null=True, on_delete=models.CASCADE, related_name="children" + ) + + def save( + self, force_insert=False, force_update=False, using=None, update_fields=None + ): + if not self.slug: + self.slug = slugify(self.title) + return super(Category, self).save() + + def get_absolute_url(self): + return reverse_lazy("links:list_category", args=["self.slug"]) + + def __str__(self): + return self.title + + class Meta: + ordering = ["title"] + + +class Link(models.Model): + title = models.CharField(max_length=200, unique=True) + website = models.URLField(unique=True) + introduction = models.TextField(blank=True, null=True) + category = models.ForeignKey( + Category, on_delete=models.PROTECT, related_name="links" + ) + followed = models.PositiveIntegerField(default=0) + created = models.DateTimeField(auto_now_add=True) + is_published = models.BooleanField(default=False) + + def __str__(self): + return self.title + + class Meta: + ordering = ["category", "title"] diff --git a/links/urls.py b/links/urls.py new file mode 100644 index 0000000..1cb9871 --- /dev/null +++ b/links/urls.py @@ -0,0 +1,11 @@ +from django.urls import path + +from . import views + +app_name = "links" + +urlpatterns = [ + path("", views.LinkList.as_view(), name="list"), + path("categories//", views.LinkList.as_view(), name="list_category"), + path("launch/", views.LinkRedirectView.as_view(), name="open_link"), +] diff --git a/links/views.py b/links/views.py index 91ea44a..e8bbd50 100644 --- a/links/views.py +++ b/links/views.py @@ -1,3 +1,33 @@ -from django.shortcuts import render +from django.db.models import Prefetch +from django.shortcuts import get_object_or_404 +from django.views.generic import ListView, RedirectView -# Create your views here. +from .models import Category, Link + + +class CategoryList(ListView): + model = Category + + +class LinkList(ListView): + template_name = "links/link_list.html" + paginate_by = 6 + + def get_queryset(self): + category_group = self.kwargs.get("category", None) + if category_group: + queryset = Category.objects.filter(slug=category_group) + else: + queryset = Category.objects.filter(parent=None) + return queryset.prefetch_related( + Prefetch("links", queryset=Link.objects.filter(is_published=True)) + ) + + +class LinkRedirectView(RedirectView): + + def get_redirect_url(self, *args, **kwargs): + url = get_object_or_404(Link, title=kwargs["title"]) + url.followed += 1 + url.save() + return url.website