def send_request(self, action, method='GET', data=None, filter=None, json_output=True): """Zašle request pre SF API :param action: URL akcie :type action: basestring :param method: HTTP metóda (GET alebo POST) :type method: basestring :param data: Dodatočné dáta posielané na SF API :type data: dict :param filter: Reťazec filtrovania výsledku :type filter: basestring :param json_output: Indikuje, či je výsledok interpretovaný ako JSON dáta :type json_output: bool :return: Dáta získané z SF API v stanovenom formáte (JSON/RAW) :type return: dict/basestring :raise: SFAPIException v prípade, že SF API odpovedalo chbovým HTTP status kódom """ url_portions = [self.sfapi_base_url, action] if filter: url_portions.append(filter) url = "".join(url_portions) req = requests.request(method, url, data=data, headers=self.auth_header) if req.status_code != requests.codes.ok: error_data = { 'method': method, 'action': action, 'code': req.status_code } raise SFAPIException( '%(method)s on %(action)s failed with status code %(code)d' % error_data) if json_output: returned_string = json.loads(req.text) if 'error' in returned_string and returned_string['error'] == 1: logging.error("Error message {}".format(req.content)) raise SFAPIException('Error while call: %(error_message)s' % returned_string) else: return returned_string else: return req.content
def create_invoice(self, invoice): """ Vytvorí v SF faktúru :param invoice: Objekt faktúry :type invoice: SFInvoice :return: :raise: """ if not isinstance(invoice, SFInvoice): raise SFAPIException('Passed invoice is not SFInvoice instance!') data = { 'Client': invoice.client.params, 'Invoice': invoice.params, 'InvoiceItem': [] } for item in invoice.items: data['InvoiceItem'].append(item.params) retv = self.send_request(self.create_invoice_url, method='POST', data={'data': json.dumps(data)}) if retv['error'] == 0: invoice_id = retv['data']['Invoice']['id'] logger.info('Created invoice id {}'.format(invoice_id)) invoice.id = invoice_id else: err_no = retv['error'] err_msg = retv['error_message'] logger.error('Unable to create invoice - errors {} {}'.format( err_no, err_msg)) return retv
def add_item(self, item): """ @param item:SFExpenseItem instance """ if not isinstance(SFExpenseItem, item): raise SFAPIException('Passed object is not a SFExpenseItem instance') if self.items: self.items.append(item) else: self.items = [item]
def construct_filter(self, params): """ Vytvor filter string použiteľný v URL na základe zadaného slovníka :param params: :return: string vygenerovaný zo slovníka """ if not isinstance(params, dict): raise SFAPIException('Filter parameters must be a dictionary') filter_url = [] for (k, v) in params.items(): filter_url.append("".join(['/', k, ':', str(v)])) return "".join(filter_url)
def create_invoice(self, invoice): """ Vytvorí v SF faktúru :param invoice: Objekt faktúry :type invoice: SFInvoice :return: :raise: """ if not isinstance(invoice, SFInvoice): raise SFAPIException('Passed invoice is not SFInvoice instance!') data = {'Client': invoice.client.params, 'Invoice': invoice.params, 'InvoiceItem': []} for item in invoice.items: data['InvoiceItem'].append(item.params) return self.send_request(self.create_invoice_url, method='POST', data={'data': json.dumps(data)})
def create_contact(self, contact): """ Vytvorí v SF kontakt :param contact: Objekt kontaktu :type contact: SFInvoiceClient :return: :raise: """ if not isinstance(contact, SFInvoiceClient): raise SFAPIException( 'Passed invoice is not SFInvoiceClient instance!') data = {'Client': contact.params} return self.send_request(self.create_contact_url, method='POST', data={'data': json.dumps(data)})
def edit_invoice(self, invoice): if not isinstance(invoice, SFInvoice): raise SFAPIException('Passed invoice is not SFInvoice instance!') data = {'Invoice': invoice.params, 'InvoiceItem': []} for item in invoice.items: data['InvoiceItem'].append(item.params) retv = self.send_request(self.edit_invoice_url, method='POST', data={'data': json.dumps(data)}) if retv.get('error', 0) == 0: invoice_id = retv['data']['Invoice']['id'] logger.info('Updated invoice id {}'.format(invoice_id)) invoice.id = invoice_id else: err_no = retv.get('error', None) err_msg = retv.get('error_message', None) logger.error('Unable to update invoice - errors {} {}'.format( err_no, err_msg)) return retv