From 4734636b4f0dced090391510d23f6195be2cba23 Mon Sep 17 00:00:00 2001 From: Mono Mono Date: Sat, 9 Aug 2025 14:12:31 -0500 Subject: [PATCH] feat (Tryton): get customers from tryton. --- tienda_ilusion/don_confiao/api_views.py | 74 +++++++++++++++++++ .../tests/test_customers_from_tryton.py | 66 +++++++++++++++++ tienda_ilusion/don_confiao/urls.py | 3 + 3 files changed, 143 insertions(+) create mode 100644 tienda_ilusion/don_confiao/tests/test_customers_from_tryton.py diff --git a/tienda_ilusion/don_confiao/api_views.py b/tienda_ilusion/don_confiao/api_views.py index e67fd80..3f02592 100644 --- a/tienda_ilusion/don_confiao/api_views.py +++ b/tienda_ilusion/don_confiao/api_views.py @@ -335,3 +335,77 @@ class ProductsFromTrytonView(APIView): product.measuring_unit = unit.get('rec_name') product.unit_external_id = unit.get('id') 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() diff --git a/tienda_ilusion/don_confiao/tests/test_customers_from_tryton.py b/tienda_ilusion/don_confiao/tests/test_customers_from_tryton.py new file mode 100644 index 0000000..a499fc2 --- /dev/null +++ b/tienda_ilusion/don_confiao/tests/test_customers_from_tryton.py @@ -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') diff --git a/tienda_ilusion/don_confiao/urls.py b/tienda_ilusion/don_confiao/urls.py index cd7e062..b2ebf87 100644 --- a/tienda_ilusion/don_confiao/urls.py +++ b/tienda_ilusion/don_confiao/urls.py @@ -24,6 +24,9 @@ urlpatterns = [ api_views.ProductsFromTrytonView.as_view(), name="products_from_tryton"), 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", views.exportar_ventas_para_tryton, name="exportar_ventas_para_tryton"),