edms.py 2.5 KB
import requests
from zeep import Client
from settings import conf
from . import consts
from common.redis_cache import redis_handler as rh


class EDMS:

    def __init__(self, user_name, pwd):
        self.sm_client = Client(wsdl=conf.SM_WSDL)
        self.dm_client = Client(wsdl=conf.DM_WSDL)
        self.df_client = Client(wsdl=conf.DF_WSDL)
        self.download_url = conf.EDMS_DOWNLOAD_URL
        self.user_name = user_name
        self.pwd = pwd
        self.session_id = None

    def set_session_id(self):
        self.session_id = self.sm_client.service.StartSession(login=self.user_name,
                                                              password=self.pwd,
                                                              clientType=consts.CUSTOM_CLIENT)
        rh.set_session_id(self.session_id)
        return self.session_id

    def get_session_id(self):
        if self.session_id is None:
            # redis获取session_id
            self.session_id = rh.get_session_id()
            if self.session_id is None:
                return self.set_session_id()
        # 验证session_id
        is_session_valid = self.sm_client.service.IsSessionValid(sessionId=self.session_id, keepAlive=False)
        if is_session_valid is True:
            return self.session_id
        return self.set_session_id()

    def get_download_token(self, headers, metadata_version_id):
        with self.dm_client.settings(extra_http_headers=headers):
            res = self.dm_client.service.PrepareSingleDocumentToDownload(metadataVersionId=metadata_version_id,
                                                                         token=consts.FIXED_TOKEN,
                                                                         fileSize=consts.FIXED_FILE_SIZE,
                                                                         actionType=consts.DOWNLOAD_ACTION_TYPE)
        return res.token

    def download(self, save_path, metadata_version_id):
        session_id = self.get_session_id()
        headers = {'Cookie': '{0}={1}'.format(consts.SESSION_PREFIX, session_id)}
        token = self.get_download_token(headers, metadata_version_id)
        params = {'token': token}

        r = requests.get(self.download_url, params=params, headers=headers, stream=True)
        with open(save_path, "wb") as f:
            # chunk是指定每次写入的大小,每次只写了512byte
            for chunk in r.iter_content(chunk_size=512):
                if chunk:
                    f.write(chunk)
                    f.flush()