Merge branch 'master' of https://git.flexites.org/Students/ITRadio
This commit is contained in:
commit
38b88d8730
|
|
@ -0,0 +1,8 @@
|
|||
# IT-Рadio
|
||||
IT-Радио — радиостанция про сферу технологийи развитие в IT
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
|
@ -1,6 +0,0 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class ApiConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'api'
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
# from django.db import models
|
||||
|
||||
# class NowPlayingSong(models.Model):
|
||||
# title = models.CharField(max_length=255)
|
||||
# artist = models.CharField(max_length=255)
|
||||
# album = models.CharField(max_length=255, blank=True, null=True)
|
||||
# genre = models.CharField(max_length=100, blank=True, null=True)
|
||||
# art = models.URLField(blank=True, null=True)
|
||||
|
||||
|
||||
|
|
@ -1,16 +0,0 @@
|
|||
# from rest_framework import serializers
|
||||
# from .models import NowPlayingSong
|
||||
|
||||
|
||||
# class NowPlayingSongSerializer(serializers.ModelSerializer):
|
||||
# class Meta:
|
||||
# model = NowPlayingSong
|
||||
# fields = ['title', 'artist', 'album', 'genre', 'art']
|
||||
|
||||
# class WebhookSerializer(serializers.Serializer):
|
||||
# song = NowPlayingSongSerializer()
|
||||
# def create(self, validated_data):
|
||||
# print("create")
|
||||
# song_data = validated_data.get('song')
|
||||
# print(song_data)
|
||||
# return NowPlayingSong.objects.create(**song_data)
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
import requests
|
||||
from django.http import HttpResponse
|
||||
from rest_framework.views import APIView
|
||||
from rest_framework.viewsets import ViewSet
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework.permissions import AllowAny
|
||||
from conf.settings.base import AZURACAST_API_KEY, AZURACAST_URL
|
||||
|
|
@ -38,7 +38,7 @@ class PlayListViewSet(GenericViewSet):
|
|||
|
||||
if request.data.get('name', False):
|
||||
try:
|
||||
instance = PlayList.objects.get(pk=request.data['playlist_id'], user=request.user.pk)
|
||||
instance = self.get_queryset().objects.get(pk=request.data['playlist_id'], user=request.user.pk)
|
||||
data = request.data
|
||||
data.update(user=request.user.pk)
|
||||
serializer = self.get_serializer(data=request.data, instance=instance)
|
||||
|
|
@ -63,7 +63,7 @@ class PlayListViewSet(GenericViewSet):
|
|||
@action(detail=False, methods=['post'], schema=PlayListSchema())
|
||||
def update_playlist(self, request):
|
||||
try:
|
||||
instance = PlayList.objects.get(pk=request.data['playlist_id'], user=request.user.pk)
|
||||
instance = self.get_queryset().objects.get(pk=request.data['playlist_id'], user=request.user.pk)
|
||||
serializer = self.get_serializer(data=request.data, partial=True, instance=instance)
|
||||
serializer.is_valid(raise_exception=True)
|
||||
serializer.save()
|
||||
|
|
@ -76,7 +76,7 @@ class PlayListViewSet(GenericViewSet):
|
|||
@action(detail=False, methods=['post'], schema=PlayListSchema())
|
||||
def delete_playlist(self, request):
|
||||
try:
|
||||
item = PlayList.objects.get(user=request.user, pk=request.data.get('playlist_id'))
|
||||
item = self.get_queryset().objects.get(user=request.user, pk=request.data.get('playlist_id'))
|
||||
item.delete()
|
||||
return Response(status=status.HTTP_202_ACCEPTED)
|
||||
except ObjectDoesNotExist:
|
||||
|
|
@ -88,7 +88,7 @@ class PlayListViewSet(GenericViewSet):
|
|||
def delete_song_with_playlist(self, request):
|
||||
try:
|
||||
song = Song.objects.get(azura_id=request.data.get('azura_id'))
|
||||
item = PlayList.objects.get(user=request.user, pk=request.data.get('playlist_id'))
|
||||
item = self.get_queryset().objects.get(user=request.user, pk=request.data.get('playlist_id'))
|
||||
item.song.remove(song)
|
||||
return Response({'detail': 'Объект удалён'}, status=status.HTTP_200_OK)
|
||||
except ObjectDoesNotExist:
|
||||
|
|
@ -117,7 +117,7 @@ class PlayListViewSet(GenericViewSet):
|
|||
song_serializer.save()
|
||||
song = song_serializer.data.get('id')
|
||||
try:
|
||||
instance = PlayList.objects.get(pk=request.data.get('playlist_id'))
|
||||
instance = self.get_queryset().objects.get(pk=request.data.get('playlist_id'))
|
||||
except ObjectDoesNotExist:
|
||||
return Response(
|
||||
{'detail': 'Плейлиста не существует', 'error': {'PlayList': 'Плейлиста не существует'}},
|
||||
|
|
@ -135,14 +135,14 @@ class PlayListViewSet(GenericViewSet):
|
|||
|
||||
|
||||
class SongViewSet(GenericViewSet):
|
||||
queryset = Song.objects.all()
|
||||
queryset = Song
|
||||
serializer_class = SongSerializer
|
||||
permission_classes = (IsAuthenticated,)
|
||||
|
||||
def list(self, request):
|
||||
songs_pk = FavoriteSong.objects.filter(user=request.user, song__isnull=False).values_list('song_id', flat=True)
|
||||
songs = Song.objects.filter(id__in=songs_pk)
|
||||
serializer = SongSerializer(songs, many=True)
|
||||
songs = self.get_queryset().objects.filter(id__in=songs_pk)
|
||||
serializer = self.get_serializer(songs, many=True)
|
||||
return Response(serializer.data)
|
||||
|
||||
@action(
|
||||
|
|
@ -153,7 +153,7 @@ class SongViewSet(GenericViewSet):
|
|||
)
|
||||
def check_is_favorite(self, request, azura_id):
|
||||
try:
|
||||
song_obj = Song.objects.get(azura_id=azura_id)
|
||||
song_obj = self.get_queryset().objects.get(azura_id=azura_id)
|
||||
favorite_songs = FavoriteSong.objects.get(user=request.user, song=song_obj)
|
||||
return Response({"is_favorite": True}, status=status.HTTP_200_OK)
|
||||
except ObjectDoesNotExist:
|
||||
|
|
@ -167,7 +167,7 @@ class SongViewSet(GenericViewSet):
|
|||
)
|
||||
def get_audio(self, request, azura_id):
|
||||
try:
|
||||
song_obj = Song.objects.get(azura_id=azura_id)
|
||||
song_obj = self.get_queryset().objects.get(azura_id=azura_id)
|
||||
file_url = song_obj.unique_id
|
||||
API_KEY = AZURACAST_API_KEY
|
||||
headers = {
|
||||
|
|
@ -190,7 +190,7 @@ class SongViewSet(GenericViewSet):
|
|||
def add_favorite(self, request):
|
||||
data = None
|
||||
try:
|
||||
song = Song.objects.get(azura_id=request.data.get('azura_id'))
|
||||
song = self.get_queryset().objects.get(azura_id=request.data.get('azura_id'))
|
||||
data = {
|
||||
"song": song.pk,
|
||||
"user": request.user.pk
|
||||
|
|
@ -205,7 +205,7 @@ class SongViewSet(GenericViewSet):
|
|||
data = request.data
|
||||
file_play = f"{AZURACAST_URL}/api/station/it-radio/file/{response.json()['unique_id']}/play"
|
||||
data.update(unique_id=file_play)
|
||||
serializer = SongSerializer(data=data)
|
||||
serializer = self.get_serializer(data=data)
|
||||
if serializer.is_valid():
|
||||
serializer.save()
|
||||
data = {
|
||||
|
|
@ -222,7 +222,7 @@ class SongViewSet(GenericViewSet):
|
|||
@action(detail=False, methods=['post'], schema=DeleteSongSchema())
|
||||
def delete_song(self, request):
|
||||
try:
|
||||
song = Song.objects.get(azura_id=request.data.get('azura_id'))
|
||||
song = self.get_queryset().objects.get(azura_id=request.data.get('azura_id'))
|
||||
item = FavoriteSong.objects.get(user=request.user, song=song.pk)
|
||||
item.delete()
|
||||
return Response(status=status.HTTP_202_ACCEPTED)
|
||||
|
|
@ -243,6 +243,17 @@ class SongViewSet(GenericViewSet):
|
|||
data.append(i)
|
||||
return Response(data, status=status.HTTP_200_OK)
|
||||
|
||||
@action(detail=False, methods=['get'], permission_classes=(AllowAny,))
|
||||
def get_nowplaying(self, request):
|
||||
file_url = F"{AZURACAST_URL}api/nowplaying/it-radio"
|
||||
API_KEY = AZURACAST_API_KEY
|
||||
headers = {
|
||||
"Authorization": f"Bearer {API_KEY}"
|
||||
}
|
||||
response = requests.get(file_url, headers=headers)
|
||||
return Response(response.json(), status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -42,10 +42,7 @@ INSTALLED_APPS = [
|
|||
|
||||
'news',
|
||||
'rubricks',
|
||||
'loginApi',
|
||||
'userProfile',
|
||||
'audio',
|
||||
'api',
|
||||
'account',
|
||||
'config_site'
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,8 @@ DATABASES = {
|
|||
},
|
||||
}
|
||||
|
||||
REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES'] = ('rest_framework.permissions.AllowAny',)
|
||||
|
||||
if len(sys.argv) >= 2 and sys.argv[1] != 'runserver':
|
||||
from conf.sentry import sentry_start, SENTRY_CONFIG
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ from rest_framework_simplejwt.views import (
|
|||
)
|
||||
from django.conf.urls.static import static
|
||||
from rest_framework import routers
|
||||
from userProfile.views import TeamViewSet
|
||||
from config_site.views import TeamViewSet
|
||||
from django.conf import settings
|
||||
from rubricks.views import RubricViewSet
|
||||
from audio.views import SongViewSet, PlayListViewSet
|
||||
|
|
@ -22,7 +22,6 @@ router.register(r'song', SongViewSet, basename='song')
|
|||
|
||||
urlpatterns = [
|
||||
path('api/admin/', admin.site.urls),
|
||||
#path('api/fetch-file/<str:station>/<str:song_id>/', FetchAndServeFile.as_view(), name='fetch-file'),
|
||||
path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
|
||||
path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
|
||||
path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
from .models import Team
|
||||
from django.contrib import admin
|
||||
|
||||
@admin.register(Team)
|
||||
class TeamAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'last_name', 'position', 'img_person')
|
||||
|
||||
|
|
@ -11,3 +11,17 @@ class Page(models.Model):
|
|||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Team(models.Model):
|
||||
name = models.CharField('Имя участника', max_length=50)
|
||||
last_name = models.CharField('Фамилия участника', max_length=50)
|
||||
position = models.CharField('Должность участинка', max_length=50)
|
||||
img_person = models.ImageField('Изображение участника', blank=True, null=True, upload_to="team_images/")
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.last_name} {self.name} - {self.position}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Команда'
|
||||
verbose_name_plural = 'Команда'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
from rest_framework import serializers, views, status
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import serializers
|
||||
from .models import Team
|
||||
|
||||
class TeamSerializer(serializers.ModelSerializer):
|
||||
|
|
@ -1,11 +1,21 @@
|
|||
from django.shortcuts import render
|
||||
from rest_framework.viewsets import ViewSet, GenericViewSet
|
||||
from rest_framework.viewsets import GenericViewSet
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.decorators import action
|
||||
from rest_framework import status
|
||||
from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned
|
||||
from django.shortcuts import get_object_or_404, get_list_or_404
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
import requests
|
||||
from .models import Page
|
||||
|
||||
|
||||
from .models import Team
|
||||
from .serializers import TeamSerializer
|
||||
|
||||
|
||||
class TeamViewSet(GenericViewSet):
|
||||
queryset = Team
|
||||
serializer_class = TeamSerializer
|
||||
|
||||
def list(self, request):
|
||||
queryset = self.get_queryset().objects.all()
|
||||
serializer = self.get_serializer(queryset, many=True)
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,3 +0,0 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class LoginapiConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'loginApi'
|
||||
Binary file not shown.
|
|
@ -1,3 +0,0 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
from django.contrib.auth.models import User
|
||||
from rest_framework import serializers
|
||||
|
||||
class UserSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = User
|
||||
fields = ['username', 'email', 'password']
|
||||
extra_kwargs = {
|
||||
'password': {'write_only': True}
|
||||
}
|
||||
|
||||
def create(self, validated_data):
|
||||
user = User.objects.create_user(
|
||||
username=validated_data['username'],
|
||||
email=validated_data['email'],
|
||||
password=validated_data['password']
|
||||
)
|
||||
return user
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
@ -1,53 +0,0 @@
|
|||
""" from rest_framework import status
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.views import APIView
|
||||
from django.contrib.auth import authenticate
|
||||
from rest_framework_simplejwt.tokens import RefreshToken
|
||||
from rest_framework import generics
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from rest_framework.decorators import api_view, permission_classes
|
||||
from rest_framework.permissions import AllowAny
|
||||
from userProfile.serializers import ProfileSerializer
|
||||
from loginApi.serializers import UserSerializer
|
||||
|
||||
@api_view(['POST'])
|
||||
@permission_classes([AllowAny])
|
||||
def login(request):
|
||||
def post(self, request):
|
||||
username = request.data.get('username')
|
||||
password = request.data.get('password')
|
||||
user = authenticate(username=username, password=password)
|
||||
if user is not None:
|
||||
refresh = RefreshToken.for_user(user)
|
||||
return Response({
|
||||
'refresh': str(refresh),
|
||||
'access': str(refresh.access_token),
|
||||
})
|
||||
return Response({'error': 'Invalid Credentials'}, status=status.HTTP_401_UNAUTHORIZED)
|
||||
|
||||
|
||||
|
||||
|
||||
@api_view(['POST'])
|
||||
@permission_classes([AllowAny])
|
||||
def register(request):
|
||||
user_serializer = UserSerializer(data=request.data)
|
||||
if user_serializer.is_valid():
|
||||
user = user_serializer.save()
|
||||
profile_data = request.data.get('profile', {})
|
||||
profile_data['user'] = user.id # Ensure the user ID is included in the profile data
|
||||
|
||||
profile_serializer = ProfileSerializer(data=profile_data)
|
||||
if profile_serializer.is_valid():
|
||||
profile_serializer.save()
|
||||
refresh = RefreshToken.for_user(user)
|
||||
return Response({
|
||||
'user': user_serializer.data,
|
||||
'profile': profile_serializer.data,
|
||||
'refresh': str(refresh),
|
||||
'access': str(refresh.access_token),
|
||||
}, status=status.HTTP_201_CREATED)
|
||||
else:
|
||||
return Response(profile_serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
||||
return Response(user_serializer.errors, status=status.HTTP_400_BAD_REQUEST) """
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class SchedulerConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'scheduler'
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,9 +0,0 @@
|
|||
from django.contrib import admin
|
||||
from rest_framework.authtoken.admin import TokenAdmin
|
||||
from .models import Team
|
||||
|
||||
TokenAdmin.raw_id_fields = ['user']
|
||||
|
||||
@admin.register(Team)
|
||||
class TeamAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'name', 'last_name', 'position', 'img_person')
|
||||
|
|
@ -1,6 +0,0 @@
|
|||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class UserprofileConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'userProfile'
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
# Generated by Django 5.0.6 on 2024-06-19 12:09
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Team',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=50, verbose_name='Имя участника')),
|
||||
('last_name', models.CharField(max_length=50, verbose_name='Фамилия участника')),
|
||||
('position', models.CharField(max_length=50, verbose_name='Должность участинка')),
|
||||
('img_person', models.ImageField(blank=True, null=True, upload_to='team_images/', verbose_name='Изображение участника')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Команда',
|
||||
'verbose_name_plural': 'Команда',
|
||||
},
|
||||
),
|
||||
]
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,17 +0,0 @@
|
|||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.db.models import JSONField
|
||||
|
||||
class Team(models.Model):
|
||||
name = models.CharField('Имя участника', max_length=50)
|
||||
last_name = models.CharField('Фамилия участника', max_length=50)
|
||||
position = models.CharField('Должность участинка', max_length=50)
|
||||
img_person = models.ImageField('Изображение участника', blank=True, null=True, upload_to="team_images/")
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.last_name} {self.name} - {self.position}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Команда'
|
||||
verbose_name_plural = 'Команда'
|
||||
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
from rest_framework.permissions import IsAuthenticated, AllowAny
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.db import transaction
|
||||
from rest_framework.viewsets import ViewSet
|
||||
from rest_framework import viewsets, status, views
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.decorators import api_view, permission_classes, action
|
||||
from django.contrib.auth.models import User
|
||||
from rest_framework_simplejwt.authentication import JWTAuthentication
|
||||
from rest_framework_simplejwt.exceptions import InvalidToken, AuthenticationFailed
|
||||
from .models import Team
|
||||
from .serializers import TeamSerializer
|
||||
|
||||
|
||||
class TeamViewSet(ViewSet):
|
||||
def list(self, request):
|
||||
queryset = Team.objects.all()
|
||||
serializer = TeamSerializer(queryset, many=True)
|
||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||
|
||||
|
||||
Loading…
Reference in New Issue