From 76e1016572bbb02a42c60bc5055ff01f859d3cbb Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 19 Nov 2019 11:06:51 +0100 Subject: [PATCH 2/6] family: fix naive datetime warning (#37760) --- .../apps/family/loaders/concerto_orleans.py | 12 +++--- .../commands/import_orleans_data.py | 12 ++---- passerelle/apps/family/models.py | 40 +++++++++++++------ 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/passerelle/apps/family/loaders/concerto_orleans.py b/passerelle/apps/family/loaders/concerto_orleans.py index b889080b..5020b921 100644 --- a/passerelle/apps/family/loaders/concerto_orleans.py +++ b/passerelle/apps/family/loaders/concerto_orleans.py @@ -25,7 +25,7 @@ from django.utils.translation import ugettext_lazy as _ from django.core.files.storage import DefaultStorage from ..models import Family, Adult, Child, Invoice -from ..models import dict_cherry_pick, get_datetime +from ..models import dict_cherry_pick, get_datetime, get_date def normalize_adult(adult): @@ -56,7 +56,7 @@ def normalize_family(family, adults): 'invoices': [], 'login': family['id_fam'], 'password': family['cod_secret_fam'], - 'family_quotient': family['qf_vo'], + 'family_quotient': family['qf_vo'] or 0.0, 'street_number': family['num_voie_adr'] + family['lib_nom_btq'], 'street_name': family['lib_nom_rue'], 'address_complement': family['lib_comp_adr'], @@ -73,7 +73,7 @@ def normalize_child(child): 'first_name': child['lib_prenom_per'], 'last_name': child['lib_nom_per'], 'sex': sex, - 'birthdate': get_datetime(child['dat_naissance']) + 'birthdate': get_date(child['dat_naissance']) } def normalize_invoice(i): @@ -82,11 +82,11 @@ def normalize_invoice(i): 'total_amount': Decimal(i['mnt_facture_fac']), 'amount': Decimal(i['mnt_solde_fac']), 'issue_date': i['dat_generation_fac'], - 'pay_limit_date': get_datetime(i['dat_limitepaie_fac']), + 'pay_limit_date': get_date(i['dat_limitepaie_fac']), 'autobilling': i['on_prelevauto_ins'] == 'O', 'online_payment': True, 'payment_date': get_datetime(i['dat_reglement']), - 'litigation_date': get_datetime(i['dat_perception_fac']), + 'litigation_date': get_date(i['dat_perception_fac']), 'paid': Decimal(i['mnt_solde_fac']) == 0 } return invoice @@ -145,6 +145,7 @@ class Loader(object): try: families = self.build_families() except Exception, e: + raise self.connector.logger.error('Error occured while building families: %s', e) return @@ -177,6 +178,7 @@ class Loader(object): family=family, external_id=invoice_data['external_id'], defaults=invoice_data) except Exception, e: + raise self.connector.logger.error('Error occured while importing data: %s', e) Family.objects.filter(resource=self.connector, update_timestamp__lte=import_start_timestamp).delete() diff --git a/passerelle/apps/family/management/commands/import_orleans_data.py b/passerelle/apps/family/management/commands/import_orleans_data.py index 29cab531..5a2eb2e8 100644 --- a/passerelle/apps/family/management/commands/import_orleans_data.py +++ b/passerelle/apps/family/management/commands/import_orleans_data.py @@ -54,11 +54,7 @@ class Command(BaseCommand): except IOError: raise CommandError('Command already running.') - try: - archive_name = os.path.basename(options['archive_file']) - connector.archive.save(archive_name, File(file(options['archive_file']))) - except Exception, e: - raise CommandError('Error occured: %s' % e) - finally: - fd.close() - os.unlink(lock_filename) + archive_name = os.path.basename(options['archive_file']) + connector.archive.save(archive_name, File(file(options['archive_file']))) + fd.close() + os.unlink(lock_filename) diff --git a/passerelle/apps/family/models.py b/passerelle/apps/family/models.py index b39100da..fd8c42db 100644 --- a/passerelle/apps/family/models.py +++ b/passerelle/apps/family/models.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from datetime import date, time import json import os import shutil @@ -29,7 +30,7 @@ from django.core.files.storage import default_storage from django.utils.translation import ugettext_lazy as _ from django.http import Http404, HttpResponse from django.db import models, transaction -from django.utils.timezone import make_aware, datetime, get_current_timezone, now +from django.utils.timezone import make_aware, datetime, get_current_timezone, now, is_naive from passerelle.base.models import BaseResource from passerelle.utils.api import endpoint @@ -42,19 +43,27 @@ SEXES = ( DATE_FORMAT = '%Y-%m-%d' DATETIME_FORMAT = DATE_FORMAT + 'T%H:%M:%S' + +def get_date(dt): + if isinstance(dt, date): + return dt + if not dt: + return None + return datetime.strptime(dt, DATE_FORMAT).date() + + def get_datetime(date): if not date: return None - try: - return make_aware(datetime.strptime(date,DATETIME_FORMAT), - get_current_timezone()) - except ValueError: - pass - try: - return datetime.strptime(date, DATE_FORMAT).date() - except ValueError: - pass - return None + if not isinstance(date, datetime): + try: + date = datetime.strptime(date, DATETIME_FORMAT) + except ValueError: + date = datetime.strptime(date, DATE_FORMAT) + if is_naive(date): + date = make_aware(date) + return date + def format_address(data): address = '%(street_number)s, %(street_name)s' % data @@ -232,8 +241,15 @@ class GenericFamily(BaseResource): for date_attribute in data.keys(): if not date_attribute.endswith('_date'): continue - data[date_attribute] = get_datetime(data[date_attribute]) + if date_attribute == 'payment_date': + data[date_attribute] = get_datetime(data[date_attribute]) + else: + data[date_attribute] = get_date(data[date_attribute]) data['paid'] = bool(data.get('payment_date')) + if data['paid']: + if isinstance(data['payment_date'], date): + data['payment_date'] = make_aware( + datetime.combine(data['payment_date'], time(0, 0))) Invoice.objects.update_or_create(resource=self, family=family, external_id=invoice['id'], defaults=data) if 'invoices/%s.pdf' % invoice['id'] in archive_files: -- 2.23.0