Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
4e3ceb30ce
|
|
@ -17,3 +17,4 @@ server/proj/conf/settings/__init__.py
|
|||
__pycache__
|
||||
media/
|
||||
env/
|
||||
db.sqlite3
|
||||
|
|
@ -10,7 +10,7 @@ from rest_framework.permissions import AllowAny
|
|||
class FetchAndServeFile(ViewSet):
|
||||
#http://82.97.242.49:10084/api/station/it-radio/file/5196269acd9d54e86297557a6d9a7aab/
|
||||
def list(self, request):
|
||||
file_url = f"http://82.97.242.49:10084/api/station/it-radio/file/fc6377b2dae75d29358783bc/play"
|
||||
file_url = f"http://82.97.242.49:10084/api/station/it-radio/file/fc6377b2dae75d29358783bc"
|
||||
api_key = "49226d3488aac3f5:18d88659c6c1c5e131a0ce0a94d55235"
|
||||
|
||||
headers = {
|
||||
|
|
@ -19,8 +19,9 @@ class FetchAndServeFile(ViewSet):
|
|||
|
||||
try:
|
||||
response = requests.get(file_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
|
||||
response.raise_for_status()
|
||||
print(response.content)
|
||||
# Create a response with the appropriate content type and headers
|
||||
file_response = HttpResponse(response.content, content_type='audio/mpeg')
|
||||
file_response['Content-Disposition'] = 'attachment; filename="output.mp3"'
|
||||
|
|
|
|||
|
|
@ -20,9 +20,19 @@ class Song(models.Model):
|
|||
|
||||
def __str__(self):
|
||||
return f"{self.artist} - {self.title}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Треки'
|
||||
verbose_name_plural = 'Треки'
|
||||
|
||||
|
||||
class FavoriteSong(models.Model):
|
||||
song = models.ForeignKey(Song, verbose_name='Трек', on_delete=models.CASCADE, null=True, blank=True)
|
||||
user = models.ForeignKey(MyUser, verbose_name='Пользователь', on_delete=models.CASCADE, blank=True, null=True)
|
||||
def __str__(self):
|
||||
return f"{self.song.title}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Избранные Треки'
|
||||
unique_together = ('song', 'user')
|
||||
verbose_name_plural = 'Избранные Треки'
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ class DeleteSongSchema(AutoSchema):
|
|||
def get_serializer_fields(self, path, method):
|
||||
return [
|
||||
coreapi.Field(
|
||||
name='song_id',
|
||||
name='azura_id',
|
||||
location='form',
|
||||
required=False,
|
||||
schema=coreschema.String(description='ID трека')
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ 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 django.http import HttpResponse
|
||||
|
||||
from .schemas import SongSchema, DeleteSongSchema
|
||||
from .models import Song, FavoriteSong
|
||||
|
|
@ -39,6 +40,33 @@ class SongViewSet(GenericViewSet):
|
|||
return Response(serializer.data)
|
||||
|
||||
|
||||
@action(
|
||||
detail=False,
|
||||
methods=['get'],
|
||||
url_path='get_audio/(?P<azura_id>[a-zA-Z0-9_]+)',
|
||||
url_name='get_audio',
|
||||
)
|
||||
def get_audio(self, request, azura_id):
|
||||
try:
|
||||
song_obj = Song.objects.get(azura_id=azura_id)
|
||||
file_url = f"http://82.97.242.49:10084/api/station/it-radio/file/{song_obj.azura_id}/play"
|
||||
API_KEY = "49226d3488aac3f5:18d88659c6c1c5e131a0ce0a94d55235"
|
||||
headers = {
|
||||
"Authorization": f"Bearer {API_KEY}"
|
||||
}
|
||||
response = requests.get(file_url, headers=headers)
|
||||
response.raise_for_status()
|
||||
|
||||
file_response = HttpResponse(response.content, content_type='audio/mpeg')
|
||||
file = f'{song_obj.title}-{song_obj.artist}.mp3'
|
||||
file_response['Content-Disposition'] = f'attachment; filename={file}'
|
||||
return file_response
|
||||
|
||||
except ObjectDoesNotExist:
|
||||
return Response({"error": 'Объекта не существует'}, status=status.HTTP_404_NOT_FOUND)
|
||||
|
||||
|
||||
|
||||
@action(detail=False, methods=['post'], schema=SongSchema())
|
||||
def add_favorite(self, request):
|
||||
data = None
|
||||
|
|
@ -75,7 +103,7 @@ class SongViewSet(GenericViewSet):
|
|||
@action(detail=False, methods=['post'], schema=DeleteSongSchema())
|
||||
def delete_song(self, request):
|
||||
try:
|
||||
item = FavoriteSong.objects.get(user=request.user, song=request.data.get('song_id'))
|
||||
item = FavoriteSong.objects.get(user=request.user, song=request.data.get('azura_id'))
|
||||
item.delete()
|
||||
return Response(status=status.HTTP_202_ACCEPTED)
|
||||
except ObjectDoesNotExist:
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -6,7 +6,7 @@ ALLOWED_HOSTS = ['*']
|
|||
|
||||
# Database
|
||||
# https://docs.djangoproject.com/en/3.2/ref/settings/#databases
|
||||
DATABASES = {
|
||||
""" DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||
'NAME': 'it_radio',
|
||||
|
|
@ -15,6 +15,12 @@ DATABASES = {
|
|||
'HOST': 'localhost',
|
||||
'PORT': '5433',
|
||||
},
|
||||
} """
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.sqlite3',
|
||||
'NAME': BASE_DIR / 'db.sqlite3',
|
||||
}
|
||||
}
|
||||
|
||||
REST_FRAMEWORK['DEFAULT_PERMISSION_CLASSES'] = ('rest_framework.permissions.AllowAny',)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,6 @@ from rest_framework_simplejwt.views import (
|
|||
TokenVerifyView,
|
||||
)
|
||||
from django.conf.urls.static import static
|
||||
from news import views as newsViews
|
||||
from rest_framework import routers
|
||||
from userProfile.views import TeamViewSet
|
||||
from django.conf import settings
|
||||
|
|
@ -17,7 +16,6 @@ from audio.views import SongViewSet
|
|||
|
||||
|
||||
router = routers.DefaultRouter()
|
||||
router.register(r'news', newsViews.NewsViewSet)
|
||||
router.register(r'teams', TeamViewSet, basename='teams')
|
||||
router.register(r'rubriks', RubricViewSet, basename='rubriks')
|
||||
router.register(r'song', SongViewSet, basename='song')
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
from django.contrib import admin
|
||||
from .models import ConfigSite
|
||||
|
||||
@admin.register(ConfigSite)
|
||||
class ConfigSiteAdmin(admin.ModelAdmin):
|
||||
list_display = ('id', 'social_name', 'social_url')
|
||||
|
|
@ -1,12 +1,13 @@
|
|||
from django.db import models
|
||||
|
||||
class ConfigSite(models.Model):
|
||||
social_name = models.CharField('Название социальной сети', max_length=100)
|
||||
social_url = models.CharField('Социальная сеть', max_length=100)
|
||||
|
||||
def __str__(self):
|
||||
return self.social_name
|
||||
class Page(models.Model):
|
||||
name = models.CharField('Название страницы', max_length=50)
|
||||
title_1 = models.TextField('Главный заголовок на странице', null=True, blank=True, max_length=300)
|
||||
title_2 = models.TextField('Второй заголовок на странице', null=True, blank=True, max_length=300)
|
||||
title_3 = models.TextField('Третий заголовок на странице', null=True, blank=True, max_length=300)
|
||||
video = models.FileField('Видео', upload_to='videos/', null=True, blank=True)
|
||||
img = models.ImageField('Изображение', blank=True, null=True, upload_to="images/")
|
||||
title_4 = models.TextField('Заголовок "Поддержи нас" ', null=True, blank=True, max_length=200)
|
||||
|
||||
class Meta:
|
||||
verbose_name = 'Настройки сайта'
|
||||
verbose_name_plural = 'Настройки сайта'
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
|
|
|||
|
|
@ -1,3 +1,11 @@
|
|||
from django.shortcuts import render
|
||||
from rest_framework.viewsets import ViewSet, 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
|
||||
|
||||
# Create your views here.
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,8 +0,0 @@
|
|||
from django.contrib import admin
|
||||
from .models import News
|
||||
|
||||
class NewsAdmin(admin.ModelAdmin):
|
||||
list_display = ('name', 'date') # поля, которые будут отображаться
|
||||
ordering = ('-date',) # сортировка по дате в обратном порядке
|
||||
|
||||
admin.site.register(News, NewsAdmin)
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1,8 +1,8 @@
|
|||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
|
||||
class News(models.Model):
|
||||
name = models.CharField(max_length=255)
|
||||
description = models.TextField()
|
||||
date = models.DateTimeField(blank=True)
|
||||
author = models.CharField(max_length=255, blank=True)
|
||||
class HistoryRadio(models.Model):
|
||||
description = models.CharField('Описание события кратко', max_length=50)
|
||||
date = models.DateField('Дата события', default=timezone.now, null=True)
|
||||
def __str__(self):
|
||||
return f"{self.date}: {self.description}"
|
||||
|
|
|
|||
|
|
@ -1,7 +0,0 @@
|
|||
from rest_framework import serializers
|
||||
from .models import News
|
||||
|
||||
class NewsSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = News
|
||||
fields = ['id', 'name', 'description', 'date', 'author']
|
||||
|
|
@ -1,8 +1 @@
|
|||
from rest_framework import viewsets
|
||||
from .models import News
|
||||
|
||||
from news.serializers import NewsSerializer
|
||||
|
||||
class NewsViewSet(viewsets.ModelViewSet):
|
||||
queryset = News.objects.all()
|
||||
serializer_class = NewsSerializer
|
||||
from .models import HistoryRadio
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue