From 8f206269fa9bf0b6fe3d563b821360ab7032c866 Mon Sep 17 00:00:00 2001 From: Sayyid Hamid Mahdavi Date: Tue, 16 Sep 2025 20:43:13 +0330 Subject: [PATCH] end of day --- apps/promotions/models.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/apps/promotions/models.py b/apps/promotions/models.py index b59873d..77ad649 100644 --- a/apps/promotions/models.py +++ b/apps/promotions/models.py @@ -1,5 +1,3 @@ -from cgitb import handler - from django.conf import settings from django.db import models, transaction from django.db.models import F @@ -13,23 +11,44 @@ from utils.models import BaseModel from django.utils.translation import gettext_lazy as _ +class EventQuerySet(models.QuerySet): + pass + +class Event(BaseModel): + actor = None + target = None + label = None + details = {} + + objects = EventQuerySet.as_manager() + + def analyze(self): + for plan in Plan.objects.get_related_to_event(self): + plan.process_event(self) + + class PlanQuerySet(models.QuerySet): def calculate(self, user, application=None): for plan in self.filter(application=application)[:10]: if not Promotion.objects.used(user): plan.calculate(user) + def get_related_to_event(self, event): + return self.filter(event_list__icontains=event.label) + class Plan(BaseModel): # user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT) application = models.ForeignKey(oauth2_settings.APPLICATION_MODEL, on_delete=models.PROTECT, related_name='+', null=True, blank=True) + event_list = models.JSONField(default=list) title = models.CharField(max_length=255, verbose_name=_('title'), db_index=True) description = models.TextField(verbose_name=_('description'), blank=True) promotion_type = models.CharField(max_length=64, verbose_name=_('promotion type'), db_index=True, choices=PromotionTypeChoices.choices) policy = models.JSONField(default=dict, verbose_name=_('policy'), null=True, blank=True) balance = models.IntegerField(verbose_name=_('balance'), default=0) + objects = PlanQuerySet.as_manager() def __str__(self): @@ -57,6 +76,10 @@ class Plan(BaseModel): ) return updated + def process_event(self, event=None): + promotion, created = Promotion.objects.get_or_create() + promotion.promote() + class PromotionQuerySet(models.QuerySet): def used(self, user):