#!/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, BaseModelSet from api.base_views import app_delete from api.models import AppReleaseInfo, Apps from common.core.auth import AdminTokenAuthentication from common.core.response import ApiResponse from common.utils.caches import del_cache_response_by_short, get_download_url_by_cache from common.utils.token import verify_token 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='该应用不存在')