This commit is contained in:
Norbaev 2024-06-25 17:53:54 +05:00
commit 38b88d8730
59 changed files with 73 additions and 258 deletions

View File

@ -0,0 +1,8 @@
# IT-Рadio
IT-Радио — радиостанция про сферу технологийи развитие в IT
![Static Badge](https://img.shields.io/badge/Flexites-blue?link=https%3A%2F%2Fflexites.org%2F)
![Static Badge](https://img.shields.io/badge/AzuraCast-blue?link=https%3A%2F%2Fwww.azuracast.com%2F)
![Static Badge](https://img.shields.io/badge/Python-yellow?logo=python&logoSize=3&labelColor=yellow&color=blue&cacheSeconds=https%3A%2F%2Fwww.python.org%2F&link=https%3A%2F%2Fwww.python.org%2F)
![Static Badge](https://img.shields.io/badge/Quasar-white?logo=Quasar&logoSize=3&labelColor=blue&link=https%3A%2F%2Fquasar.dev%2F)
![Static Badge](https://img.shields.io/badge/Django-blue?logo=Django&logoSize=3&labelColor=black&link=https%3A%2F%2Fwww.djangoproject.com%2F)

View File

@ -1,6 +0,0 @@
from django.apps import AppConfig
class ApiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'api'

View File

@ -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)

View File

@ -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)

View File

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

View File

@ -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

View File

@ -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)

View File

@ -42,10 +42,7 @@ INSTALLED_APPS = [
'news',
'rubricks',
'loginApi',
'userProfile',
'audio',
'api',
'account',
'config_site'

View File

@ -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

View File

@ -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'),

View File

@ -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')

View File

@ -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 = 'Команда'

View File

@ -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):

View File

@ -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)

View File

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

View File

@ -1,6 +0,0 @@
from django.apps import AppConfig
class LoginapiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'loginApi'

View File

@ -1,3 +0,0 @@
from django.db import models
# Create your models here.

View File

@ -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

View File

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

View File

@ -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) """

View File

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

View File

@ -1,6 +0,0 @@
from django.apps import AppConfig
class SchedulerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'scheduler'

View File

@ -1,3 +0,0 @@
from django.db import models
# Create your models here.

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

@ -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')

View File

@ -1,6 +0,0 @@
from django.apps import AppConfig
class UserprofileConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'userProfile'

View File

@ -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': 'Команда',
},
),
]

View File

@ -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 = 'Команда'

View File

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

View File

@ -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)