diff --git a/apps/promotions/models.py b/apps/promotions/models.py index 25d107f..6f9a661 100644 --- a/apps/promotions/models.py +++ b/apps/promotions/models.py @@ -3,7 +3,7 @@ import uuid from django.conf import settings from django.contrib.postgres.indexes import GinIndex from django.db import models, transaction -from django.db.models import F +from django.db.models import F, Q from django.utils import timezone from django_minio_backend import MinioBackend, iso_date_prefix @@ -136,17 +136,16 @@ class Plan(BaseModel): return self.title def get_configured_promotion_amount(self, user_uuid=None): - recipients = list(self.recipients.filter(recipient_uuid_field='->event:user')) #TODO: instead of hard code use better soloution - restricted_ids = [r.pk for r in recipients if r.access_type == RecipientTypeChoices.RESTRICTED] - allowed_ids = set( - AllowedUser.objects.filter(recipient_id__in=restricted_ids, user__uuid=user_uuid) - .values_list('recipient_id', flat=True) - ) if restricted_ids and user_uuid else set() + access_filter = Q(access_type=RecipientTypeChoices.PUBLIC) + if user_uuid: + access_filter |= Q(access_type=RecipientTypeChoices.RESTRICTED, allowed_users__user__uuid=user_uuid) + + recipients = self.recipients.filter( + recipient_uuid_field='->event:user' #TODO: instead of hard code use better soloution + ).filter(access_filter).distinct() amount = 0 for recipient in recipients: - if recipient.access_type == RecipientTypeChoices.RESTRICTED and recipient.pk not in allowed_ids: - continue base_amount, promotion_amount = recipient.get_promotion_amount() amount += promotion_amount return amount