diff options
author | Filipp Lepalaan <f@230.to> | 2013-05-12 22:34:53 +0300 |
---|---|---|
committer | Filipp Lepalaan <f@230.to> | 2013-05-12 22:34:53 +0300 |
commit | aaacaebb861beaf2ef39b6bc54db2d12262e9b0d (patch) | |
tree | 2d373fc7d04ab03f87bfe5e4d13f36d6d7bc81a5 /gsxws/returns.py | |
parent | 452005bbb83059913d4c8b7648d9e368936e53da (diff) | |
download | py-gsxws-aaacaebb861beaf2ef39b6bc54db2d12262e9b0d.tar.gz py-gsxws-aaacaebb861beaf2ef39b6bc54db2d12262e9b0d.tar.bz2 py-gsxws-aaacaebb861beaf2ef39b6bc54db2d12262e9b0d.zip |
More speed, more power, less suds, WIP
Diffstat (limited to 'gsxws/returns.py')
-rw-r--r-- | gsxws/returns.py | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/gsxws/returns.py b/gsxws/returns.py new file mode 100644 index 0000000..4584b3e --- /dev/null +++ b/gsxws/returns.py @@ -0,0 +1,156 @@ +from gsxws import GsxObject + +RETURN_TYPES = ( + (1, "Dead On Arrival"), + (2, "Good Part Return"), + (3, "Convert To Stock"), + (4, "Transfer to Out of Warranty"), +) + +CARRIERS = ( + ('XAER', "Aero 2000"), + ('XAIRBEC', "Airborne"), + ('XAIRB', "Airborne"), + ('XARM', "Aramex"), + ('XOZP', "Australia Post"), + ('XBAX', "BAX GLOBAL PTE LTD"), + ('XCPW', "CPW Internal"), + ('XCL', "Citylink"), + ('XDHL', "DHL"), + ('XDHLC', "DHL"), + ('XDZNA', "Danzas-AEI"), + ('XEAS', "EAS"), + ('XEGL', "Eagle ASIA PACIFIC HOLDINGS"), + ('XEXXN', "Exel"), + ('XFEDE', "FedEx"), + ('XFDE', "FedEx Air"), + ('XGLS', "GLS-General Logistics Systems"), + ('XHNF', "H and Friends"), + ('XNGLN', "Nightline"), + ('XPL', "Parceline"), + ('XPRLA', "Purolator"), + ('SDS', "SDS An Post"), + ('XSNO', "Seino Transportation Co. Ltd."), + ('XSTE', "Star Track Express"), + ('XTNT', "TNT"), + ('XUPSN', "UPS"), + ('XUTI', "UTi (Japan) K.K."), + ('XYMT', "YAMATO"), +) + +class Return(GsxObject): + def __init__(self, order_number=None, *args, **kwargs): + super(Returns, self).__init__(*args, **kwargs) + + if order_number is not None: + self.data['returnOrderNumber'] = order_number + + def get_pending(self): + """ + The Parts Pending Return API returns a list of all parts that + are pending for return, based on the search criteria. + + >>> Returns(repairType='CA').get_pending() # doctest: +SKIP + """ + dt = self._make_type('ns1:partsPendingReturnRequestType') + dt.repairData = self.data + + return self.submit('PartsPendingReturn', dt, 'partsPendingResponse') + + def get_report(self): + """ + The Return Report API returns a list of all parts that are returned + or pending for return, based on the search criteria. + """ + dt = self._make_type('ns1:returnReportRequestType') + dt.returnRequestData = self.data + + return self.submit('ReturnReport', dt, 'returnResponseData') + + def get_label(self, part_number): + """ + The Return Label API retrieves the Return Label for a given Return Order Number. + (Type not found: 'comptiaCode') + so we're parsing the raw SOAP response and creating a "fake" return object from that. + """ + if not validate(part_number, 'partNumber'): + raise ValueError('%s is not a valid part number' % part_number) + + class ReturnData(dict): + pass + + rd = ReturnData() + + CLIENT.set_options(retxml=True) + + dt = CLIENT.factory.create('ns1:returnLabelRequestType') + dt.returnOrderNumber = self.data['returnOrderNumber'] + dt.partNumber = part_number + dt.userSession = SESSION + + try: + result = CLIENT.service.ReturnLabel(dt) + except suds.WebFault, e: + raise GsxError(fault=e) + + el = ET.fromstring(result).findall('*//%s' % 'returnLabelData')[0] + + for r in el.iter(): + k, v = r.tag, r.text + if k in ['packingList', 'proformaFileData', 'returnLabelFileData']: + v = base64.b64decode(v) + of = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) + of.write(v) + v = of.name + + setattr(rd, k, v) + + return rd + + def get_proforma(self): + """ + The View Bulk Return Proforma API allows you to view the proforma label + for a given Bulk Return Id. You can create a parts bulk return + by using the Register Parts for Bulk Return API. + """ + pass + + def register_parts(self, parts): + """ + The Register Parts for Bulk Return API creates a bulk return for + the registered parts. + The API returns the Bulk Return Id with the packing list. + """ + dt = self._make_type("ns1:registerPartsForBulkReturnRequestType") + self.data['bulkReturnOrder'] = parts + dt.bulkPartsRegistrationRequest = self.data + + result = self.submit("RegisterPartsForBulkReturn", dt, "bulkPartsRegistrationData") + + pdf = base64.b64decode(result.packingList) + of = tempfile.NamedTemporaryFile(suffix=".pdf", delete=False) + of.write(pdf) + result.packingList = of.name + + return result + + def update_parts(self, confirmation, parts): + """ + The Parts Return Update API allows you to mark a part + with the status GPR(2), DOA(1), CTS(3), or TOW(4). + The API can be used only by ASP. + + >>> Returns().update_parts('G135877430',\ + [{'partNumber': '661-5174',\ + 'comptiaCode': 'Z29',\ + 'comptiaModifier': 'A',\ + 'returnType': 2}]) + """ + dt = self._make_type("ns1:partsReturnUpdateRequestType") + repairData = { + 'repairConfirmationNumber': confirmation, + 'orderLines': parts + } + dt.repairData = repairData + result = self.submit("PartsReturnUpdate", dt) + return result |