mirror of
https://github.com/pinry/pinry.git
synced 2025-11-15 17:35:50 +01:00
Feature: Add board support in backend
This commit is contained in:
committed by
Isaac Bythewood
parent
ffe999f405
commit
be00941281
58
core/migrations/0003_auto_20190222_1016.py
Normal file
58
core/migrations/0003_auto_20190222_1016.py
Normal 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')]),
|
||||
),
|
||||
]
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user