Skip to main content

Integrating Econt API using Python

Project description

Econt Package - Python 2.7/3.3/3.5-3.6/3.7

URL

PyPI : https://pypi.org/project/econt-test/

GitLab : https://gitlab.melontech.com/melontech/econt

Installation

Make sure you have pip and virtualenv installed

  • For Python 2.7
$ sudo apt install python2.7 python-pip
$ sudo pip install virtualenv 
  • For Python 3.X
$ sudo apt-get install python3-pip
$ sudo pip install virtualenv 

Using PyPI

  • Create the virtual environment
$ virtualenv envname
  • Activate the virtual environment
$ source envname/bin/activate
  • Install the package
$ pip install econt-test

Using the repository

  • Clone the repository
$ git clone git@gitlab.melontech.com:melontech/econt.git
  • Change the current directory
$ cd econt
  • Create the virtual environment
$ virtualenv envname
  • Activate the virtual environment
$ source envname/bin/activate
  • Install the libraries and packages used in the code
$ pip install -r requirements.txt

Econt class

init(username, password, demo=True)

The constructor takes username, password and demo as arguments.

If demo is True, the class uses the demo urls for Econt's services and parcels

If demo is False, the class uses the real urls for Econt's services and parcels

request(url, xml)

The method takes a URL and an XML as arguments and sends an XML request to the given URL.

The response from the Econt server is then converted to a Python dictionary and returned to the user.

response = {'status':..., 'message': ..., 'data': ...}

Every method of the class uses request(url, xml) so every response is of the above-mentioned format.

The data key holds the desired information, but if there are any ERRORS it corresponds to None

The status key holds StatusCode which consists of 6 different values.

The message key holds information about the error if there is any, otherwise it is OK

xml_builder(data, root_element='request', authenticate=False)

The method takes data, root_element, and authenticate as arguments in JSON, string, and bool format respectively.

When authenticate is False, the given JSON is converted to an XML and the XML is returned to the user.

When authenticate is True, the user's username and password are added to the JSON, then converted to XML, and returned to the user.

get_user_credentials()

The method returns the username and password of the user wrapped in a client key as a python dict.

validate_address(address_json)

The method takes a JSON and sends an XML request to the server to decide whether the address is valid.

register(data)

The method takes a JSON and sends an XML request to the server to create an Econt account.

retrieve_profile()

The method takes sends an XML request to the server to retrieve the profile information of the current user.

get_offices()

The method returns information about all of the Econt offices in the world.

cancel_shipment(shipment_number)

The method takes an int as argument and sends an XML request to the server to cancel the shipment corresponding to that number.

get_cities()

The method returns a JSON containing all the cities with Econt offices and their details.

get_streets()

The method returns a JSON containing all the streets with Econt offices and their details.

get_streets_by_city(city_post_code)

The method takes an int or a str as an argument and returns a JSON containing the English and Bulgarian names of all the streets in the given city_post_code area.

get_offices_by_city(city_post_code)

The method takes an int or a str as an argument and returns a JSON containing all the offices in the given city_post_code area.

get_countries()

The method returns a JSON containing all the countries Econt operates in.

get_seller_addresses()

The method returns the addresses of the user

get_quarters()

The method returns a JSON containing all the quarters with Econt offices and their details.

get_quarters_by_post_code(city_post_code)

The method takes a str or an int as argument and returns a JSON containing all the quarters in the given city_post_code area and their details.

get_regions()

The method returns a JSON containing all the regions in every city and their details.

get_zones()

The method returns a JSON containing all the zones in every city and their details.

__build_shipment(sender_data, receiver_data, shipment_data, services_data, payment_data, instructions_data, validate=False, only_calculate=False, process_all_parcels=False, error_email='')

An internal method to create_shipment taking six dicts, three optional bools, and an optional str as arguments.

The optional arguments are used when this method is called from the wrappers below.

create_shipment(sender_data, receiver_data, shipment_data, services_data, payment_data, instructions_data, error_email='')

The method takes six dicts and an optional str as arguments.

It generates a shipment and returns information about the created shipment.

If error_email is provided any errors that have occurred during the request are sent to the given email address.

calculate_shipment_price(sender_data, receiver_data, shipment_data, services_data, payment_data, instructions_data, error_email='')

The method takes six dicts and an optional str as arguments.

It returns information about the price of the shipment without generating a cargo.

If error_email is provided any errors that have occurred during the request are sent to the given email address.

validate_shipment(sender_data, receiver_data, shipment_data, services_data, payment_data, instructions_data, error_email='')

The method takes six dicts and an optional str as arguments.

It performs a check-up on the data that is provided without generating a cargo.

If error_email is provided any errors that have occurred during the request are sent to the given email address.

get_clients()

The method returns a JSON containing information about the clients of the user.

validate_cd_agreement(name, cd_no)

The function takes two strs as arguments and returns a JSON which tells whether the Punitive Decree agreement (given by cd_no) of the user (given by name) is valid.

get_postboxes(city_name='', quarter_name='')

The method takes two optional parameters as strs, gets information about all the postboxes while filtering them according to the parameters if applicable and returns them as a JSON.

retrieve_shipment_info(shipment_ids, full_tracking=False)

The method takes a list of shipment ids and an optional bool as arguments and returns information about the given shipment(s)

get_post_tariff()

The method takes no arguments and returns information about the current post tariff.

StatusCode class

There 6 class variables in here. Each variable indicates the following :

STATUS_OK = 0
CONNECTION_ERROR = 1
INVALID_URL_ERROR = 2
EMPTY_URL_ERROR = 3
XML_PARSE_ERROR = 4
ECONT_API_XML_ERROR = 5
UNEXPECTED_ERROR = 6

These variables are used in the request method to indicate the status of the response from Econt.

RequestType class

This class holds all of the request types that were implemented by us.

ACCESS_CLIENTS = 'access_clients'
CHECK_ADDRESS = 'check_address'
E_ECONT_REGISTRATION = 'e_econt_registration'
PROFILE = 'profile'
CANCEL_SHIPMENTS = 'cancel_shipments'
SHIPPING = 'shipping'
SHIPMENTS = 'shipments'
STREETS = 'cities_streets'
OFFICES = 'offices'
COUNTRIES = 'countries'
CITIES = 'cities'
QUARTERS = 'cities_quarters'
REGIONS = 'cities_regions'
ZONES = 'cities_zones'
CD_AGREEMENT = 'check_cd_agreement'
POSTBOXES = 'post_boxes'

Examples

request(url, xml)

input

url=''
xml=''

output

{'status': 3, 'message': 'Please provide http:// or https://!'}

create_shipment

>>> from econt.api import Econt
>>> SENDER_DATA = {
    'city_en': 'Ruse',
    'post_code': '7000',
    'office_code': '7000',
    'name': 'Иван Иванов',
    'phone_num': '08888888888'
}
>>> RECEIVER_DATA = {
    'city_en': 'Sofia',
    'post_code': '1505',
    'name': 'Петър Иванов',
    'phone_num': '08888888888',
    'street': 'Славянска',
    'street_num': '16'
}
>>> SHIPMENT_DATA = {
    'envelope_num': '111111,22222,3332342',
    'shipment_type': 'PACK',
    'description': 'description of the content content',
    'pack_count': '3',
    'weight': '1',
    'tariff_sub_code': 'OFFICE_DOOR',
    'pay_after_accept': '1',
    'pay_after_test': '0'
}
>>> SERVICES_DATA = {
    'dc': 'ON',
    'oc': '44.99',
    'cd': '44.99',
    'cd_currency': 'BGN',
    'cd_pay_options': {
        'name': 'Иван Иванов',
        'phone': '08888888888',
        'money_transfer': '0',
        'method': 'door',
        'city': 'Sofia',
        'post_code': '1505',
        'quarter': 'gk Suhata Reka',
        'street': 'bul. Botevgradsko Shose',
        'street_num': '49'
    }
}
>>> PAYMENT_DATA = {
    'side': 'SENDER',
    'method': 'CASH'
}
>>> INSTRUCTIONS_DATA = {
    'e': {
        'type': 'return',
        'delivery_fail_action': 'return_to_office',
        'return_name': 'Марин Маринов',
        'return_phone': '088888888',
        'return_email': 'ddd@ddd.dd',
        'return_city': 'Русе',
        'return_post_code': '7000',
        'return_office_code': '7004',
        'reject_delivery_payment_side': 'receiver',
        'reject_return_payment_side': 'sender'
    }
}

>>> service = Econt('demo', 'demo')
>>> result = service.create_shipment(SENDER_DATA, RECEIVER_DATA, SHIPMENT_DATA,
SERVICES_DATA,PAYMENT_DATA, INSTRUCTIONS_DATA)
>>> print(result)
{
  'status': 0,
  'message': 'OK',
  'data': {
    'result': OrderedDict([('loading_id', '2018090000003116'), ('loading_num', '1051601425135'),
                           ('courier_request_id', None), ('delivery_date', '2018-09-12'),
                           ('loading_price', OrderedDict([('C', '6.3'), ('DC', '3.5'),
                           ('OC', '0.11'), ('CD', '1.08'), ('total', '10.99'), ('sender_total', '10.99'),
                           ('receiver_total', '0'), ('other_total', '0'), ('currency', 'лв'),
                           ('currency_code', 'BGN')])), ('loading_discount', None),
                           ('CD_percent', '2.4'),
                           ('pdf_url', 'http://demo.econt.com/ee/api_export.php?exportMethod=printLoading&loading_num=1051601425135&_key=eda82e9392910a376c4a53102d5390381ce5dcd7&'),
                           ('return_reason', None), ('prev_parcel_num', None), ('next_parcels', None)]),
    'pdf': OrderedDict([('blank_yes', 'http://demo.econt.com/e-econt/api/api_pdf_shipment.php?user=demo&print_media=template&nums[]=1051601425135'),
                        ('blank_no', 'http://demo.econt.com/e-econt/api/api_pdf_shipment.php?user=demo&print_media=double&nums[]=1051601425135')])
  }
}
>>> url = result['data']['pdf']['blank_yes']
# if you go to this url on your web browser you will see this pdf file

http://demo.econt.com/e-econt/api/api_pdf_shipment.php?user=demo&print_media=template&nums[]=1051601425135

xml_builder(data, root_element='request', authenticate=False)

input

data={'city': 'Sofia', 'post_code': '1113','street': 'Kosta Lulchev','street_num': '20', 'street_et': '3', }
authenticate=True

output

<?xml version="1.0" encoding="UTF-8" ?>
<request>
   <city>Sofia</city>
   <post_code>1113</post_code>
   <street>Kosta Lulchev</street>
   <street_num>20</street_num>
   <street_et>3</street_et>
   <client>
      <username>demo</username>
      <password>demo</password>
   </client>
</request>

get_user_credentials()

input

None

output

{'client': {'username': 'demo','password': 'demo'}}

validate_address(address_json)

input

address_json={'city': 'Sofia', 'post_code': '1113', 'street': Kosta Lulchev', 'street_num': '20', 'street_et': '3'}

output

{'status': 0, 'message': ''}

Testing

To test the function with the cases given in the tests simply run as following in the command line:

python testrunner.py

The test cases of each method of the Econt class collected in the tests folder will be run. An OK message should be returned to the console.

get_user_credentials method is tested in the api.py with the help of a doctest.

Contribution

If you wish to contribute to this project and make changes, feel free to do so by branching master and posting a merge request later on.

Should any problem arise, you can always contact us at

hhalil@melontech.com

ehaliloglu@melontech.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

econt_test-0.1.0.tar.gz (30.0 kB view details)

Uploaded Source

Built Distribution

econt_test-0.1.0-py3-none-any.whl (37.4 kB view details)

Uploaded Python 3

File details

Details for the file econt_test-0.1.0.tar.gz.

File metadata

  • Download URL: econt_test-0.1.0.tar.gz
  • Upload date:
  • Size: 30.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.5

File hashes

Hashes for econt_test-0.1.0.tar.gz
Algorithm Hash digest
SHA256 724a684f8cfde8c364a71377c00d3cc20cf880802c1b649aa962ed90f278c870
MD5 0520152bfd2fe49f84c99290cb0b6f8f
BLAKE2b-256 c9dcd885e304a14753783f041964ed0c624431a4b20a7c2e5188ac3902557849

See more details on using hashes here.

File details

Details for the file econt_test-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: econt_test-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 37.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.19.1 setuptools/40.4.1 requests-toolbelt/0.8.0 tqdm/4.26.0 CPython/3.6.5

File hashes

Hashes for econt_test-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f5ac63608cc58460260afd2d534b393f13259c11222bbfe88878310bb65f50f4
MD5 36321efbd1f36cfb8cdfded4d29b0de1
BLAKE2b-256 6479ce71388960a6e3909bb274aa850490c39fa5f751908cb5abf93ae8e52acc

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page