def post_delete_dataset(sender, instance, **kwargs): CkanHandler.deactivate_ckan_organisation_if_empty( str(instance.organisation.ckan_id))
def save(self, *args, current_user=None, synchronize=True, activate=None, **kwargs): # Version précédante du jeu de données (avant modification) previous, created = self.pk \ and (Dataset.objects.get(pk=self.pk), False) or (None, True) if created: activate = True # Quelques valeurs par défaut # =========================== today = timezone.now().date() if not self.date_creation: # La date de création self.date_creation = today if not self.date_modification: # La date de modification self.date_modification = today if not self.date_publication: # La date de publication self.date_publication = today if not self.owner_name: # Le propriétaire du jeu de données self.owner_name = self.editor.get_full_name() if not self.owner_email: # et son e-mail self.owner_email = self.editor.email bbox = None layers = self.get_layers() if not self.geocover and layers: # On calcule la BBOX de l'ensemble des Layers rattachés au Dataset extent = layers.aggregate( models.Extent('bbox')).get('bbox__extent') if extent: xmin, ymin = extent[0], extent[1] xmax, ymax = extent[2], extent[3] bbox = bounds_to_wkt(xmin, ymin, xmax, ymax) elif self.geocover == 'jurisdiction': # Prend l'étendue du territoire de compétence if self.organisation: jurisdiction = self.organisation.jurisdiction if jurisdiction and jurisdiction.communes: bounds = jurisdiction.get_bounds() if bounds: xmin, ymin = bounds[0][1], bounds[0][0] xmax, ymax = bounds[1][1], bounds[1][0] bbox = bounds_to_wkt(xmin, ymin, xmax, ymax) elif self.geocover == 'regionale': # Prend l'étendue par défaut définie en settings bbox = DEFAULT_BBOX setattr(self, 'bbox', bbox) # On sauvegarde le jeu de données super().save(*args, **kwargs) # Puis... if not created: # Une organisation CKAN ne contenant plus # de jeu de données doit être désactivée. if previous.organisation: CkanHandler.deactivate_ckan_organisation_if_empty( str(previous.organisation.ckan_id)) # On vérifie si l'organisation du jeu de données change. # Si c'est le cas, il est nécessaire de sauvegarder tous # les `Layers` rattachés au jeu de données afin de forcer # la modification du `Workspace` (c'est-à-dire du Mapfile) if previous.organisation != self.organisation: for resource in previous.get_resources(): for layer in resource.get_layers(): layer.save(synchronize=True) # Enfin... if synchronize: ckan_dataset = self.synchronize(with_user=current_user, activate=activate) # puis on met à jour `ckan_id` self.ckan_id = UUID(ckan_dataset['id']) super().save(update_fields=['ckan_id'])