Feature: Add board support in backend

This commit is contained in:
winkidney
2019-02-22 19:05:49 +08:00
committed by Isaac Bythewood
parent ffe999f405
commit be00941281
4 changed files with 114 additions and 2 deletions

View File

@@ -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')]),
),
]

View File

@@ -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): class Pin(models.Model):
submitter = models.ForeignKey(User) submitter = models.ForeignKey(User)
url = models.CharField(null=True, blank=True, max_length=256) url = models.CharField(null=True, blank=True, max_length=256)

View File

@@ -3,7 +3,7 @@ from rest_framework import serializers
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from taggit.models import Tag from taggit.models import Tag
from core.models import Image from core.models import Image, Board
from core.models import Pin from core.models import Pin
from django_images.models import Thumbnail from django_images.models import Thumbnail
from users.models import User from users.models import User
@@ -137,3 +137,34 @@ class PinSerializer(serializers.HyperlinkedModelSerializer):
# change for image-id or image is not allowed # change for image-id or image is not allowed
validated_data.pop('image_by_id', None) validated_data.pop('image_by_id', None)
return super(PinSerializer, self).update(instance, validated_data) 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)

View File

@@ -4,7 +4,7 @@ from rest_framework.filters import SearchFilter, OrderingFilter
from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import GenericViewSet
from core import serializers as api 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 core.permissions import IsOwnerOrReadOnly
from users.models import User from users.models import User
@@ -32,7 +32,18 @@ class PinViewSet(viewsets.ModelViewSet):
permission_classes = [IsOwnerOrReadOnly("submitter"), ] 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 = routers.DefaultRouter()
drf_router.register(r'users', UserViewSet) drf_router.register(r'users', UserViewSet)
drf_router.register(r'pins', PinViewSet) drf_router.register(r'pins', PinViewSet)
drf_router.register(r'images', ImageViewSet) drf_router.register(r'images', ImageViewSet)
drf_router.register(r'boards', BoardViewSet)