event api
This commit is contained in:
parent
ef7adea815
commit
286e61db2d
5 changed files with 74 additions and 29 deletions
|
|
@ -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,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue