create ratings endpoints // enumField problem #TODO

develop
TBS093A 2020-07-03 22:04:10 +02:00
parent 709df5fb90
commit 89fc4b3099
82 changed files with 310 additions and 39 deletions

0
.gitignore vendored 100644 → 100755
View File

3
packages.sh 100644 → 100755
View File

@ -1,6 +1,7 @@
pip install django
pip install djangorestframework
pip install django-filter
pip install django-enumfield
pip install django-rest-enumfield
pip install drf_yasg
pip install pyjwt
pip install markdown

0
portfolio/__init__.py 100644 → 100755
View File

View File

View File

Binary file not shown.

View File

0
portfolio/account/__init__.py 100644 → 100755
View File

Binary file not shown.

0
portfolio/account/admin.py 100644 → 100755
View File

0
portfolio/account/apps.py 100644 → 100755
View File

View File

0
portfolio/account/models.py 100644 → 100755
View File

0
portfolio/account/serializers.py 100644 → 100755
View File

0
portfolio/account/tests.py 100644 → 100755
View File

1
portfolio/account/views.py 100644 → 100755
View File

@ -1,7 +1,6 @@
from rest_framework import viewsets, mixins
from rest_framework.response import Response
from rest_framework import permissions
from rest_framework.decorators import permission_classes
from rest_framework.authtoken.views import ObtainAuthToken
from drf_yasg.utils import swagger_auto_schema

0
portfolio/album/__init__.py 100644 → 100755
View File

View File

0
portfolio/album/admin.py 100644 → 100755
View File

0
portfolio/album/apps.py 100644 → 100755
View File

View File

22
portfolio/album/models.py 100644 → 100755
View File

@ -1,27 +1,7 @@
from django.db import models
from portfolio.account.models import Account
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
from portfolio.utils import OneToManyModel
class Album(OneToManyModel):
title = models.CharField(max_length=255)

0
portfolio/album/serializers.py 100644 → 100755
View File

0
portfolio/album/tests.py 100644 → 100755
View File

26
portfolio/album/views.py 100644 → 100755
View File

@ -2,22 +2,44 @@ from django.shortcuts import render
from rest_framework import viewsets
from drf_yasg.utils import swagger_auto_schema
from .models import *
from .serializers import *
class TrackViewSet(viewsets.ModelViewSet):
"""
A Tack CRUD (abstract from `viewsets.ModelViewSet`):
`GET`: `list()`
`GET`: `retrieve()` /parameter {id}
`POST`: `create()`
`PUT`&`PATCH`: `update()` /parameter {id}
`DELETE`: `destroy()` /parameter {id}
"""
queryset = Track.objects.all()
serializer_class = TrackSerializer
class TrackRowViewSet(viewsets.ModelViewSet):
"""
A TrackRow CRUD (abstract from `viewsets.ModelViewSet`):
`GET`: `list()`
`GET`: `retrieve()` /parameter {id}
`POST`: `create()`
`PUT`&`PATCH`: `update()` /parameter {id}
`DELETE`: `destroy()` /parameter {id}
"""
queryset = TrackRow.objects.all()
serializer_class = TrackRowSerializer
class AlbumViewSet(viewsets.ModelViewSet):
"""
A Album CRUD (abstract from `viewsets.ModelViewSet`):
`GET`: `list()`
`GET`: `retrieve()` /parameter {id}
`POST`: `create()`
`PUT`&`PATCH`: `update()` /parameter {id}
`DELETE`: `destroy()` /parameter {id}
"""
queryset = Album.objects.all()
serializer_class = AlbumSerializer

0
portfolio/asgi.py 100644 → 100755
View File

0
portfolio/comment/__init__.py 100644 → 100755
View File

0
portfolio/comment/admin.py 100644 → 100755
View File

0
portfolio/comment/apps.py 100644 → 100755
View File

View File

2
portfolio/comment/models.py 100644 → 100755
View File

@ -1,6 +1,6 @@
from django.db import models
from account.models import Account, Guest
from portfolio.account.models import Account, Guest
class AbstractComment(models.Model):

0
portfolio/comment/tests.py 100644 → 100755
View File

0
portfolio/comment/views.py 100644 → 100755
View File

View File

View File

@ -0,0 +1,69 @@
# Generated by Django 3.0.8 on 2020-07-03 10:54
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('portfolio', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='UserComment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.CharField(max_length=255)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Account')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='TrackRating',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('track', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Track')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Account')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='GuestComment',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.CharField(max_length=255)),
('guest', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Guest')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='CommentRating',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('comment', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.UserComment')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='portfolio.Account')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='AlbumRating',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('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,
},
),
]

0
portfolio/migrations/__init__.py 100644 → 100755
View File

0
portfolio/playlist/__init__.py 100644 → 100755
View File

0
portfolio/playlist/admin.py 100644 → 100755
View File

0
portfolio/playlist/apps.py 100644 → 100755
View File

View File

0
portfolio/playlist/models.py 100644 → 100755
View File

0
portfolio/playlist/tests.py 100644 → 100755
View File

0
portfolio/playlist/views.py 100644 → 100755
View File

0
portfolio/rating/__init__.py 100644 → 100755
View File

View File

0
portfolio/rating/admin.py 100644 → 100755
View File

0
portfolio/rating/apps.py 100644 → 100755
View File

View File

48
portfolio/rating/models.py 100644 → 100755
View File

@ -1,25 +1,26 @@
from django.db import models
from django.utils.translation import ugettext_lazy
from django_enumfield import enum
from rest_enumfield import EnumField
import enum
from account.models import Account
from comment.models import UserComment, GuestComment
from album.models import Album
from song.models import Song
from portfolio.account.models import Account
from portfolio.comment.models import UserComment, GuestComment
from portfolio.album.models import Album, Track
from portfolio.utils import OneToManyModel
class RatingValue(enum.Enum):
POSITIVE = 1
NEGATIVE = 0
NEGATIVE = -1
__labels__ = {
POSITIVE: ugettext_lazy('Positive'),
NEGATIVE: ugettext_lazy('Negative'),
POSITIVE: ugettext_lazy('POSITIVE'),
NEGATIVE: ugettext_lazy('NEGATIVE'),
}
class AbstractRating(models.Model):
value = enum.EnumField(RatingValue)
class AbstractRating(OneToManyModel):
value = EnumField(choices=RatingValue)
user = models.ForeignKey(Account, on_delete=models.CASCADE)
class Meta:
@ -29,10 +30,33 @@ class AbstractRating(models.Model):
class CommentRating(AbstractRating):
comment = models.ForeignKey(UserComment, on_delete=models.CASCADE)
def toDict(self):
return {
"id": self.id,
"user_id": self.user_id,
"value": self.value,
"comment_id": self.comment_id
}
class AlbumRating(AbstractRating):
album = models.ForeignKey(Album, on_delete=models.CASCADE)
def toDict(self):
return {
"id": self.id,
"user_id": self.user_id,
"value": self.value,
"album_id": self.album_id
}
class SongRating(AbstractRating):
song = models.ForeignKey(Song, on_delete=models.CASCADE)
class TrackRating(AbstractRating):
track = models.ForeignKey(Track, on_delete=models.CASCADE)
def toDict(self):
return {
"id": self.id,
"user_id": self.user_id,
"value": self.value,
"track_id": self.track_id
}

View File

@ -0,0 +1,75 @@
from rest_framework import serializers
from rest_enumfield import EnumField
from .models import *
class TrackRatingSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
user_id = serializers.IntegerField()
value = EnumField(
choices=RatingValue,
to_choice=lambda x:(x.name, x.value),
to_repr=lambda x: x
)
# track_id = serializers.IntegerField()
def get_default(track_id):
queryset = TrackRating.objects.filter(track_id=track_id)
return [ x.toDict() for x in queryset ]
@staticmethod
def create(validated_data, track_id):
validated_data["track_id"] = track_id
return TrackRating.create(TrackRating, validated_data)
@staticmethod
def delete(track_id, user_id):
return TrackRating.objects.get(track_id=track_id, user_id=user_id).delete()
class Meta:
model = TrackRating
fields = ['id', 'user_id', 'value']
class CommentRatingSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
user_id = serializers.IntegerField()
value = EnumField(
choices=RatingValue,
to_choice=lambda x:(x.name, x.value),
to_repr=lambda x: x
)
# comment_id = serializers.IntegerField()
def create(self, validated_data):
return CommentRating.create(TrackRating, validated_data)
def update(self, instance, validated_data):
return instance.update(validated_data)
class Meta:
model = CommentRating
fields = ['id', 'user_id', 'value']
class AlbumRatingSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
user_id = serializers.IntegerField()
value = EnumField(
choices=RatingValue,
to_choice=lambda x:(x.name, x.value),
to_repr=lambda x: x
)
# album_id = serializers.IntegerField()
def create(self, validated_data):
return AlbumRating.create(TrackRating, validated_data)
def update(self, instance, validated_data):
return instance.update(validated_data)
class Meta:
model = AlbumRating
fields = ['id', 'user_id', 'value']

0
portfolio/rating/tests.py 100644 → 100755
View File

78
portfolio/rating/views.py 100644 → 100755
View File

@ -1,3 +1,79 @@
from django.shortcuts import render
# Create your views here.
from rest_framework import viewsets, mixins
from rest_framework.decorators import action
from rest_framework.response import Response
from drf_yasg.utils import swagger_auto_schema
from django.shortcuts import get_object_or_404
from .models import TrackRating, AlbumRating, CommentRating
from .serializers import TrackRatingSerializer, AlbumRatingSerializer, CommentRatingSerializer
class TrackRatingViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
queryset = TrackRating.objects.all()
serializer_class = TrackRatingSerializer
lookup_url_kwarg = 'user_id'
def list(self, request, *args, **kwargs):
trackID = self.kwargs.get('track_id')
serializer = self.serializer_class.get_default(trackID)
print(serializer)
return Response(serializer)
def create(self, request, *args, **kwargs):
trackID = self.kwargs.get('track_id')
checkValidate = self.serializer_class(data = request.data)
if checkValidate and trackID is not None:
serializer = self.serializer_class.create(request.data, track_id=trackID)
return Response(serializer.toDict())
return Response({ "ID": f"{trackID}" })
def destroy(self, request, *args, **kwargs):
trackID = self.kwargs.get('track_id')
userID = self.kwargs.get(self.lookup_url_kwarg)
return Response(self.serializer_class.delete(trackID, userID))
class AlbumRatingViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
queryset = AlbumRating.objects.all()
serializer_class = AlbumRatingSerializer
lookup_url_kwarg = 'user_id'
def get(self, request, *args, **kwargs):
return Response("elo")
def post(self, request, *args, **kwargs):
return Response("elo")
def delete(self, request, *args, **kwargs):
return Response("elo")
class CommentRatingViewSet(
mixins.ListModelMixin,
mixins.CreateModelMixin,
mixins.DestroyModelMixin,
viewsets.GenericViewSet
):
queryset = CommentRating.objects.all()
serializer_class = CommentRatingSerializer
lookup_url_kwarg = 'user_id'
def get(self, request, *args, **kwargs):
return Response("elo")
def post(self, request, *args, **kwargs):
return Response("elo")
def delete(self, request, *args, **kwargs):
return Response("elo")

0
portfolio/settings.py 100644 → 100755
View File

5
portfolio/urls.py 100644 → 100755
View File

@ -24,6 +24,7 @@ from rest_framework.authtoken import views as authViews
from portfolio import settings
from .account.views import GuestViewSet, AccountViewSet, AccountAuth
from .album.views import AlbumViewSet, TrackViewSet, TrackRowViewSet
from .rating.views import TrackRatingViewSet, AlbumRatingViewSet, CommentRatingViewSet
schema_view = get_schema_view(
openapi.Info(
@ -46,6 +47,10 @@ router.register(r'album', AlbumViewSet, basename='album')
router.register(r'track', TrackViewSet, basename='track')
router.register(r'track-row', TrackRowViewSet, basename='track row')
router.register(r'track/(?P<track_id>\w+)/rating', TrackRatingViewSet, basename='track rating')
router.register(r'album/(?P<album_id>\w+)/rating', AlbumRatingViewSet, basename='album rating')
router.register(r'comment/(?P<comment_id>\w+)/rating', CommentRatingViewSet, basename='comment rating')
urlpatterns = [
path('admin/', admin.site.urls),
path('', include(router.urls)),

20
portfolio/utils.py 100644
View File

@ -0,0 +1,20 @@
from django.db import models
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

0
portfolio/wsgi.py 100644 → 100755
View File