52 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from django.db.models import F, Sum
 | 
						|
from django.db.models.signals import m2m_changed, post_delete, post_save, pre_save
 | 
						|
from django.dispatch import receiver
 | 
						|
from django.utils.timezone import now
 | 
						|
 | 
						|
from games.models import Game, GameStatusChange, Purchase, Session
 | 
						|
 | 
						|
 | 
						|
@receiver(m2m_changed, sender=Purchase.games.through)
 | 
						|
def update_num_purchases(sender, instance, **kwargs):
 | 
						|
    instance.num_purchases = instance.games.count()
 | 
						|
    instance.updated_at = now()
 | 
						|
    instance.save(update_fields=["num_purchases"])
 | 
						|
 | 
						|
 | 
						|
@receiver([post_save, post_delete], sender=Session)
 | 
						|
def update_game_playtime(sender, instance, **kwargs):
 | 
						|
    game = instance.game
 | 
						|
    total_playtime = game.sessions.aggregate(
 | 
						|
        total_playtime=Sum(F("duration_calculated") + F("duration_manual"))
 | 
						|
    )["total_playtime"]
 | 
						|
    game.playtime = total_playtime if total_playtime else 0
 | 
						|
    game.save(update_fields=["playtime"])
 | 
						|
 | 
						|
 | 
						|
@receiver(pre_save, sender=Game)
 | 
						|
def game_status_changed(sender, instance, **kwargs):
 | 
						|
    """
 | 
						|
    Signal handler to create a GameStatusChange record whenever a Game's status is updated.
 | 
						|
    """
 | 
						|
    try:
 | 
						|
        old_instance = sender.objects.get(pk=instance.pk)
 | 
						|
        old_status = old_instance.status
 | 
						|
        print("Got old instance")
 | 
						|
    except sender.DoesNotExist:
 | 
						|
        # Handle the case where the instance was deleted before the signal was sent
 | 
						|
        print("Instance does not exist")
 | 
						|
        return
 | 
						|
 | 
						|
    if old_status != instance.status:
 | 
						|
        print("Status changed")
 | 
						|
        GameStatusChange.objects.create(
 | 
						|
            game=instance,
 | 
						|
            old_status=old_status,
 | 
						|
            new_status=instance.status,
 | 
						|
            timestamp=instance.updated_at,
 | 
						|
        )
 | 
						|
    else:
 | 
						|
        print("Status not changed")
 | 
						|
        print(f"{old_instance.status}")
 | 
						|
        print(f"{instance.status}")
 |