cma_search/server/apps/vod/views.py

119 lines
4.4 KiB
Python

from datetime import timedelta
from time import timezone
from rest_framework.mixins import ListModelMixin
from apps.vod.serializers import VRecordSerializer, VRecordUpdateSerializer, VideoSerializer
from apps.vod.models import Video, ViewRecord
from django.shortcuts import render
from .vodclient import getAllClass, searchMedia, getSignature
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet, ModelViewSet
from utils.pagination import PageOrNot
from apps.system.mixins import CreateUpdateModelAMixin
from rest_framework.decorators import action, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.status import HTTP_400_BAD_REQUEST
from django.utils import timezone
# Create your views here.
class ClassView(APIView):
perms_map={'get':'*'}
def get(self, request, format=None):
"""
查询分类
"""
return getAllClass()
class VideoView(APIView):
perms_map={'get':'video_view'}
def get(self, request, format=None):
"""
查询视频
"""
params={'Filters':['basicInfo', 'metaData']}
params['Offset'] = request.query_params.get('Offset', 0)
params['Limit'] = request.query_params.get('Limit', 20)
params['Names'] = request.query_params.getlist('name') if request.query_params.get('name') else []
params['ClassIds']= request.query_params.getlist('classid') if request.query_params.get('classid') else []
return searchMedia(params)
class VideoViewSet(PageOrNot, CreateUpdateModelAMixin, ModelViewSet):
perms_map={'get':'video_view', 'post':'video_create', 'put':'video_update', 'delete':'video_delete'}
queryset = Video.objects.all()
search_fields = ['name', 'category__name', 'description']
filterset_fields = ['category']
serializer_class = VideoSerializer
ordering = ['-views', '-create_time']
@action(methods=['get'], detail=False, perms_map={'get':'video_view'})
def myview(self, request, *args, **kwargs):
"""
个人观看记录
"""
queryset = ViewRecord.objects.filter(user=request.user).order_by('-id')
page = self.paginate_queryset(queryset)
if page is not None:
serializer = VRecordSerializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = VRecordSerializer(queryset, many=True)
return Response(serializer.data)
class VRecordViewSet(ListModelMixin, GenericViewSet):
perms_map = {'get':'viewrecord_view'}
queryset = ViewRecord.objects.all()
search_fields = ['user__name', 'video__name']
serializer_class = VRecordSerializer
ordering = ['-update_time']
class MyViewRecordAPIView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, id , format=None):
"""
该视频的本人观看信息
"""
try:
video = Video.objects.get(pk=id)
except:
return Response('视频不存在', status=HTTP_400_BAD_REQUEST)
record, _ = ViewRecord.objects.get_or_create(video=video, user=request.user, defaults={'video':video, 'user':request.user})
serializer = VRecordSerializer(instance=record)
return Response(serializer.data)
def put(self, request, id, format=None):
"""
更新该视频本人的观看信息
params: {current:int}
"""
try:
video = Video.objects.get(pk=id)
except:
return Response('视频不存在', status=HTTP_400_BAD_REQUEST)
record, fcreated = ViewRecord.objects.get_or_create(video=video, user=request.user, defaults={'video':video, 'user':request.user})
if fcreated:
video.viewsp = video.viewsp + 1
video.views = video.views + 1
record.views = 1
video.save()
if request.data.get('current', None):
record.current = request.data.get('current')
if timezone.now() > record.update_time + timedelta(hours=6):
record.views = record.views + 1
video.views = video.views + 1
video.save()
record.save()
return Response()
class SignatureAPIView(APIView):
perms_map={'get':'video_create'}
def get(self, request, format=None):
"""
获取上传签名
"""
return Response(getSignature(procedure=request.query_params.get('procedure', None)))