def _upload_spreadsheet(self, usage_file, spreadsheet): # type: (UsageFile, openpyxl.Workbook) -> None # Generate spreadsheet file with NamedTemporaryFile() as tmp: spreadsheet.save(tmp) tmp.seek(0) file_contents = tmp.read() # Setup request url = '{}usage/files/{}/upload/'.format(self.config.api_url, usage_file.id) headers = self._api.headers headers['Accept'] = 'application/json' del headers[ 'Content-Type'] # This must NOT be set for multipart post requests multipart = {'usage_file': ('usage_file.xlsx', file_contents)} self.logger.info('HTTP Request: {} - {} - {}'.format( url, headers, multipart)) # Post request try: content, status = self._api.post(url=url, headers=headers, files=multipart) except requests.RequestException as ex: raise FileCreationError('Error uploading file: {}'.format(ex)) self.logger.info('HTTP Code: {}'.format(status)) if status != 201: msg = 'Unexpected server response, returned code {}'.format(status) self.logger.error('{} -- Raw response: {}'.format(msg, content)) raise FileCreationError(msg)
def _create_usage_file(self, usage_file): # type: (UsageFile) -> UsageFile if not usage_file.name or not usage_file.product.id or not usage_file.contract.id: raise FileCreationError( 'Usage File Creation requires name, product id, contract id') if not usage_file.description: # Could be because description is empty or None, so make sure it is empty usage_file.description = '' response, _ = self._api.post(json=usage_file.json) return self.model_class.deserialize(response)