rsinger86/django-lifecycle

ManyToManyField Hook HELP!

Closed this issue · 0 comments

class Destination(LifecycleModelMixin, models.Model):
    name = models.CharField(max_length=255)
    slug = AutoSlugField(populate_from="name", unique=True)
    image = models.ImageField(upload_to="destination", blank=True, null=True)

    region = models.ForeignKey(Region, on_delete=models.CASCADE, blank=True, null=True)
    blog = models.ForeignKey(BlogEntry, on_delete=models.CASCADE, blank=True, null=True)

    latitude = models.FloatField(blank=True, null=True)
    longitude = models.FloatField(blank=True, null=True)

    is_active = models.BooleanField(default=True)
    is_popular = models.BooleanField(default=False)
    order = models.PositiveIntegerField(default=1)

    def __str__(self):
        return self.name

    class Meta:
        ordering = ("order",)
        verbose_name_plural = "Destinations"

    @hook(AFTER_UPDATE)
    def after_update(self):
        if self.image.url.endswith((".jpg", ".jpeg", ".png")):
            convert_to_webp(self, "destination", f"{slugify(self.name)}")

class TourDestinationRoutes(LifecycleModelMixin, models.Model):
    destination = models.ForeignKey(Destination, on_delete=models.CASCADE)
    tour = models.ForeignKey("api.Tour", on_delete=models.CASCADE)
    order = models.PositiveIntegerField(default=1)

    @hook(AFTER_UPDATE, when="order", has_changed=True)
    def route_order_changed(self):
        print("route order changed")

    class Meta:
        ordering = ("order",)
        verbose_name_plural = "Tour Destination Routes"

    def __str__(self):
        return f"{self.tour.title} - {self.destination.name}"

class Tour(LifecycleModelMixin, models.Model):
    category = models.ForeignKey(TourCategory, on_delete=models.CASCADE)
    title = models.CharField(max_length=255)
    short_overview = models.TextField(verbose_name="This will be shown on the home page card.")
    image = models.ImageField(upload_to="tour")
    tour_map = models.ImageField(upload_to="tour_map", blank=True, null=True)
    tour_map_thumbnail = models.ImageField(upload_to="tour_map/thumbnail", blank=True, null=True)

    html_title = models.CharField(max_length=255, blank=True, null=True)
    html_description = models.TextField(blank=True, null=True)
    html_keywords = models.TextField(blank=True, null=True)

    is_active = models.BooleanField(default=True)
    is_popular = models.BooleanField(default=False)

    order = models.PositiveIntegerField(default=1)

    similar_tours = models.ManyToManyField("self", blank=True)
    travel_styles = models.ManyToManyField(TravelStyle, blank=True)

    destinations = models.ManyToManyField(
        Destination,
        through=TourDestinationRoutes,
        through_fields=(
            "tour",
            "destination",
        ),
        blank=True,
    )

    def __str__(self):
        return self.title

    @hook(AFTER_UPDATE)
    def after_update(self):
        if self.image.url.endswith((".jpg", ".jpeg", ".png")):
            convert_to_webp(self, "tour", f"{slugify(self.title)}")

Hi everyone, Hope u all well.

I should consider if there is any trick for ManyToManyField. I want to watch TourDestinationRoutes's order changes
if I put the AFTER_UPDATE hook to TourDestinationRoutes it triggers many times because sortable-admin changes all route object's order