Пример #1
0
    def _render(self):

        conversion_info = self.get_crex_info()
        conversion_info['status'] = CREX_STATUS_RUNNING
        conversion_info[
            'running_since'] = datetime.datetime.utcnow().isoformat()
        self.set_crex_info(conversion_info)
        transaction.commit()

        try:
            result = self._render2()
            conversion_info['status'] = CREX_STATUS_SUCCESS
            conversion_info[
                'terminated'] = datetime.datetime.utcnow().isoformat()
            self.set_crex_info(conversion_info)
            return result
        except Exception as e:
            LOG.error(e, exc_info=True)
            conversion_info['status'] = CREX_STATUS_ERROR
            conversion_info[
                'terminated'] = datetime.datetime.utcnow().isoformat()
            conversion_info['error'] = str(e)
            self.set_crex_info(conversion_info)
            transaction.commit()
            raise
Пример #2
0
 def timed(self):
     path = self.context.absolute_url(1)
     ts = time.time()
     result = method(self)
     te = time.time()
     s = u'{:>25}(\'{}\')'.format(self.__class__.__name__, path)
     s = s + u': {:2.6f} seconds'.format(te - ts)
     LOG.info(s)
     return result
Пример #3
0
def convert_crex(zip_path, crex_url=None, crex_username=None, crex_password=None):
    """ Send ZIP archive with content to be converted to C-Rex.
        Returns name of ZIP file with converted resources.
    """

    ts = time.time()
    registry = getUtility(IRegistry)
    settings = registry.forInterface(ICRexSettings)

    crex_conversion_url = crex_url or settings.crex_conversion_url
    crex_conversion_username = crex_username or settings.crex_conversion_username
    crex_conversion_password = crex_password or settings.crex_conversion_password
    crex_token = settings.crex_conversion_token

    # Fetch authentication token if necessary (older than one hour)
    crex_token_last_fetched = settings.crex_conversion_token_last_fetched or datetime.datetime(
        2000, 1, 1)
    diff = datetime.datetime.utcnow() - crex_token_last_fetched

    if not crex_token or diff.total_seconds() > 3600:
        f = furl.furl(crex_conversion_url)
        token_url = '{}://{}/api/Token'.format(
            f.scheme, f.host, crex_conversion_url)
        headers = {'content-type': 'application/x-www-form-urlencoded'}
        params = dict(
            username=crex_conversion_username,
            password=crex_conversion_password,
            grant_type='password')
        result = requests.post(token_url, data=params, headers=headers)
        if result.status_code != 200:
            msg = u'Error retrieving DOCX conversion token from webservice (HTTP code {}, Message {})'.format(
                result.status_code, result.text)
            LOG.error(msg)
            raise CRexConversionError(msg)
        data = result.json()
        crex_token = data['access_token']
        settings.crex_conversion_token = crex_token
        settings.crex_conversion_token_last_fetched = datetime.datetime.utcnow()
        LOG.info('Fetching new DOCX authentication token - successful')
    else:
        LOG.info('Fetching DOCX authentication token from Plone cache')

    headers = {'authorization': 'Bearer {}'.format(crex_token)}

    with open(zip_path, 'rb') as fp:
        try:
            LOG.info(u'Starting C-Rex conversion of {}, size {} '.format(zip_path,
                                                                         os.path.getsize(zip_path)))
            result = requests.post(
                crex_conversion_url, files=dict(source=fp), headers=headers)
        except requests.ConnectionError:
            msg = u'Connection to C-REX webservice failed'
            raise CRexConversionError(msg)

        if result.status_code == 200:
            msg = u'Conversion successful (HTTP code {}, duration: {:2.1f} seconds))'.format(
                result.status_code, time.time() - ts)
            LOG.info(msg)
            zip_out = temp_zip(suffix='.zip')
            with open(zip_out, 'wb') as fp:
                fp.write(result.content)
            return zip_out

        else:
            # Forbidden -> invalid token -> invalidate token stored in Plone
            if result.status_code == 401:
                settings.crex_conversion_token = u''
                settings.crex_conversion_token_last_fetched = datetime.datetime(
                    1999, 1, 1)
            msg = u'Conversion failed (HTTP code {}, message {})'.format(
                result.status_code, result.text)
            LOG.error(msg)
            raise CRexConversionError(msg)