コード例 #1
0
def post_delete_dataset(sender, instance, **kwargs):
    CkanHandler.deactivate_ckan_organisation_if_empty(
        str(instance.organisation.ckan_id))
コード例 #2
0
    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'])