views.py 6.74 KB
import os
import time
import random
from django.utils import timezone
from django.db.utils import IntegrityError
from django.db.models import Q
from webargs import fields, validate
from webargs.djangoparser import use_args, parser
from settings import conf
from common import response
from common.mixins import GenericView
from common.tools.file_tools import file_write
from common.redis_cache import redis_handler as rh
from .models import UploadDocRecords, DocStatus
from .mixins import DocHandler

# Create your views here.


# restframework将request.body封装至request.data, webargs从request.data中获取参数
@parser.location_loader("data")
def load_data(request, schema):
    return request.data


application_data_args = {'applicationId': fields.Str(required=True, validate=validate.Length(max=64))}

applicant_data_args = {
    'mainApplicantName': fields.Str(required=True, validate=validate.Length(max=16)),
    'coApplicantName': fields.Str(required=True, validate=validate.Length(max=16)),
    'guarantor1Name': fields.Str(required=True, validate=validate.Length(max=16)),
    'guarantor2Name': fields.Str(required=True, validate=validate.Length(max=16)),
}

document_args = {
    'documentName': fields.Str(required=True, validate=validate.Length(max=255)),
    # Acceptance/Settlement/Contract Management
    'documentScheme': fields.Str(required=True, validate=validate.Length(max=64)),
    'businessType': fields.Str(required=True, validate=validate.Length(max=64)),    # CO00001/CO00002
    'uploadFinishTime': fields.DateTime(required=True),
    'dataSource': fields.Str(required=True, validate=validate.Length(max=64)),  # POS/EAPP/Econtract
    'metadataVersionId': fields.Str(required=True, validate=validate.Length(max=64)),
}

doc_upload_args = {
    'applicationData': fields.Nested(application_data_args, required=True),
    'applicantData': fields.Nested(applicant_data_args, required=True),
    'document': fields.Nested(document_args, required=True),
}

doc_list_args = {
    'status': fields.Int(required=False,
                         validate=validate.OneOf(DocStatus.get_value_lst())),
    'application_id': fields.Str(required=False, validate=validate.Length(max=64)),
    'data_source': fields.Str(required=False, validate=validate.Length(max=64)),
    'business_type': fields.Str(required=False, validate=validate.Length(max=64)),
    'upload_finish_time': fields.Date(required=False),
    'create_time': fields.Date(required=False),
}

upload_pdf_args = {
    'pdf_file': fields.Raw(required=True),
}


class UploadDocView(GenericView):
    permission_classes = []

    # 上传(接收)文件接口
    @use_args(doc_upload_args, location='data')
    def post(self, request, args):
        application_data = args.get('applicationData')
        applicant_data = args.get('applicantData')
        document = args.get('document')
        try:
            doc = UploadDocRecords.objects.create(
                metadata_version_id=document.get('metadataVersionId'),
                application_id=application_data.get('applicationId'),
                main_applicant=applicant_data.get('mainApplicantName'),
                co_applicant=applicant_data.get('coApplicantName'),
                guarantor_1=applicant_data.get('guarantor1Name'),
                guarantor_2=applicant_data.get('guarantor2Name'),
                document_name=document.get('documentName'),
                document_scheme=document.get('documentScheme'),
                business_type=document.get('businessType'),
                data_source=document.get('dataSource'),
                upload_finish_time=document.get('uploadFinishTime'),
            )
        except IntegrityError as e:
            self.running_log.info('[doc upload fail] [args={0}] [err={1}]'.format(args, e))
            self.invalid_params(msg='metadataVersionId repeat')
        else:
            # TODO 查询加入优先队列 or 普通队列
            rh.enqueue(doc.id)
            self.running_log.info('[doc upload success] [args={0}]'.format(args))
            return response.ok()

    post.openapi_doc = '''
    tags: [doc]
    summary: POS系统上传文件信息
    consumes: [application/json]
    produces: [application/json]
    parameters:
    - in: body
      name: body
      required: true
      schema:
        $ref: "#/definitions/Doc"

    responses:
      200:
        description: ok
        schema:
          $ref: '#/definitions/ApiResponse'
    '''


class DocView(GenericView, DocHandler):

    # 文件列表页
    @use_args(doc_list_args, location='querystring')
    def get(self, request, args):
        status = args.get('status')
        application_id = args.get('application_id')
        data_source = args.get('data_source')
        business_type = args.get('business_type')
        upload_finish_time = args.get('upload_finish_time')
        create_time = args.get('create_time')
        status_query = Q(status=status) if status else Q()
        application_id_query = Q(application_id=application_id) if application_id else Q()
        data_source_query = Q(data_source=data_source) if data_source else Q()
        business_type_query = Q(business_type=business_type) if business_type else Q()
        upload_finish_time_query = Q(upload_finish_time=upload_finish_time) if upload_finish_time else Q()
        create_time_query = Q(create_time=create_time) if create_time else Q()
        query = status_query & application_id_query & data_source_query & business_type_query\
                & upload_finish_time_query & create_time_query
        doc_queryset = UploadDocRecords.objects.filter(query).values(
            'id', 'application_id', 'upload_finish_time', 'create_time', 'business_type', 'data_source')
        doc_list = self.get_doc_list(doc_queryset)
        return response.ok(data=doc_list)

    # 上传pdf,模拟下单
    @use_args(upload_pdf_args, location='files')
    def post(self, request, args):
        const_str = '手工单'
        doc = UploadDocRecords.objects.create(
            metadata_version_id=str(int(time.time())),
            application_id=const_str,
            main_applicant=const_str,
            co_applicant=const_str,
            guarantor_1=const_str,
            guarantor_2=const_str,
            document_name=const_str,
            document_scheme=random.choice(['Acceptance', 'Settlement', 'Contract Management']),
            business_type=random.choice(['AFC', 'HIL']),
            data_source=random.choice(['POS', 'EAPP', 'Econtract']),
            upload_finish_time=timezone.now(),
        )
        rh.enqueue(doc.id)

        pdf_file = args.get('pdf_file')
        file_save_path = os.path.join(conf.DATA_DIR, doc.id, '{0}.pdf'.format(doc.id))
        file_write(pdf_file, file_save_path)
        self.running_log.info('[doc upload success] [args={0}]'.format(args))
        return response.ok()