From be0094128134e8a5c1bac3b0fd52c301dcdbc7c0 Mon Sep 17 00:00:00 2001 From: winkidney Date: Fri, 22 Feb 2019 19:05:49 +0800 Subject: [PATCH] Feature: Add board support in backend --- core/migrations/0003_auto_20190222_1016.py | 58 ++++++++++++++++++++++ core/models.py | 12 +++++ core/serializers.py | 33 +++++++++++- core/views.py | 13 ++++- 4 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 core/migrations/0003_auto_20190222_1016.py diff --git a/core/migrations/0003_auto_20190222_1016.py b/core/migrations/0003_auto_20190222_1016.py new file mode 100644 index 0000000..f6d0b14 --- /dev/null +++ b/core/migrations/0003_auto_20190222_1016.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.20 on 2019-02-22 10:16 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ('core', '0002_pin_referer'), + ] + + operations = [ + migrations.CreateModel( + name='Board', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128)), + ('published', models.DateTimeField(auto_now_add=True)), + ], + ), + migrations.AlterField( + model_name='pin', + name='origin', + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name='pin', + name='referer', + field=models.URLField(blank=True, null=True), + ), + migrations.AlterField( + model_name='pin', + name='url', + field=models.URLField(blank=True, null=True), + ), + migrations.AddField( + model_name='board', + name='pins', + field=models.ManyToManyField(blank=True, related_name='pins', to='core.Pin'), + ), + migrations.AddField( + model_name='board', + name='submitter', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='users.User'), + ), + migrations.AlterUniqueTogether( + name='board', + unique_together=set([('submitter', 'name')]), + ), + migrations.AlterIndexTogether( + name='board', + index_together=set([('submitter', 'name')]), + ), + ] diff --git a/core/models.py b/core/models.py index 1270006..6016583 100644 --- a/core/models.py +++ b/core/models.py @@ -69,6 +69,18 @@ class Image(BaseImage): ) +class Board(models.Model): + class Meta: + unique_together = ("submitter", "name") + index_together = ("submitter", "name") + + submitter = models.ForeignKey(User) + name = models.CharField(max_length=128, blank=False, null=False) + pins = models.ManyToManyField("Pin", related_name="pins", blank=True) + + published = models.DateTimeField(auto_now_add=True) + + class Pin(models.Model): submitter = models.ForeignKey(User) url = models.CharField(null=True, blank=True, max_length=256) diff --git a/core/serializers.py b/core/serializers.py index df045a2..de07f55 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -3,7 +3,7 @@ from rest_framework import serializers from rest_framework.exceptions import ValidationError from taggit.models import Tag -from core.models import Image +from core.models import Image, Board from core.models import Pin from django_images.models import Thumbnail from users.models import User @@ -137,3 +137,34 @@ class PinSerializer(serializers.HyperlinkedModelSerializer): # change for image-id or image is not allowed validated_data.pop('image_by_id', None) return super(PinSerializer, self).update(instance, validated_data) + + +class BoardSerializer(serializers.HyperlinkedModelSerializer): + class Meta: + model = Board + fields = ( + "name", + "pins", + "pins_detail", + "published", + "submitter", + ) + read_only_fields = ('submitter', 'published') + + pins_detail = PinSerializer(source="pins", many=True, read_only=True) + pins = serializers.HyperlinkedRelatedField( + write_only=True, + queryset=Pin.objects.all(), + view_name="pin-detail", + many=True, + required=False, + ) + + def create(self, validated_data): + user = self.context['request'].user + if Board.objects.filter(name=validated_data['name'], submitter=user).exists(): + raise ValidationError( + detail={"name": "board with this name already exists."} + ) + validated_data['submitter'] = user + return super(BoardSerializer, self).create(validated_data) diff --git a/core/views.py b/core/views.py index de98c41..248f3c2 100644 --- a/core/views.py +++ b/core/views.py @@ -4,7 +4,7 @@ from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.viewsets import GenericViewSet from core import serializers as api -from core.models import Image, Pin +from core.models import Image, Pin, Board from core.permissions import IsOwnerOrReadOnly from users.models import User @@ -32,7 +32,18 @@ class PinViewSet(viewsets.ModelViewSet): permission_classes = [IsOwnerOrReadOnly("submitter"), ] +class BoardViewSet(viewsets.ModelViewSet): + queryset = Board.objects.all() + serializer_class = api.BoardSerializer + filter_backends = (DjangoFilterBackend, OrderingFilter) + filter_fields = ("submitter__username", ) + ordering_fields = ('-id', ) + ordering = ('-id', ) + permission_classes = [IsOwnerOrReadOnly("submitter"), ] + + drf_router = routers.DefaultRouter() drf_router.register(r'users', UserViewSet) drf_router.register(r'pins', PinViewSet) drf_router.register(r'images', ImageViewSet) +drf_router.register(r'boards', BoardViewSet)