Short and quick class easing use of Poczta Polska e-nadawca WSDL API and WS Tracking API. It exposes service methods and factory types directly on instance.
pip install poczta_polska_enadawca
Define following variables in your project settings:
For e-nadawca:
- POCZTA_POLSKA_API_USERNAME
- POCZTA_POLSKA_API_PASSWORD
- POCZTA_POLSKA_API_SANDBOX_USERNAME
- POCZTA_POLSKA_API_SANDBOX_PASSWORD
For WS Tracking (that's the one you need to register IP and get credentials)
- POCZTA_POLSKA_WSTRACKING_API_USERNAME
- POCZTA_POLSKA_WSTRACKING_API_PASSWORD
After that - use as follows:
from poczta_polska_enadawca.api import PocztaPolskaAPI
PocztaInstance = PocztaPolskaAPI()
PocztaInstance.hello('Poczta API')
And the tracking one....
from poczta_polska_enadawca.ws_tracking_api import PocztaPolskaWSTrackingAPI
PocztaTrackingInstance = PocztaPolskaWSTrackingAPI()
PocztaTrackingInstance.witaj('poczta_polska_enadawca')
from poczta_polska_enadawca.api import PocztaPolskaAPI
from poczta_polska_enadawca.settings import PocztaPolskaSettingsObject
PocztaPolskaSettings = PocztaPolskaSettingsObject()
PocztaPolskaSettingsObject.POCZTA_POLSKA_API_USERNAME = 'foo'
PocztaPolskaSettingsObject.POCZTA_POLSKA_API_PASSWORD = 'bar'
PocztaPolskaSettingsObject.POCZTA_POLSKA_API_SANDBOX_USERNAME = 'foo'
PocztaPolskaSettingsObject.POCZTA_POLSKA_API_SANDBOX_PASSWORD = 'bar'
PocztaInstance = PocztaPolskaAPI(initZeep=False) #we're not executing default init
PocztaInstance.set_config(PocztaPolskaSettings) #provide the object with settings defined above
PocztaInstance.init_zeep() #initialize zeep
That should be working at this moment.
from poczta_polska_enadawca.settings import PocztaPolskaSettingsObject
from poczta_polska_enadawca.ws_tracking_api import PocztaPolskaWSTrackingAPI
PocztaPolskaSettings = PocztaPolskaSettingsObject()
PocztaPolskaSettingsObject.POCZTA_POLSKA_WSTRACKING_API_USERNAME = 'bar'
PocztaPolskaSettingsObject.POCZTA_POLSKA_WSTRACKING_API_PASSWORD = 'bar'
PocztaTrackingInstance = PocztaPolskaWSTrackingAPI(initZeep=False) #we're not executing default init
PocztaTrackingInstance.set_config(PocztaPolskaSettings) #provide the object with settings defined above
PocztaTrackingInstance.init_zeep() #initialize zeep
That should be working at this moment.
That should come in useful :) So after on week of trial and error i found that if you need to use pickup points, a certain type must be passed. So i've built in a type converter ....
pp = PocztaInstance.getPlacowkiPocztowe(wojewodztwo.teryt_short_id)
placowkaPocztowa = [p for p in pp if p['id'] == int(adres.details['pni'])][0] #unfortunately - my request to get that by id was denied :)
urzadWydaniaEPrzesylkiType = PocztaInstance.convertPlacowkaToUrzad(placowkaPocztowa)
def kurier48_gen_etiquette(request, order, adres):
PocztaInstance = PocztaPolskaAPI(useTest=settings.DEBUG)
guid = PocztaInstance.getGuid(1)[0]
package = PocztaInstance['przesylkaBiznesowaType']
adresType = PocztaInstance['adresType']
adresType.nazwa = adres.get_full_name()
if adres.nazwa:
adresType.nazwa2 = adres.get_person_name()
adresType.ulica = adres.adres
adresType.miejscowosc = adres.miasto
adresType.kodPocztowy = adres.kod
adresType.mobile = adres.mobile_no
adresType.email = adres.email
package.guid = guid
package.niestandardowa = False
package.gabaryt = shippingExtra.get('gabaryt', 'XXL')
package.adres = adresType
package.masa = order.waga_zamowienia(wGramach=True)
package.ostroznie = False
package.opis = '{o.site_name} {o.oid}'.format(o=order)
package.wartosc = order.wartosc_zamowienia(wGroszach=True)
if adres.details.get('pni'):
wojewodztwo = Wojewodztwo.objects.get(nazwa__iexact=adres.details['province'])
pp = PocztaInstance.getPlacowkiPocztowe(wojewodztwo.teryt_short_id)
placowka_wydawcza = [p for p in pp if p['id'] == int(adres.details['pni'])][0]
package['urzadWydaniaEPrzesylki'] = PocztaInstance.convertPlacowkaToUrzad(placowka_wydawcza, 'urzadWydaniaEPrzesylkiType')
packageReturn = PocztaInstance.addShipment(package)
packageReturn = packageReturn[0]
shipping_return = {}
shipping_return['raw'] = packageReturn
if packageReturn['error']:
shipping_return['success'] = False
shipping_return['error_code'] = packageReturn['error']['errorNumber']
shipping_return['error_message'] = packageReturn['error']['errorDesc']
else:
shipping_return['numerNadania'] = packageReturn['numerNadania']
shipping_return['guid'] = packageReturn['guid']
shipping_return['parcelCode'] = '%s::%s' % (shipping_return['numerNadania'], shipping_return['guid'])
shipping_return['success'] = True
return shipping_return
If you insist they're avaliable as .service and .factory on instances.
BUT
Factory is exposed directly as dictionary on the API instance. It's avaliable after execution of init_zeep.
PocztaInstance['adresType']
PocztaInstance['przesylkaPoleconaKrajowaType']
PocztaInstance['przesylkaEPOType']
Service methods are also avaliable DIRECTLY on instance. They're rewired after execution of init_zeep. WARNING ! Example below does not work it only shows few simple calls.
PocztaInstance = PocztaPolskaAPI() #default init, you might need the fancy one few lines above
PocztaInstance.hello("Python")
adresType = PocztaInstance['adresType']
adresType.nazwa = 'foo'
adresType.ulica = 'bar'
przesylkaPoleconaKrajowaType = PocztaInstance['przesylkaPoleconaKrajowaType']
przesylkaPoleconaKrajowaType.adres = adresType
PocztaInstance.clearEnvelope()
PocztaInstance.addShipment(przesylkaPoleconaKrajowaType)
PocztaInstance.sendEnvelope()
Class init uses following key arguments: PocztaPolskaAPI(useTest=False, useLabs=False, initZeep=True)
- useTest (default -> False) - run the calls against sandbox enviroment -> https://en-testwebapi.poczta-polska.pl
- useLabs (default -> False) - run the calls against labs endpoints
- initZeep (default -> True) - initialize zeep on init.
PocztaInstance.enable_zeep_debug()
PocztaTrackingInstance.enable_zeep_debug()
PocztaInstance = PocztaPolskaAPI(useTest=True)
PocztaInstance = PocztaPolskaAPI(useTest=True, useLabs=False)