feat (Tryton): get customers from tryton.
This commit is contained in:
		| @@ -335,3 +335,77 @@ class ProductsFromTrytonView(APIView): | |||||||
|         product.measuring_unit = unit.get('rec_name') |         product.measuring_unit = unit.get('rec_name') | ||||||
|         product.unit_external_id = unit.get('id') |         product.unit_external_id = unit.get('id') | ||||||
|         product.save() |         product.save() | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class CustomersFromTrytonView(APIView): | ||||||
|  |     def post(self, request): | ||||||
|  |         tryton_client = Client( | ||||||
|  |             hostname=TRYTON_HOST, | ||||||
|  |             database=TRYTON_DATABASE, | ||||||
|  |             username=TRYTON_USERNAME, | ||||||
|  |             password=TRYTON_PASSWORD | ||||||
|  |         ) | ||||||
|  |         tryton_client.connect() | ||||||
|  |         method = 'model.party.party.search' | ||||||
|  |         context = {'company': 1} | ||||||
|  |         params = [[], 0, 1000, [["rec_name", "ASC"], ["id", None]], context] | ||||||
|  |         party_ids = tryton_client.call(method, params) | ||||||
|  |         tryton_parties = self.__get_party_datails( | ||||||
|  |             party_ids, tryton_client, context | ||||||
|  |         ) | ||||||
|  |         checked_tryton_parties = party_ids | ||||||
|  |         failed_parties = [] | ||||||
|  |         updated_customers = [] | ||||||
|  |         created_customers = [] | ||||||
|  |         untouched_customers = [] | ||||||
|  |         print('aqui') | ||||||
|  |         print(tryton_parties) | ||||||
|  |  | ||||||
|  |         for tryton_party in tryton_parties: | ||||||
|  |             try: | ||||||
|  |                 customer = Customer.objects.get( | ||||||
|  |                     external_id=tryton_party.get('id') | ||||||
|  |                 ) | ||||||
|  |             except Customer.DoesNotExist: | ||||||
|  |                 customer = self.__create_customer(tryton_party) | ||||||
|  |                 created_customers.append(customer.id) | ||||||
|  |                 continue | ||||||
|  |             if self.__need_update(customer, tryton_party): | ||||||
|  |                 self.__update_customer(customer, tryton_party) | ||||||
|  |                 updated_customers.append(customer.id) | ||||||
|  |             else: | ||||||
|  |                 untouched_customers.append(customer.id) | ||||||
|  |  | ||||||
|  |         return Response( | ||||||
|  |             { | ||||||
|  |                 'checked_tryton_parties': checked_tryton_parties, | ||||||
|  |                 'failed_parties': failed_parties, | ||||||
|  |                 'updated_customers': updated_customers, | ||||||
|  |                 'created_customers': created_customers, | ||||||
|  |                 'untouched_customers': untouched_customers, | ||||||
|  |             }, | ||||||
|  |             status=200 | ||||||
|  |         ) | ||||||
|  |  | ||||||
|  |     def __get_party_datails(self, party_ids, tryton_client, context): | ||||||
|  |         tryton_fields = ['id', 'name'] | ||||||
|  |         method = 'model.party.party.read' | ||||||
|  |         params = (party_ids, tryton_fields, context) | ||||||
|  |         response = tryton_client.call(method, params) | ||||||
|  |         return response | ||||||
|  |  | ||||||
|  |     def __need_update(self, customer, tryton_party): | ||||||
|  |         if not customer.name == tryton_party.get('name'): | ||||||
|  |             return True | ||||||
|  |  | ||||||
|  |     def __create_customer(self, tryton_party): | ||||||
|  |         customer = Customer() | ||||||
|  |         customer.name = tryton_party.get('name') | ||||||
|  |         customer.external_id = tryton_party.get('id') | ||||||
|  |         customer.save() | ||||||
|  |         return customer | ||||||
|  |  | ||||||
|  |     def __update_customer(self, customer, tryton_party): | ||||||
|  |         customer.name = tryton_party.get('name') | ||||||
|  |         customer.external_id = tryton_party.get('id') | ||||||
|  |         customer.save() | ||||||
|   | |||||||
| @@ -0,0 +1,66 @@ | |||||||
|  | import json | ||||||
|  | from unittest.mock import patch | ||||||
|  |  | ||||||
|  | from django.test import Client, TestCase | ||||||
|  | from ..models import Customer | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class TestCustomersFromTryton(TestCase): | ||||||
|  |     def setUp(self): | ||||||
|  |         self.customer = Customer.objects.create( | ||||||
|  |             name='Calos', | ||||||
|  |             external_id=5 | ||||||
|  |         ) | ||||||
|  |         self.customer.save() | ||||||
|  |  | ||||||
|  |         self.customer2 = Customer.objects.create( | ||||||
|  |             name='Cristian', | ||||||
|  |             external_id=6 | ||||||
|  |         ) | ||||||
|  |         self.customer2.save() | ||||||
|  |  | ||||||
|  |     @patch('sabatron_tryton_rpc_client.client.Client.call') | ||||||
|  |     @patch('sabatron_tryton_rpc_client.client.Client.connect') | ||||||
|  |     def test_create_import_customer(self, mock_connect, mock_call): | ||||||
|  |         def fake_call(*args, **kwargs): | ||||||
|  |             party_search = 'model.party.party.search' | ||||||
|  |             search_args = [[], 0, 1000, [['rec_name', 'ASC'], ['id', None]], {'company': 1}] | ||||||
|  |  | ||||||
|  |             if (args == (party_search, search_args)): | ||||||
|  |                 return [5, 6, 7, 8] | ||||||
|  |  | ||||||
|  |             party_read = 'model.party.party.read' | ||||||
|  |             read_args = ([5, 6, 7, 8], ['id', 'name'], {'company': 1}) | ||||||
|  |             if (args == (party_read, read_args)): | ||||||
|  |                 return [ | ||||||
|  |                     {'id': 5, 'name': 'Carlos'}, | ||||||
|  |                     {'id': 6, 'name': 'Cristian'}, | ||||||
|  |                     {'id': 7, 'name': 'Ana'}, | ||||||
|  |                     {'id': 8, 'name': 'José'}, | ||||||
|  |                 ] | ||||||
|  |  | ||||||
|  |             raise Exception(f"Sorry, args non expected on  this test: {args}") | ||||||
|  |         mock_call.side_effect = fake_call | ||||||
|  |  | ||||||
|  |         url = '/don_confiao/api/importar_clientes_de_tryton' | ||||||
|  |         response = self.client.post(url) | ||||||
|  |         self.assertEqual(response.status_code, 200) | ||||||
|  |  | ||||||
|  |  | ||||||
|  |         content = json.loads(response.content.decode('utf-8')) | ||||||
|  |         expected_response = { | ||||||
|  |             'checked_tryton_parties': [5, 6, 7, 8], | ||||||
|  |             'created_customers': [3, 4], | ||||||
|  |             'untouched_customers': [2], | ||||||
|  |             'failed_parties': [], | ||||||
|  |             'updated_customers': [1] | ||||||
|  |         } | ||||||
|  |         self.assertEqual(content, expected_response) | ||||||
|  |  | ||||||
|  |         created_customer = Customer.objects.get(id=3) | ||||||
|  |         self.assertEqual(created_customer.external_id, str(7)) | ||||||
|  |         self.assertEqual(created_customer.name, 'Ana') | ||||||
|  |  | ||||||
|  |         updated_customer = Customer.objects.get(id=1) | ||||||
|  |         self.assertEqual(updated_customer.external_id, str(5)) | ||||||
|  |         self.assertEqual(updated_customer.name, 'Carlos') | ||||||
| @@ -24,6 +24,9 @@ urlpatterns = [ | |||||||
|          api_views.ProductsFromTrytonView.as_view(), |          api_views.ProductsFromTrytonView.as_view(), | ||||||
|          name="products_from_tryton"), |          name="products_from_tryton"), | ||||||
|     path("importar_terceros", views.import_customers, name="import_customers"), |     path("importar_terceros", views.import_customers, name="import_customers"), | ||||||
|  |     path('api/importar_clientes_de_tryton', | ||||||
|  |          api_views.CustomersFromTrytonView.as_view(), | ||||||
|  |          name="customers_from_tryton"), | ||||||
|     path("exportar_ventas_para_tryton", |     path("exportar_ventas_para_tryton", | ||||||
|          views.exportar_ventas_para_tryton, |          views.exportar_ventas_para_tryton, | ||||||
|          name="exportar_ventas_para_tryton"), |          name="exportar_ventas_para_tryton"), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user