api/chrono: use more idiomatic code for update
gitea/ants-hub/pipeline/head This commit looks good
Details
gitea/ants-hub/pipeline/head This commit looks good
Details
This commit is contained in:
parent
f3e91b384a
commit
cafe298c22
|
@ -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)
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue