PK!H..mb_drf_article/__init__.py"""Article init.""" __version__ = '0.1.0' PK!S#mb_drf_article/admin.py"""Article admin.""" from django.contrib import admin from .models import Article, Category # Register your models here. admin.site.register(Article) admin.site.register(Category) PK!eemb_drf_article/apps.pyfrom django.apps import AppConfig class ArticleConfig(AppConfig): name = 'mb_drf_article' PK!%mb_drf_article/migrations/__init__.pyPK!rmb_drf_article/models.py"""Articles models.""" from django.db import models from django.template.defaultfilters import slugify # Create your models here. class Category(models.Model): """Category class.""" name = models.CharField(max_length=50) parent = models.ForeignKey('self', on_delete=models.CASCADE) def __str__(self): """Category print.""" return self.name class Meta: """Category meta.""" verbose_name_plural = "categories" class Article(models.Model): """Article class.""" title = models.CharField(max_length=50, unique=True) slug_title = models.SlugField(unique=True) tldr = models.CharField(max_length=80) content = models.TextField() image = models.ImageField(upload_to='article_header') created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) categories = models.ManyToManyField(to=Category) def __str__(self): """Representation.""" return self.title def save(self, *args, **kwargs): """Slugify the title before save.""" self.slug_title = slugify(self.title) super(Article, self).save(*args, **kwargs) PK!Cmmb_drf_article/permissions.py"""Article permissions.""" from rest_framework.permissions import IsAdminUser, SAFE_METHODS class IsAdminUserOrReadOnly(IsAdminUser): """From https://stackoverflow.com. slug title: django-rest-framework-permission-isadminorreadonly """ def has_permission(self, request, view): """Permission method.""" is_admin = super().has_permission(request, view) return request.method in SAFE_METHODS or is_admin PK!!?mb_drf_article/serializers.py"""Article serializer.""" from rest_framework import serializers from .models import Article # , Category class ArticleSerializer(serializers.ModelSerializer): """Serializer.""" class Meta: """Article meta serializer.""" model = Article fields = ('id', 'title', 'tldr', 'content', 'image', 'created_at', 'updated_at', 'slug_title') read_only_fields = ('id', 'created_at', 'updated_at', 'slug_title') lookup_field = 'slug_title' PK!B??mb_drf_article/tests.pyfrom django.test import TestCase # Create your tests here. PK!4-55mb_drf_article/urls.py"""Articles urls.""" from django.urls import path from rest_framework.urlpatterns import format_suffix_patterns from . import views urlpatterns = [ path('', views.ArticleList.as_view()), path('', views.ArticleDetail.as_view()), ] urlpatterns = format_suffix_patterns(urlpatterns) PK!mb_drf_article/views.py"""Article views.""" from rest_framework import generics from .serializers import ArticleSerializer from .permissions import IsAdminUserOrReadOnly from .models import Article class ArticleList(generics.ListCreateAPIView): """Article list view.""" queryset = Article.objects.all().order_by('-created_at') serializer_class = ArticleSerializer permission_classes = (IsAdminUserOrReadOnly,) class ArticleDetail(generics.RetrieveUpdateDestroyAPIView): """Article detail view.""" queryset = Article.objects.all() serializer_class = ArticleSerializer permission_classes = (IsAdminUserOrReadOnly,) lookup_field = ('slug_title') PK!HڽTU$mb_drf_article-0.1.2.dist-info/WHEEL A н#Z;/"d&F[xzw@Zpy3Fv]\fi4WZ^EgM_-]#0(q7PK!H߾D'mb_drf_article-0.1.2.dist-info/METADATAUQo6~8Jn+u;Q%,e6 6-6H*PhٮkSxw<^s X7V(=%70'5'zJHZ%3uJU5,&*pKte)R%5["9m^o)ܪ\pwԒD\Z_3S-a`++R"C^2w6jyץzUdF5xNw~Kߐ5V,( %x=dTWgcP:. ^@\˜obڬcK.4sv+/ïд: AzAO0xə׹~I%a' J&{QDljgj$}KVdꦇ/ɾz)$]HY{lh9Ufgr_FϘmMM G7Ӌ$N SNS Q 7Z,gZ1``w[SPK!HyԴb%mb_drf_article-0.1.2.dist-info/RECORDr@}9*Y HW?bNUn¤KC(0D p.Kp&2!+' cBFmW!RG˿AԨyD笓JƐgger/*97ԬH+ۖ:`meڦM٦d/Ǩi]k>E|\&cSKA-gFYztigWbz#9M ռ`u }I`z.ۏ]:5^#ͭٵcuXL![տf.F54ѵ.E}4\P `__ aG1kZuomCCuq =+ُ nrzqу ґ10ܙg$  q mgR!xYo3@9XR>7