| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334 | # -*- encoding: utf-8 -*-"""@File    : AlgorithmShopManageController.py@Time    : 2023/7/25 9:48@Author  : stephen@Email   : zhangdongming@asj6.wecom.work@Software: PyCharm"""import jsonimport timefrom decimal import Decimalfrom django.core.paginator import Paginatorfrom django.views import Viewfrom Model.models import DeviceAlgorithmExplain, DeviceAlgorithmTypefrom Object.AWS.AmazonS3Util import AmazonS3Utilfrom Object.ResponseObject import ResponseObjectfrom Object.TokenObject import TokenObjectfrom Ansjer.config import CONFIG_INFO, CONFIG_EUR, CONFIG_US, CONFIG_TEST, CONFIG_CN, AWS_ACCESS_KEY_ID, \    AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGIONclass AlgorithmShopManageView(View):    def get(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        api_version = kwargs.get('apiVersion')        return self.validation(request.GET, request, operation, api_version)    def post(self, request, *args, **kwargs):        request.encoding = 'utf-8'        operation = kwargs.get('operation')        api_version = kwargs.get('apiVersion')        return self.validation(request.POST, request, operation, api_version)    def validation(self, request_dict, request, operation, api_version='v1'):        token = TokenObject(request.META.get('HTTP_AUTHORIZATION'))        response = ResponseObject()        if token.code != 0:            return response.json(token.code)        ''' 后台管理'''        response = ResponseObject(returntype='pc')        if operation == 'update':            return self.algorithm_update(request_dict, response, api_version)        elif operation == 'query':            return self.algorithm_query(request_dict, response)        elif operation == 'save':            return self.algorithm_save(request, request_dict, response)        elif operation == 'delete':            return self.algorithm_delete(request_dict, response)        elif operation == 'edit':            return self.algorithm_edit(request, request_dict, response)        else:            return response.json(404)    @classmethod    def algorithm_update(cls, request_dict, response, api_version):        try:            a_id = request_dict.get('aId', None)            lang = request_dict.get('lang', None)            title = request_dict.get('title', None)            subtitle = request_dict.get('subtitle', None)            introduction = request_dict.get('introduction', None)            install_explain = request_dict.get('installExplain', None)            concerning = request_dict.get('concerning', None)            risk_warning = request_dict.get('riskWarning', None)            if not all([a_id, lang]):                return response.json()            a_explain_qs = DeviceAlgorithmExplain.objects.filter(algorithm_type_id=int(a_id), lang=lang)            if not a_explain_qs.exists():                return response.json(173)            data = {}            if title:                data['title'] = title            if subtitle:                data['subtitle'] = subtitle            if introduction:                data['introduction'] = introduction            if install_explain:                data['install_explain'] = install_explain            if concerning:                data['concerning'] = concerning            if risk_warning:                data['risk_warning'] = risk_warning            a_explain_qs.update(**data)            return response.json(0)        except Exception as e:            print(repr(e))            return response.json(500)    @classmethod    def algorithm_query(cls, request_dict, response):        algorithm_type = request_dict.get('algorithmType', None)        tag = request_dict.get('tag', None)        status = request_dict.get('status', None)        page = request_dict.get('page', 1)        page_size = request_dict.get('pageSize', 10)        try:            device_algorithm_type_qs = DeviceAlgorithmType.objects.all()            if algorithm_type:                device_algorithm_type_qs = device_algorithm_type_qs.filter(type=algorithm_type)            if tag:                device_algorithm_type_qs = device_algorithm_type_qs.filter(tag=tag)            if status:                device_algorithm_type_qs = device_algorithm_type_qs.filter(status=status)            # 分页            paginator = Paginator(device_algorithm_type_qs.order_by("-sort"), page_size)  # 每页显示 page_size 条            device_algorithm_type_page = paginator.get_page(page)  # 获取当前页的数据            device_algorithm_type_list = []            for device_algorithm_type in device_algorithm_type_page:                device_algorithm_explain_qs = DeviceAlgorithmExplain.objects.filter(                    algorithm_type_id=device_algorithm_type.id)                device_algorithm_explain_list = []                for device_algorithm_explain in device_algorithm_explain_qs:                    device_algorithm_explain_list.append(                        {                            'algorithmExplainId': device_algorithm_explain.id,                            'lang': device_algorithm_explain.lang,                            'title': device_algorithm_explain.title,                            'subtitle': device_algorithm_explain.subtitle,                            'price': device_algorithm_explain.price,                            'introduction': device_algorithm_explain.introduction,                            'installExplain': device_algorithm_explain.install_explain,                            'concerning': device_algorithm_explain.concerning,                            'riskWarning': device_algorithm_explain.risk_warning,                        }                    )                device_algorithm_explain_qs = DeviceAlgorithmExplain.objects.filter(                    algorithm_type_id=device_algorithm_type.id)                translation_num = device_algorithm_explain_qs.count()                device_algorithm_explain = device_algorithm_explain_qs.filter(lang='cn').values("title")                if device_algorithm_explain.exists():                    title = device_algorithm_explain[0]["title"]                else:                    device_algorithm_explain = device_algorithm_explain_qs.values("title")                    if device_algorithm_explain.exists():                        title = device_algorithm_explain[0]["title"]                    else:                        title = ""                device_algorithm_type_list.append({                    "algorithmId": device_algorithm_type.id,                    "title": title,                    "algorithmType": device_algorithm_type.type,                    "memory": device_algorithm_type.memory,                    "downCount": device_algorithm_type.down_count,                    "tag": device_algorithm_type.tag,                    "status": device_algorithm_type.status,                    "expireTime": device_algorithm_type.expire_time if device_algorithm_type.status == 1 else 0,                    "sort": device_algorithm_type.sort,                    "basicFunction": device_algorithm_type.basic_function,                    "imageUrl": device_algorithm_type.image_url,                    "detailsImgUrl": device_algorithm_type.details_img_url,                    "iconUrl": device_algorithm_type.icon_url,                    "resource": device_algorithm_type.resource,                    "deviceAlgorithmExplain": device_algorithm_explain_list,                    "translationNum": translation_num                })            data = {                'list': device_algorithm_type_list,                'total': paginator.count,            }            return response.json(0, data)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def algorithm_save(cls, request, request_dict, response):        algorithm_type = request_dict.get('algorithmType', None)        memory = request_dict.get('memory', "")        tag = request_dict.get('tag', 0)        status = request_dict.get('status', 0)        expire_time = request_dict.get('expireTime', 0)        sort = request_dict.get('sort', 0)        basic_function = request_dict.get('basicFunction', '')        resource = request_dict.get('resource', None)        lang_configs = request_dict.get('langExplainConfig', None)        image_file = request.FILES.get('imageFile', None)        details_img_file = request.FILES.get('detailsImgFile', None)        icon_file = request.FILES.get('iconFile', None)        if not algorithm_type:            return response.json(444)        try:            if lang_configs:                lang_configs = json.loads(lang_configs)            else:                lang_configs = []            device_algorithm_type_qs = DeviceAlgorithmType.objects.filter(type=algorithm_type)            if device_algorithm_type_qs.exists():                return response.json(174)            # 上传图片至存储桶            icon_url = cls.upload_image("app/algorithm-shop/icon/", algorithm_type, icon_file)            image_url = cls.upload_image("app/algorithm-shop/image/", algorithm_type, image_file)            details_img_url = cls.upload_image("app/algorithm-shop/details-img/", algorithm_type, details_img_file)            # 激活时间            expire_time = expire_time if status == 1 else 0            # 创建算法类型            device_algorithm_type = DeviceAlgorithmType.objects.create(type=algorithm_type, memory=memory, tag=tag,                                                                       status=status, expire_time=expire_time,                                                                       sort=sort,                                                                       basic_function=basic_function,                                                                       image_url=image_url,                                                                       details_img_url=details_img_url,                                                                       icon_url=icon_url,                                                                       resource=resource, created_time=int(time.time()))            # 处理算法翻译数据            explain_instances = []            for lang_config in lang_configs:                explain_instance = DeviceAlgorithmExplain(                    algorithm_type_id=int(device_algorithm_type.id),  # 关联的 DeviceAlgorithmType 的 id                    title=lang_config['title'],                    subtitle=lang_config['subtitle'],                    price=Decimal(lang_config['price'] if lang_config['price'] else 0),                    introduction=lang_config['introduction'],                    install_explain=lang_config['installExplain'],                    concerning=lang_config['concerning'],                    risk_warning=lang_config['riskWarning'],                    lang=lang_config['lang'],                    updated_time=int(time.time()),                    created_time=int(time.time())                )                explain_instances.append(explain_instance)            DeviceAlgorithmExplain.objects.bulk_create(explain_instances)            return response.json(0)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))    @classmethod    def algorithm_delete(cls, request_dict, response):        algorithm_id = request_dict.get('algorithmId', None)        if not algorithm_id:            return response.json(444)        DeviceAlgorithmExplain.objects.filter(algorithm_type_id=algorithm_id).delete()        DeviceAlgorithmType.objects.filter(id=algorithm_id).delete()        return response.json(0)    @classmethod    def upload_image(cls, directory, algorithm_type, image_file):        if not image_file:            return ""        bucket = 'ansjerfilemanager'        file_key = directory + f"{CONFIG_INFO}_{algorithm_type}.png"        if CONFIG_INFO == CONFIG_TEST or CONFIG_INFO == CONFIG_CN or CONFIG_INFO == 'local':            prefix_url = "https://ansjerfilemanager.s3.cn-northwest-1.amazonaws.com.cn/"            s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[0], AWS_SECRET_ACCESS_KEY[0], 'cn-northwest-1')        else:            prefix_url = "https://ansjerfilemanager.s3.amazonaws.com/"            s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)        s3.upload_file_obj(            bucket,            file_key,            image_file,            {'ContentType': image_file.content_type, 'ACL': 'public-read'})        return prefix_url + file_key    @classmethod    def algorithm_edit(cls, request, request_dict, response):        algorithm_id = request_dict.get('algorithmId', None)        memory = request_dict.get('memory', '')        tag = request_dict.get('tag', 0)        status = request_dict.get('status', 0)        expire_time = request_dict.get('expireTime', 0)        sort = request_dict.get('sort', 0)        basic_function = request_dict.get('basicFunctions', '')        resource = request_dict.get('resource', None)        lang_configs = request_dict.get('langExplainConfig', None)        image_file = request.FILES.get('imageFile', None)        details_img_file = request.FILES.get('detailsImgFile', None)        icon_file = request.FILES.get('iconFile', None)        if not algorithm_id:            return response.json(444)        try:            device_algorithm_type = DeviceAlgorithmType.objects.get(pk=algorithm_id)            if not device_algorithm_type:                return response.json(173)            algorithm_type = device_algorithm_type.type            if lang_configs:                lang_configs = json.loads(lang_configs)                DeviceAlgorithmExplain.objects.filter(algorithm_type_id=algorithm_id).delete()                # 处理算法翻译数据                explain_instances = []                for lang_config in lang_configs:                    explain_instance = DeviceAlgorithmExplain(                        algorithm_type_id=int(algorithm_id),  # 关联的 DeviceAlgorithmType 的 id                        title=lang_config['title'],                        subtitle=lang_config['subtitle'],                        price=Decimal(lang_config['price'] if lang_config['price'] else 0),                        introduction=lang_config['introduction'],                        install_explain=lang_config['installExplain'],                        concerning=lang_config['concerning'],                        risk_warning=lang_config['riskWarning'],                        lang=lang_config['lang'],                        updated_time=int(time.time()),                        created_time=int(time.time())                    )                    explain_instances.append(explain_instance)                DeviceAlgorithmExplain.objects.bulk_create(explain_instances)            if memory:                device_algorithm_type.memory = memory            if tag:                device_algorithm_type.tag = tag            if status:                device_algorithm_type.status = status                if status == 1 and expire_time:                    device_algorithm_type.expire_time = expire_time            if sort:                device_algorithm_type.sort = sort            if basic_function:                device_algorithm_type.basic_function = basic_function            if resource:                device_algorithm_type.resource = resource            if image_file:                image_url = cls.upload_image("app/algorithm-shop/image/", algorithm_type, image_file)                device_algorithm_type.image_url = image_url            if icon_file:                icon_url = cls.upload_image("app/algorithm-shop/icon/", algorithm_type, icon_file)                device_algorithm_type.icon_url = icon_url            if details_img_file:                details_img_url = cls.upload_image("app/algorithm-shop/details-img/", algorithm_type, details_img_file)                device_algorithm_type.details_img_url = details_img_url            device_algorithm_type.save()            return response.json(0)        except Exception as e:            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
 |