api/chrono: use more idiomatic code for update
gitea/ants-hub/pipeline/head This commit looks good Details

This commit is contained in:
Benjamin Dauvergne 2023-06-14 10:36:30 +02:00
parent f3e91b384a
commit cafe298c22
2 changed files with 100 additions and 25 deletions

View File

@ -260,19 +260,20 @@ class RendezVousDisponibleView(View):
full = payload.pop('full', False)
try:
# fast path, instance exactly match
lieu = collectivite.lieux.get(source_id=source_id, **payload)
lieu = collectivite.lieux.get(source_id=source_id)
except Lieu.DoesNotExist:
# get existing pk and try a full_clean
pk = collectivite.lieux.filter(source_id=source_id).values_list('pk', flat=True).first()
lieu = Lieu(pk=pk, collectivite=collectivite, source_id=source_id, **payload)
lieu._state.adding = False
lieu.full_clean()
# now update or create
lieu, created = collectivite.lieux.update_or_create(source_id=source_id, defaults=payload)
if created:
self.lieux_created += 1
else:
# new
lieu = collectivite.lieux.create(source_id=source_id, **payload)
self.lieux_created += 1
else:
# existing
updated = False
for key, value in payload.items():
if getattr(lieu, key) != value:
updated = True
setattr(lieu, key, value)
if updated:
lieu.save()
self.lieux_updated += 1
self.handle_plages_payload(lieu, plages, full=full)
@ -286,21 +287,23 @@ class RendezVousDisponibleView(View):
try:
# fast path, instance exactly match
collectivite = raccordement.collectivites.get(source_id=source_id, **payload)
collectivite = raccordement.collectivites.get(source_id=source_id)
except Collectivite.DoesNotExist:
# get existing pk and try a full_clean
pk = raccordement.collectivites.filter(source_id=source_id).values_list('pk', flat=True).first()
collectivite = Collectivite(pk=pk, raccordement=raccordement, source_id=source_id, **payload)
collectivite._state.adding = False
collectivite.full_clean()
# now update or create
collectivite, created = raccordement.collectivites.update_or_create(
source_id=source_id, defaults=payload
)
if created:
self.collectivites_created += 1
else:
# new
collectivite = raccordement.collectivites.create(source_id=source_id, **payload)
self.collectivites_created += 1
else:
# existing
updated = False
for key, value in payload.items():
if getattr(collectivite, key) != value:
updated = True
setattr(collectivite, key, value)
if updated:
collectivite.save()
self.collectivites_updated += 1
# handle lieux
lieu_pks = set()
for lieu_payload in lieux_payload:
lieu = self.handle_lieu_payload(collectivite, lieu_payload)

View File

@ -863,3 +863,75 @@ def test_plages_ordering(django_app, db, freezer):
]
},
)
def rdv_response(response):
return {key: value for key, value in response.json.get('data', {}).items() if value > 0}
class TestUpdate:
@pytest.fixture(autouse=True)
def setup(self, django_app, db):
Raccordement.objects.create(name='plateforme', apikey='abcd')
django_app.set_authorization(('Basic', ('abcd', '')))
def test_collectivite_and_lieu_update(self, django_app, db):
response = django_app.post_json(
'/api/chrono/rendez-vous-disponibles/',
params={
'collectivites': [
{
'id': 'col1',
'nom': 'Saint-Didier',
'url': 'https://saint-didier.fr/rdv/',
'logo_url': 'https://saint-didier.fr/logo.png',
'lieux': [
{
'id': 'lieu1',
'nom': 'Mairie de Saint-Didier',
'numero_rue': '2 rue du four',
'code_postal': '99999',
'ville': 'Saint-Didier',
'longitude': 1.5,
'latitude': 2.3,
}
],
}
]
},
)
assert rdv_response(response) == {
'collectivites_created': 1,
'lieux_created': 1,
}
response = django_app.post_json(
'/api/chrono/rendez-vous-disponibles/',
params={
'collectivites': [
{
'id': 'col1',
'nom': 'Saint-François',
'url': 'https://saint-francois.fr/rdv/',
'logo_url': 'https://saint-didier.fr/logo.png',
'lieux': [
{
'id': 'lieu1',
'nom': 'Mairie de Saint-François',
'numero_rue': '2 rue du four',
'code_postal': '99999',
'ville': 'Saint-François',
'longitude': 1.5,
'latitude': 2.3,
}
],
}
]
},
)
assert rdv_response(response) == {
'collectivites_updated': 1,
'lieux_updated': 1,
}