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!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.1.dist-info/WHEEL A н#Z;/"d&F[xzw@Zpy3Fv]\fi4WZ^EgM_-]#0(q7PK!H&B'mb_drf_article-0.1.1.dist-info/METADATAUQo6~8Jn+u;Q%,6 6-6dI*PhnmSxw<^r X++VyXEȌ=FLZ%3uJU5,g&*psten)P%5["9m^o)ܪ\wpw/%ȹf#[nbWWn D257Bmdb7lrsKoȄF5xJvM_5V,(y'%nV zȈ6ݯNI 6˂W2[8kX-.1Jkm_io~ QeN%ul|Qh cx;$x ;û4~ԯNo<2E tFSnnzY6~:r[Z!gw#(3]x=I"ppݧ^>waVkyu=뷅HB:p +J]9pa??,E]]݁c 1B_ OQlxfq x WvQ4vf*}ǐ[ڠ8IM/; ,[$p$5PMy0{B1"kEH7]wfל|~}:GBZ#ؔ b̳V ,3S|pp㎡`nͶ&.k.\ĄzT-7u0k d KVS|E,6a=G1JZ23W(|m68$.6 X<$#J% Z9sKQU _9K̋/J go8j{.Ν*9 ;ZlGbh礘Z.gm[iU.o*T2Mv\1g[8z'q7CUbҪq*e Ǝ9 ,)Y&twݵ󬈀40\ ٔ~GK?PK!H..mb_drf_article/__init__.pyPK!S#fmb_drf_article/admin.pyPK!ee]mb_drf_article/apps.pyPK!rmb_drf_article/models.pyPK!Cmmb_drf_article/permissions.pyPK!!?mb_drf_article/serializers.pyPK!B??( mb_drf_article/tests.pyPK!4-55 mb_drf_article/urls.pyPK! mb_drf_article/views.pyPK!HڽTU$mb_drf_article-0.1.1.dist-info/WHEELPK!H&B'mb_drf_article-0.1.1.dist-info/METADATAPK!H1%mb_drf_article-0.1.1.dist-info/RECORDPK u{