nanterre: ajout WS de suppression d'une fiche (fixes #20095)

La suppression est bloquée dans les cas suivants:
- il y a au moins un lien avec un parent, un enfant ou un conjoint
- il y a au moins une fédération en dehors d'authentic
This commit is contained in:
Benjamin Dauvergne 2017-11-15 12:07:24 +01:00
parent 89efde16c9
commit baf29b2b60
3 changed files with 110 additions and 0 deletions

View File

@ -956,6 +956,34 @@ def test_cles_de_federations(app, rsu_schema):
assert Entity.objects.filter(content__cles_de_federation__technocarte='idtechno').count() == 1
assert Entity.objects.filter(content__cles_de_federation__technocarte='idtechno').get().id == first_id
# suppression d'un individu
suppression_url = reverse('rsu-api-suppression-individu', kwargs={
'identifier': first_id})
response = app.post(suppression_url)
# impossible il y a toujours une clé
assert response.json['err'] == 1
assert len(response.json['errors']) == 1
# on supprimer la clé technocarte
response = app.post_json(update_url, params={
'cles_de_federation': {
'technocarte': ''
},
})
entities = Entity.objects.all()
relations = Relation.objects.all()
# on a initialement 2 individus avec 2 adresses
assert entities.count() == 4
# on retente
response = app.post(suppression_url)
# c'est ok
assert response.json['err'] == 0
# on vérifie qu'il n'y a plus qu'une fiche et qu'une adresse et qu'ils sont liés
assert entities.filter(schema__slug='individu').count() == 1
assert entities.filter(id=second_id).count() == 1
assert entities.filter(schema__slug='adresse').count() == 1
assert relations.count() == 1
assert relations.filter(left__id=second_id, schema__slug='habite').count() == 1
def test_separation(db, app, rsu_schema):
# création du premier adulte
@ -1039,6 +1067,23 @@ def test_separation(db, app, rsu_schema):
assert get_individu_adresse(second_adult) == second_adult_address
assert Entity.objects.filter(id=first_adult_address.id).count() == 0
# on ne peut supprimer aucun des deux
suppression_url = reverse('rsu-api-suppression-individu', kwargs={
'identifier': first_adult_id})
response = app.post(suppression_url)
# impossible il y a une union
assert response.json['err'] == 1
assert len(response.json['errors']) == 1
assert 'conjoint' in response.json['errors'][0]
suppression_url = reverse('rsu-api-suppression-individu', kwargs={
'identifier': second_adult_id})
response = app.post(suppression_url)
# impossible il y a une union
assert response.json['err'] == 1
assert response.json['err'] == 1
assert len(response.json['errors']) == 1
assert 'conjoint' in response.json['errors'][0]
# rattachement du premier enfant au premier adulte
enfant_url = reverse('rsu-api-declaration-responsabilite-legale',
kwargs={'identifier': first_adult_id})
@ -1062,6 +1107,24 @@ def test_separation(db, app, rsu_schema):
first_child = Entity.objects.get(id=first_child_id)
assert get_individu_adresse(first_child) == second_adult_address
# on ne peut supprimer le parent, il a un enfant et un conjoint
suppression_url = reverse('rsu-api-suppression-individu', kwargs={
'identifier': first_adult_id})
response = app.post(suppression_url)
# impossible il y a une union
assert response.json['err'] == 1
assert len(response.json['errors']) == 2
assert 'enfant' in response.json['errors'][0]
assert 'conjoint' in response.json['errors'][1]
# on ne peut supprimer l'enfant, il a un parent
suppression_url = reverse('rsu-api-suppression-individu', kwargs={
'identifier': first_child_id})
response = app.post(suppression_url)
# impossible il y a une union
assert response.json['err'] == 1
assert len(response.json['errors']) == 1
assert 'avec un parent' in response.json['errors'][0]
# rattachement du premier enfant au deuxième adulte
enfant_url = reverse('rsu-api-declaration-responsabilite-legale',
kwargs={'identifier': second_adult_id})

View File

@ -1393,6 +1393,51 @@ class Synchronisation(TransactionalView):
synchronization = Synchronisation.as_view()
class SuppressionIndividu(IndividuViewMixin, TransactionalView):
def post(self, request, identifier, format=None):
individu = self.get_individu(identifier)
# vérifie l'absence de relation et de fédérations
errors = []
parent_count = len(list(utils.parents(individu)))
if parent_count:
errors.append(u'cet individu a encore %d lien(s) avec un parent' % parent_count)
enfant_count = len(list(utils.enfants(individu)))
if enfant_count:
errors.append(u'cet individu a encore %d lien(s) avec un enfant' % enfant_count)
conjoint, rel = utils.conjoint(individu)
if conjoint:
errors.append(u'cet individu a un conjoint')
uuid_authentic = None
for application in individu.content['cles_de_federation']:
if application == 'authentic':
uuid_authentic = individu.content['cles_de_federation']['authentic']
else:
errors.append(u'cet individu a encore une clé de fédération avec %s' % application)
if errors:
return Response({
'err': 1,
'errors': errors,
})
adresses = utils.adresses(individu)
individu.delete()
# supprimer les adresses orphelines
for adresse, rel in adresses:
# left_relations ne devrait pas exister, mais dans le doute...
if not adresse.right_relations.exists() and not adresse.left_relations.exists():
adresse.delete()
response = {'err': 0}
if uuid_authentic:
response['cles_de_federation'] = {'authentic': uuid_authentic}
response['messages'] = [u'cette fiche avait une clé de fédération sur le portail '
u'internet: %s' % uuid_authentic]
return Response(response)
suppression_individu = SuppressionIndividu.as_view()
class SagaTiers(APIView):
def get(self, request, application, identifier, format=None):
app_dfn = utils.get_application(application)

View File

@ -25,6 +25,8 @@ urlpatterns = [
url(r'^import_control/$', import_control, name='demo'),
url(r'^search/$', api_views.search, name='rsu-api-search'),
url(r'^individu/(?P<identifier>[-\w]+)/$', api_views.reseau, name='rsu-api-reseau'),
url(r'^individu/(?P<identifier>[-\w]+)/suppression/$', api_views.suppression_individu,
name='rsu-api-suppression-individu'),
url(r'^individu/(?P<identifier>[-\w]+)/liste/$', api_views.reseau_liste,
name='rsu-api-reseau-liste'),
url(r'^individu/(?P<identifier>[-\w]+)/journal/$', api_views.journal, name='rsu-api-journal'),