event api

This commit is contained in:
Sayyid Hamid Mahdavi 2025-09-20 16:23:25 +03:30
parent ef7adea815
commit 286e61db2d
5 changed files with 74 additions and 29 deletions

View file

@ -0,0 +1,28 @@
# Generated by Django 5.2.6 on 2025-09-20 12:52
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('promotions', '0007_plan_max_amount_plan_min_amount_and_more'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
migrations.swappable_dependency(settings.OAUTH2_PROVIDER_APPLICATION_MODEL),
]
operations = [
migrations.AddField(
model_name='event',
name='application',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='+', to=settings.OAUTH2_PROVIDER_APPLICATION_MODEL),
),
migrations.AddField(
model_name='event',
name='user',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
preserve_default=False,
),
]

View file

@ -17,6 +17,9 @@ class EventQuerySet(models.QuerySet):
class Event(BaseModel): class Event(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)
label = models.CharField(max_length=255, db_index=True) label = models.CharField(max_length=255, db_index=True)
data = models.JSONField() # from to amount application user etc data = models.JSONField() # from to amount application user etc

View file

@ -1,6 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from .models import Promotion, Plan from .models import Promotion, Plan, Event
class PromotionSerializer(serializers.ModelSerializer): class PromotionSerializer(serializers.ModelSerializer):
@ -18,6 +18,18 @@ class PromotionSerializer(serializers.ModelSerializer):
) )
read_only_fields = ('user','application', "promotion_amount",) read_only_fields = ('user','application', "promotion_amount",)
class EventSerializer(serializers.ModelSerializer):
class Meta:
model = Event
fields = (
"label",
"data",
"user",
"application",
)
read_only_fields = ('user','application')
class PlanSerializer(serializers.ModelSerializer): class PlanSerializer(serializers.ModelSerializer):
base_amount = serializers.IntegerField(required=True) base_amount = serializers.IntegerField(required=True)
promotion_amount = serializers.IntegerField(read_only=True) promotion_amount = serializers.IntegerField(read_only=True)

View file

@ -1,7 +1,8 @@
from apps.promotions.models import Event
from main import celery_app from main import celery_app
@celery_app.task @celery_app.task
def sample_application_task(sample_uuid): def analyze_event_task(event_uuid):
from .models import Sample event = Event.objects.get(uuid=event_uuid)
sample = Sample.objects.get(uuid=sample_uuid) event.analyze()

View file

@ -1,35 +1,13 @@
from django.shortcuts import render
from django.http import Http404
from django.shortcuts import render
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from oauth2_provider.contrib.rest_framework import TokenMatchesOASRequirements from rest_framework import mixins
from rest_framework import viewsets, mixins
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.generics import get_object_or_404
from rest_framework.viewsets import GenericViewSet from rest_framework.viewsets import GenericViewSet
from .models import Promotion, Plan
from .serializers import PlanSerializer, PromotionSerializer
from apps.gooyal_oauth2.models import Application
from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements
from apps.gooyal_oauth2.utils import get_application from apps.gooyal_oauth2.utils import get_application
from ..users.models import User
from django.shortcuts import render
from django.http import Http404
from django.shortcuts import render
from django.urls import reverse
from oauth2_provider.contrib.rest_framework import TokenMatchesOASRequirements
from rest_framework import viewsets, mixins
from rest_framework.generics import get_object_or_404
from rest_framework.viewsets import GenericViewSet
from .models import Plan, Promotion from .models import Plan, Promotion
from apps.gooyal_oauth2.models import Application from .serializers import PlanSerializer, PromotionSerializer, EventSerializer
from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements from .tasks import analyze_event_task
from apps.gooyal_oauth2.utils import get_application
from ..users.models import User from ..users.models import User
@ -85,6 +63,29 @@ class ApplicationPromotionViewSet(
promotion.promote(**promotion_args) promotion.promote(**promotion_args)
class ApplicationEventViewSet(
mixins.CreateModelMixin,
GenericViewSet
):
serializer_class = EventSerializer
permission_classes = [IsAuthenticatedOrTokenMatchesOASRequirements]
required_alternate_scopes = {
"POST": [["promotions.application.event:submit"]],
}
def perform_create(self, serializer):
if hasattr(self.request, 'user'):
user = self.request.user
else:
user = None
application = get_application(self.request)
event = serializer.save(user=user, application=application)
analyze_event_task.delay(event.uuid)