You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
flyapps/fir_ser/admin/views/app.py

93 lines
3.5 KiB

#!/usr/bin/env python
# -*- coding:utf-8 -*-
# project: 4月
# author: liuyu
# date: 2021/4/11
import logging
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import OrderingFilter
from admin.utils.serializer import AdminAppsSerializer, AdminAppReleaseSerializer
from admin.utils.utils import AppsPageNumber, ApiResponse, BaseModelSet
from api.base_views import app_delete
from api.models import AppReleaseInfo, Apps
from api.utils.TokenManager import verify_token
from api.utils.auth import AdminTokenAuthentication
from api.utils.storage.caches import del_cache_response_by_short, get_download_url_by_cache
logger = logging.getLogger(__name__)
class AppsFilter(filters.FilterSet):
min_count_hits = filters.NumberFilter(field_name="count_hits", lookup_expr='gte')
max_count_hits = filters.NumberFilter(field_name="count_hits", lookup_expr='lte')
bundle_id_like = filters.CharFilter(field_name="bundle_id", lookup_expr='icontains')
class Meta:
model = Apps
fields = ["id", "type", "name", "short", "bundle_id", "user_id", "status"]
class AppInfoView(BaseModelSet):
authentication_classes = [AdminTokenAuthentication, ]
queryset = Apps.objects.all()
serializer_class = AdminAppsSerializer
pagination_class = AppsPageNumber
filter_backends = [DjangoFilterBackend, OrderingFilter]
ordering_fields = ['updated_time', 'count_hits', 'created_time']
filterset_class = AppsFilter
def update(self, request, *args, **kwargs):
data = super().update(request, *args, **kwargs).data
del_cache_response_by_short(data.get('app_id'))
return ApiResponse(**data)
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
app_delete(instance)
return ApiResponse()
class AppReleaseInfoView(BaseModelSet):
authentication_classes = [AdminTokenAuthentication, ]
queryset = AppReleaseInfo.objects.all()
serializer_class = AdminAppReleaseSerializer
pagination_class = AppsPageNumber
filter_backends = [DjangoFilterBackend, OrderingFilter]
ordering_fields = ['created_time']
filterset_fields = ("id", "release_id", "app_id")
def update(self, request, *args, **kwargs):
data = super().update(request, *args, **kwargs).data
del_cache_response_by_short(data.get('app_aid'))
return ApiResponse(**data)
def create(self, request, *args, **kwargs):
data = request.data
downtoken = data.get("token", None)
app_id = data.get("app_id", None)
release_id = data.get("release_id", None)
if not downtoken or not app_id or not release_id:
return ApiResponse(code=1004, msg='参数丢失')
if verify_token(downtoken, release_id):
app_obj = Apps.objects.filter(pk=app_id).values("pk", 'user_id', 'type').first()
release_obj = AppReleaseInfo.objects.filter(app_id=app_id, release_id=release_id).count()
if app_obj and release_obj:
if app_obj.get("type") == 0:
app_type = '.apk'
else:
app_type = '.ipa'
download_url, extra_url = get_download_url_by_cache(app_obj, release_id + app_type, 600)
return ApiResponse(data={"download_url": download_url, "extra_url": extra_url})
else:
return ApiResponse(code=1004, msg='token校验失败')
return ApiResponse(code=1006, msg='该应用不存在')