mixins.py 2.57 KB
import re
from .named_enum import DocStatus
from .models import HILDoc, AFCDoc
from . import consts


class DocHandler:

    @staticmethod
    def xss_pass(file):
        for pno in range(file.pageCount):
            page = file.loadPage(pno)
            page_text = page.getText()
            if re.search(r'/JS(.*)', page_text) and re.search(r'/S /JavaScript', page_text):
                return False
        return True

    @staticmethod
    def get_name(info, key, length):
        if not isinstance(info, dict):
            return ''
        src_name = info.get(key, '')
        if len(src_name) < length:
            return src_name
        else:
            return consts.LONG_NAME

    @staticmethod
    def get_link(doc_id, business_type, file='pdf'):
        if file == 'pdf':
            return '/data/{1}/{2}/{0}/{0}.pdf'.format(doc_id, business_type, consts.TMP_DIR_NAME)
        elif file == 'img':
            return '/data/{1}/{2}/{0}/{0}_img.zip'.format(doc_id, business_type, consts.TMP_DIR_NAME)
        elif file == 'src_excel':
            return '/data/{1}/{2}/{0}/src.xlsx'.format(doc_id, business_type, consts.TMP_DIR_NAME)
        else:
            return '/data/{1}/{2}/{0}/{0}.xlsx'.format(doc_id, business_type, consts.TMP_DIR_NAME)

    def get_doc_list(self, doc_queryset, business_type):
        for doc_dict in doc_queryset:
            if doc_dict['status'] not in [DocStatus.COMPLETE.value, DocStatus.UPLOAD_FAILED.value]:
                continue
            doc_id = doc_dict.get('id')
            doc_dict['pdf_link'] = self.get_link(doc_id, business_type)
            doc_dict['img_link'] = self.get_link(doc_id, business_type, file='img')
            doc_dict['excel_link'] = self.get_link(doc_id, business_type, file='excel')
            doc_dict['src_excel_link'] = self.get_link(doc_id, business_type, file='src_excel')
        return list(doc_queryset)

    @staticmethod
    def get_doc_class(business_type):
        return (HILDoc, consts.HIL_PREFIX) if business_type in consts.HIL_SET else (AFCDoc, consts.AFC_PREFIX)

    @staticmethod
    def fix_scheme(scheme):
        if scheme in consts.DOC_SCHEME_LIST:
            return scheme
        elif scheme.upper() in consts.DOC_SCHEME_LIST:
            return scheme.upper()
        else:
            return consts.DOC_SCHEME_LIST[0]

    @staticmethod
    def fix_data_source(data_source):
        if data_source in consts.DATA_SOURCE_LIST:
            return data_source
        elif data_source.upper() in consts.DATA_SOURCE_LIST:
            return data_source.upper()
        else:
            return consts.DATA_SOURCE_LIST[0]