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):
|
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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user