diff --git a/portfolio/__pycache__/urls.cpython-36.pyc b/portfolio/__pycache__/urls.cpython-36.pyc index 9b232c2..a9c404d 100644 Binary files a/portfolio/__pycache__/urls.cpython-36.pyc and b/portfolio/__pycache__/urls.cpython-36.pyc differ diff --git a/portfolio/account/__pycache__/serializers.cpython-36.pyc b/portfolio/account/__pycache__/serializers.cpython-36.pyc index dd91235..2afd96f 100644 Binary files a/portfolio/account/__pycache__/serializers.cpython-36.pyc and b/portfolio/account/__pycache__/serializers.cpython-36.pyc differ diff --git a/portfolio/album/__pycache__/models.cpython-36.pyc b/portfolio/album/__pycache__/models.cpython-36.pyc index 695222f..a61b4b0 100644 Binary files a/portfolio/album/__pycache__/models.cpython-36.pyc and b/portfolio/album/__pycache__/models.cpython-36.pyc differ diff --git a/portfolio/album/__pycache__/serializers.cpython-36.pyc b/portfolio/album/__pycache__/serializers.cpython-36.pyc new file mode 100644 index 0000000..0069eaa Binary files /dev/null and b/portfolio/album/__pycache__/serializers.cpython-36.pyc differ diff --git a/portfolio/album/__pycache__/views.cpython-36.pyc b/portfolio/album/__pycache__/views.cpython-36.pyc new file mode 100644 index 0000000..666b0f1 Binary files /dev/null and b/portfolio/album/__pycache__/views.cpython-36.pyc differ diff --git a/portfolio/album/models.py b/portfolio/album/models.py index f56457d..f5dc1d6 100644 --- a/portfolio/album/models.py +++ b/portfolio/album/models.py @@ -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 + } + } \ No newline at end of file diff --git a/portfolio/album/serializers.py b/portfolio/album/serializers.py new file mode 100644 index 0000000..3e2c222 --- /dev/null +++ b/portfolio/album/serializers.py @@ -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'] diff --git a/portfolio/album/views.py b/portfolio/album/views.py index 91ea44a..b316147 100644 --- a/portfolio/album/views.py +++ b/portfolio/album/views.py @@ -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 diff --git a/portfolio/migrations/0001_initial.py b/portfolio/migrations/0001_initial.py index ba702d5..761eeb3 100644 --- a/portfolio/migrations/0001_initial.py +++ b/portfolio/migrations/0001_initial.py @@ -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, + }, + ), ] diff --git a/portfolio/migrations/__pycache__/0001_initial.cpython-36.pyc b/portfolio/migrations/__pycache__/0001_initial.cpython-36.pyc index 6b448c6..037ff1b 100644 Binary files a/portfolio/migrations/__pycache__/0001_initial.cpython-36.pyc and b/portfolio/migrations/__pycache__/0001_initial.cpython-36.pyc differ diff --git a/portfolio/migrations/__pycache__/0002_album_track_trackrow.cpython-36.pyc b/portfolio/migrations/__pycache__/0002_album_track_trackrow.cpython-36.pyc new file mode 100644 index 0000000..261a6df Binary files /dev/null and b/portfolio/migrations/__pycache__/0002_album_track_trackrow.cpython-36.pyc differ diff --git a/portfolio/migrations/__pycache__/0003_auto_20200620_1850.cpython-36.pyc b/portfolio/migrations/__pycache__/0003_auto_20200620_1850.cpython-36.pyc new file mode 100644 index 0000000..c616e17 Binary files /dev/null and b/portfolio/migrations/__pycache__/0003_auto_20200620_1850.cpython-36.pyc differ diff --git a/portfolio/migrations/__pycache__/0004_auto_20200620_1956.cpython-36.pyc b/portfolio/migrations/__pycache__/0004_auto_20200620_1956.cpython-36.pyc new file mode 100644 index 0000000..d499775 Binary files /dev/null and b/portfolio/migrations/__pycache__/0004_auto_20200620_1956.cpython-36.pyc differ diff --git a/portfolio/migrations/__pycache__/0005_auto_20200620_2006.cpython-36.pyc b/portfolio/migrations/__pycache__/0005_auto_20200620_2006.cpython-36.pyc new file mode 100644 index 0000000..295ad60 Binary files /dev/null and b/portfolio/migrations/__pycache__/0005_auto_20200620_2006.cpython-36.pyc differ diff --git a/portfolio/song/__init__.py b/portfolio/song/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/portfolio/song/__pycache__/__init__.cpython-36.pyc b/portfolio/song/__pycache__/__init__.cpython-36.pyc deleted file mode 100644 index dd744cd..0000000 Binary files a/portfolio/song/__pycache__/__init__.cpython-36.pyc and /dev/null differ diff --git a/portfolio/song/__pycache__/admin.cpython-36.pyc b/portfolio/song/__pycache__/admin.cpython-36.pyc deleted file mode 100644 index 2cd7db2..0000000 Binary files a/portfolio/song/__pycache__/admin.cpython-36.pyc and /dev/null differ diff --git a/portfolio/song/__pycache__/models.cpython-36.pyc b/portfolio/song/__pycache__/models.cpython-36.pyc deleted file mode 100644 index 95da500..0000000 Binary files a/portfolio/song/__pycache__/models.cpython-36.pyc and /dev/null differ diff --git a/portfolio/song/admin.py b/portfolio/song/admin.py deleted file mode 100644 index 8c38f3f..0000000 --- a/portfolio/song/admin.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.contrib import admin - -# Register your models here. diff --git a/portfolio/song/apps.py b/portfolio/song/apps.py deleted file mode 100644 index 83a50fc..0000000 --- a/portfolio/song/apps.py +++ /dev/null @@ -1,5 +0,0 @@ -from django.apps import AppConfig - - -class SongConfig(AppConfig): - name = 'song' diff --git a/portfolio/song/migrations/__init__.py b/portfolio/song/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/portfolio/song/models.py b/portfolio/song/models.py deleted file mode 100644 index 11ea75b..0000000 --- a/portfolio/song/models.py +++ /dev/null @@ -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 - } - } \ No newline at end of file diff --git a/portfolio/song/tests.py b/portfolio/song/tests.py deleted file mode 100644 index 7ce503c..0000000 --- a/portfolio/song/tests.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.test import TestCase - -# Create your tests here. diff --git a/portfolio/song/views.py b/portfolio/song/views.py deleted file mode 100644 index 91ea44a..0000000 --- a/portfolio/song/views.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.shortcuts import render - -# Create your views here. diff --git a/portfolio/urls.py b/portfolio/urls.py index fe4c14b..0c12cec 100644 --- a/portfolio/urls.py +++ b/portfolio/urls.py @@ -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)) ] \ No newline at end of file