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):