diff --git a/partner_gogocarto_export_api/models/res_partner.py b/partner_gogocarto_export_api/models/res_partner.py index 74c19e3b0..0dd08a880 100644 --- a/partner_gogocarto_export_api/models/res_partner.py +++ b/partner_gogocarto_export_api/models/res_partner.py @@ -1,5 +1,6 @@ from odoo import models, fields, api from ast import literal_eval +from datetime import date, datetime import logging _logger = logging.getLogger(__name__) @@ -11,29 +12,7 @@ class ResPartner(models.Model): in_gogocarto = fields.Boolean('In gogocarto') def _get_gogocarto_domain(self): # To OVERRIDE in sub_modules to customize the partner selection - return [('in_gogocarto','=',True) - ,('partner_longitude', '!=', float()) - ,('partner_latitude', '!=', float()) - ] - - def _get_last_update(self): - return self.write_date.strftime("%d-%m-%Y, %H:%M:%S") - - def _get_industry_label(self): - if self.industry_id: - return self.industry_id.name - else: - return '' - - def _get_category_id(self): - categories_list = '' - for category in self.category_id : - if categories_list != '': - categories_list = categories_list + ', ' - categories_list = categories_list + category.name - return categories_list - - + return [('in_gogocarto','=',True)] ############################################ #region Public method for JSON Serialization @@ -41,25 +20,42 @@ class ResPartner(models.Model): def gogocarto_serialization(self): element = {} + # mandatory fields in the export self._add_simple_node(element, "name") self._add_simple_node(element, "partner_longitude") self._add_simple_node(element, "partner_latitude") - # to detect the changes in the export compared to the previous one, so that Gogocarto does not import all the data at each synchronization. - self._add_computed_node(element, "last_update", self._get_last_update) + # To detect the changes in the exported data compared to the previous ones, so that Gogocarto does not compute all the data for each synchronization: + self._add_computed_node(element, "write_date", self.write_date.strftime("%d-%m-%Y, %H:%M:%S")) - return self.add_fields(element, self._get_export_fields()) - - - def add_fields(self, element, export_fields): # To OVERRIDE in sub_modules to customize the fields content + export_fields = self._get_export_fields() for field in export_fields: - if field.name == "industry_id": - self._add_computed_node(element, "industry_id", self._get_industry_id_label) - elif field.name == "category_id": - _logger.warning("STEPHAN - Ajout des catégories") - self._add_computed_node(element, "category_id", self._get_category_id) - else: + if field.name in ["name", "partner_longitude", "partner_latitude", "write_date"]: + continue # fields already added above + ####################################################################################### + # # ADD HERE new conditions in override method to customized the fields' value exported + # elif condition1: + # self._add_simple_node(element, field.name) + # elif condition2: + # self._add_computed_node(element, field.name, self._newmethod(field) + ####################################################################################### + elif field.ttype in ["boolean", "char", "integer", "monetary", "text", "selection", "float"]: self._add_simple_node(element, field.name) - _logger.warning("STEPHAN - Retours des éléments") + elif field.ttype == "many2one": + self._add_computed_node(element, field.name, self._get_field_value_name(field)) + elif field.ttype in ["one2many", "many2many"]: + self._add_computed_node(element, field.name, self._get_field_many_values(field)) + elif field.ttype == "datetime": + self._add_computed_node(element, field.name, self._get_field_datetime_value(field)) + elif field.ttype == "date": + self._add_computed_node(element, field.name, self._get_field_date_value(field)) + elif field.ttype == "binary": + continue # Not developped so far + # IMPROVMENT PROPOSED: export a public URL toward the bynary + elif field.ttype == "html": + continue # Not developped so far + else: + continue + return element #endregion @@ -67,6 +63,7 @@ class ResPartner(models.Model): ############################################ #region Private method to JSON Serialization ############################################ + def _get_export_fields(self): ICPSudo = self.env['ir.config_parameter'].sudo() export_field_ids = literal_eval(ICPSudo.get_param('gogocarto_export_api.export_gogocarto_fields')) @@ -79,8 +76,39 @@ class ResPartner(models.Model): element[fieldName] = self[fieldName] # Method to add complex fileds, for which we need a dedicated method to get the value - def _add_computed_node(self, element, fieldLabel, specificMethod): - element[fieldLabel] = specificMethod() + def _add_computed_node(self, element, fieldLabel, fieldStrValue): + element[fieldLabel] = fieldStrValue + + # Method to get the name of the value registered in a Many2one field + def _get_field_value_name(self, field): + if getattr(self, field.name): + return self[field.name].name + else: + return '' + + # Method to get the name of the values registered in a One2many or Many2many field + def _get_field_many_values(self, field): + values_list = '' + for item in self[field.name] : + if values_list != '': + values_list = values_list + ', ' + values_list = values_list + item.name + return values_list + + + # Method to get a datetime value in a string + def _get_field_datetime_value(self, field): + if getattr(self, field.name): + return fields.Datetime.to_datetime(self[field.name]).strftime("%d-%m-%Y, %H:%M:%S") + else: + return "" + + # Method to get a date value in a string + def _get_field_date_value(self, field): + if getattr(self, field.name): + return fields.Date.to_date(self[field.name]).strftime("%d-%m-%Y") + else: + return "" #endregion @@ -91,4 +119,4 @@ class ResPartner(models.Model): _logger.debug("List of field exported for gogoCarto:") for field in self._get_export_fields(): _logger.debug(field.name) - #endregion \ No newline at end of file + #endregion