merge endpoints Track/TrackRow to Album && create full crud -> Album && clear database

develop
TBS093A 2020-06-21 00:55:39 +02:00
parent 1c84adcbda
commit 344f71295c
25 changed files with 285 additions and 69 deletions

View File

@ -1,11 +1,78 @@
from django.db import models
from account.models import Account
from portfolio.account.models import Account
class Album(models.Model):
class OneToManyModel(models.Model):
def fromDict(self, dict):
self.__dict__.update(dict)
def create(self, dict):
new_object = self()
new_object.fromDict(dict)
new_object.save()
return new_object
def update(self, dict):
self.fromDict(dict)
self.save()
return self
class Meta:
abstract = True
class Album(OneToManyModel):
title = models.CharField(max_length=255)
description = models.CharField(max_length=255)
image = models.TextField()
url_code = models.CharField(max_length=255)
user = models.ManyToManyField(Account)
user = models.ForeignKey(Account, on_delete=models.DO_NOTHING)
class Track(OneToManyModel):
title = models.CharField(max_length=255)
description = models.CharField(max_length=1000)
text = models.TextField()
image = models.TextField()
audio = models.TextField()
url_code = models.CharField(max_length=255)
album = models.ForeignKey(Album, on_delete=models.CASCADE)
user = models.ForeignKey(Account, on_delete=models.CASCADE)
class TrackRow(OneToManyModel):
row_number = models.IntegerField()
group = models.BooleanField()
leader = models.BooleanField()
link = models.IntegerField(default=None)
text = models.TextField(default=None)
description = models.TextField(default=None)
image = models.TextField(default=None)
track = models.ForeignKey(Track, on_delete=models.CASCADE)
def toDict(self):
if self.link is not None:
return {
self.row_number: {
'group': self.gruop,
'leader': self.leader,
'link': self.link,
'text': self.text,
'description': None,
'image': None
}
}
else:
return {
self.row_number: {
'group': self.gruop,
'leader': self.leader,
'link': None,
'text': None,
'description': self.description,
'image': self.image
}
}

View File

@ -0,0 +1,135 @@
from rest_framework import serializers
from rest_framework.reverse import reverse
from .models import *
class TrackRowSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
track_id = serializers.IntegerField()
row_number = serializers.IntegerField()
group = serializers.BooleanField()
leader = serializers.BooleanField()
link = serializers.IntegerField()
text = serializers.CharField()
description = serializers.CharField()
image = serializers.CharField()
def create(self, validated_data):
return TrackRow.create(TrackRow, validated_data)
def update(self, instance, validated_data):
return instance.update(instance, validated_data)
class Meta:
model = TrackRow
fields = ['id', 'track_id','row_number', 'group', 'leader', 'link', 'text', 'description', 'image']
class TrackSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
album_id = serializers.IntegerField()
user_id = serializers.IntegerField()
title = serializers.CharField(max_length=255)
description = serializers.CharField(max_length=1000)
text = serializers.CharField()
image = serializers.CharField()
audio = serializers.CharField()
url_code = serializers.CharField(max_length=255)
track_rows = TrackRowSerializer(many=True, read_only=True)
def create(self, validated_data):
return Track.create(Track, validated_data)
def update(self, instance, validated_data):
return instance.update(validated_data)
# track_rows = serializers.SlugRelatedField(
# many=True,
# read_only=True,
# slug_field='row_number'
# )
# view_name = 'track'
# queryset = Track.objects.all()
# def get_url(self, obj, view_name, request, format):
# url_kargs = {
# 'album_id': obj.album.id,
# 'id': obj.id
# }
# return reverse(view_name, kwargs=url_kargs, request=request, format=format)
# def get_object(self, view_name, view_args, view_kwargs):
# lookup_kwargs = {
# 'album_id': view_kwargs['album_id'],
# 'id': view_kwargs['id']
# }
# return self.get_queryset().get(**lookup_kwargs)
class Meta:
model = Track
fields = ['id', 'album_id', 'user_id', 'title', 'description', 'text', 'image', 'audio', 'url_code', 'track_rows']
class AlbumSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
user_id = serializers.IntegerField()
title = serializers.CharField(max_length=255)
description = serializers.CharField(max_length=255)
image = serializers.CharField()
url_code = serializers.CharField(max_length=255)
tracks = TrackSerializer(many=True, read_only=True)
def create(self, validated_data):
return Album.create(Album, validated_data)
def update(self, instance, validated_data):
return Album.update(validated_data)
class Meta:
model = Album
fields = ['id', 'user_id', 'title', 'description', 'image', 'url_code', 'tracks']
# Relations
# class TrackTrackRowRelation(serializers.RelatedField):
# def to_representation(self, value):
# serializer = TrackSerializer(value.get_queryset()[0])
# return serializer.data
# class AlbumTrackRelation(serializers.RelatedField):
# def to_representation(self, value):
# serializer = AlbumSerializer(value.get_queryset()[0])
# return serializer.data
# class TrackRowSerializerFull(TrackRowSerializer):
# """
# TrackRow + Track id
# """
# track_id = TrackTrackRowRelation(queryset=Track.objects.all())
# class Meta:
# model = TrackRow
# fields = ['id', 'track_id', 'row_number', 'group', 'leader', 'link', 'text', 'description', 'image']
# class TrackSerializerFull(TrackSerializer):
# """
# Track + Album id
# """
# album_id = AlbumTrackRelation(queryset=Album.objects.all())
# def create(self, validated_data):
# return super().create(validated_data)
# class Meta:
# model = Track
# fields = ['id', 'album_id', 'title', 'description', 'text', 'image', 'audio', 'url_code', 'track_rows']

View File

@ -1,3 +1,23 @@
from django.shortcuts import render
# Create your views here.
from rest_framework import viewsets
from drf_yasg.utils import swagger_auto_schema
from .models import *
from .serializers import *
class TrackViewSet(viewsets.ModelViewSet):
queryset = Track.objects.all()
serializer_class = TrackSerializer
class TrackRowViewSet(viewsets.ModelViewSet):
queryset = TrackRow.objects.all()
serializer_class = TrackRowSerializer
class AlbumViewSet(viewsets.ModelViewSet):
queryset = Album.objects.all()
serializer_class = AlbumSerializer

View File

@ -1,4 +1,4 @@
# Generated by Django 3.0.7 on 2020-06-18 17:25
# Generated by Django 3.0.7 on 2020-06-20 22:48
from django.conf import settings
import django.contrib.auth.models
@ -33,6 +33,20 @@ class Migration(migrations.Migration):
('objects', django.contrib.auth.models.UserManager()),
],
),
migrations.CreateModel(
name='Album',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('description', models.CharField(max_length=255)),
('image', models.TextField()),
('url_code', models.CharField(max_length=255)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='portfolio.Account')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='Guest',
fields=[
@ -45,4 +59,38 @@ class Migration(migrations.Migration):
'abstract': False,
},
),
migrations.CreateModel(
name='Track',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('title', models.CharField(max_length=255)),
('description', models.CharField(max_length=1000)),
('text', models.TextField()),
('image', models.TextField()),
('audio', models.TextField()),
('url_code', models.CharField(max_length=255)),
('album', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Album')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Account')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='TrackRow',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('row_number', models.IntegerField()),
('group', models.BooleanField()),
('leader', models.BooleanField()),
('link', models.IntegerField(default=None)),
('text', models.TextField(default=None)),
('description', models.TextField(default=None)),
('image', models.TextField(default=None)),
('track', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Track')),
],
options={
'abstract': False,
},
),
]

View File

@ -1,3 +0,0 @@
from django.contrib import admin
# Register your models here.

View File

@ -1,5 +0,0 @@
from django.apps import AppConfig
class SongConfig(AppConfig):
name = 'song'

View File

@ -1,45 +0,0 @@
from django.db import models
from account.models import Account
from album.models import Album
class Song(models.Model):
title = models.CharField(max_length=255)
description = models.CharField(max_length=1000)
text = models.TextField()
image = models.TextField()
audio = models.TextField()
url_code = models.CharField(max_length=255)
album = models.ForeignKey(Album, on_delete=models.CASCADE)
user = models.ForeignKey(Account, on_delete=models.CASCADE)
class SongRow(models.Model):
rowNumber = models.IntegerField()
gruop = models.BooleanField()
leader = models.BooleanField()
link = models.IntegerField(default=None)
text = models.TextField()
description = models.TextField()
image = models.TextField()
song = models.ForeignKey(Song, on_delete=models.CASCADE)
def toDict(self):
if self.link is not None:
return {
self.rowNumber: {
'group': self.gruop,
'leader': self.leader,
'link': self.link,
'text': self.text,
}
}
else:
return {
self.rowNumber: {
'group': self.gruop,
'leader': self.leader,
'text': self.text,
'description': self.description,
'image': self.image
}
}

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -22,7 +22,8 @@ from rest_framework import routers, permissions
from rest_framework.authtoken import views as authViews
from portfolio import settings
from .account import views
from .account.views import GuestViewSet, AccountViewSet, AccountAuth
from .album.views import AlbumViewSet, TrackViewSet, TrackRowViewSet
schema_view = get_schema_view(
openapi.Info(
@ -38,19 +39,23 @@ schema_view = get_schema_view(
router = routers.DefaultRouter()
router.register(r'users', views.AccountViewSet, basename='user')
router.register(r'guests', views.GuestViewSet)
router.register(r'user', AccountViewSet, basename='user')
router.register(r'guest', GuestViewSet, basename='guest')
router.register(r'album', AlbumViewSet, basename='album')
router.register(r'track', TrackViewSet, basename='track')
router.register(r'track-row', TrackRowViewSet, basename='track row')
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
re_path(r'users/auth', views.AccountAuth.as_view())
re_path(r'user/auth', AccountAuth.as_view())
]
if settings.DEBUG:
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),
re_path(r'users/auth', views.AccountAuth.as_view()),
re_path(r'user/auth', AccountAuth.as_view()),
path('swagger/', schema_view.with_ui('swagger', cache_timeout=0))
]