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):
submitter = models.ForeignKey(User)
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 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)

View File

@@ -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)