basic serial promotion

This commit is contained in:
Sayyid Hamid Mahdavi 2026-02-24 13:27:33 +03:30
parent 2de2f5adc3
commit 8cdcd7b1c2
4 changed files with 18 additions and 8 deletions

View file

@ -7,7 +7,10 @@ from .models import Promotion, Plan, Event, Recipient, EventSaver
class PromotionAdmin(admin.ModelAdmin): class PromotionAdmin(admin.ModelAdmin):
list_display = ['user_uuid', 'plan', 'promotion_amount', 'recipient', 'event', 'created_at'] list_display = ['user_uuid', 'plan', 'promotion_amount', 'recipient', 'event', 'created_at']
admin.site.register(Plan) class PlanAdmin(admin.ModelAdmin):
list_display = ['uuid', 'title', 'balance']
admin.site.register(Plan, PlanAdmin)
admin.site.register(Promotion, PromotionAdmin) admin.site.register(Promotion, PromotionAdmin)
admin.site.register(Event) admin.site.register(Event)
admin.site.register(EventSaver) admin.site.register(EventSaver)

View file

@ -108,7 +108,7 @@ class Plan(BaseModel):
title = models.CharField(max_length=255, verbose_name=_('title'), db_index=True) title = models.CharField(max_length=255, verbose_name=_('title'), db_index=True)
banner = models.ImageField(null=True, blank=True, storage=MinioBackend(), upload_to=iso_date_prefix) banner = models.ImageField(null=True, blank=True, storage=MinioBackend(), upload_to=iso_date_prefix)
description = models.TextField(verbose_name=_('description'), blank=True) description = models.TextField(verbose_name=_('description'), blank=True)
description_details = models.JSONField(verbose_name=_('description details'), blank=True) description_details = models.JSONField(verbose_name=_('description details'), blank=True, default=dict)
processor = models.CharField(max_length=64, verbose_name=_('processor'), db_index=True, processor = models.CharField(max_length=64, verbose_name=_('processor'), db_index=True,
choices=ProcessorTypeChoices.choices) # TODO: processor type choices=ProcessorTypeChoices.choices) # TODO: processor type
data = models.JSONField(default=dict, verbose_name=_('data'), null=True, blank=True) data = models.JSONField(default=dict, verbose_name=_('data'), null=True, blank=True)
@ -409,7 +409,7 @@ class Promotion(BaseModel):
"payee_wallet": settings.WALLET_REWARD, "payee_wallet": settings.WALLET_REWARD,
"amount": self.promotion_amount, "amount": self.promotion_amount,
"details": { "details": {
'description': str(_("promotions")), 'description': str(_(self.recipient.label)),
'reference_id': str(self.pk), 'reference_id': str(self.pk),
'application_details_url': '' 'application_details_url': ''
}, },

View file

@ -69,6 +69,7 @@ class ApplicationApiFlowsTests(APITestCase):
first_ad_view_reward_label = 'first_ad_view_reward_label' first_ad_view_reward_label = 'first_ad_view_reward_label'
referral_reward_label = 'referral_reward_label' referral_reward_label = 'referral_reward_label'
settlement_reward_label = 'settlement_reward_label' settlement_reward_label = 'settlement_reward_label'
serial_reward_label = 'serial_reward_label'
scopes = [ scopes = [
'promotions.application.event:submit', 'promotions.application.event:submit',
@ -365,7 +366,7 @@ class ApplicationApiFlowsTests(APITestCase):
) )
self.serial_promotion_plan, _created = Plan.objects.get_or_create( self.serial_promotion_plan, _created = Plan.objects.get_or_create(
title=self.settlement_reward_label, title=self.serial_reward_label,
balance=100000, balance=100000,
user=self.user_1, user=self.user_1,
application=self.application, application=self.application,
@ -430,9 +431,13 @@ class ApplicationApiFlowsTests(APITestCase):
self.assertEqual(Event.objects.count(), 0) self.assertEqual(Event.objects.count(), 0)
response = self.client.post(reverse('promotions:event-create'), serial_ad_2_event_create_data, HTTP_AUTHORIZATION=auth, format='json') response = self.client.post(reverse('promotions:promotion-create', kwargs={"plan":str(self.serial_promotion_plan.pk)}), serial_ad_1_event_create_data, HTTP_AUTHORIZATION=auth, format='json')
print(response.json()) print(response.json())
event_2 = Event.objects.first() response = self.client.post(reverse('promotions:promotion-create', kwargs={"plan":str(self.serial_promotion_plan.pk)}), serial_ad_2_event_create_data, HTTP_AUTHORIZATION=auth, format='json')
# response = self.client.post(reverse('promotions:event-create'), serial_ad_2_event_create_data, HTTP_AUTHORIZATION=auth, format='json')
print(response.json())
# event_2 = Event.objects.first()
return return

View file

@ -184,8 +184,10 @@ class ApplicationPromoteUserApiView(CreateAPIView):
# except Exception as e: # except Exception as e:
# raise exceptions.ValidationError(str(e)) # raise exceptions.ValidationError(str(e))
result_list = plan.process_event(event) result_list = list(plan.process_event(event))
data["promotions"] = result_list # data["promotions"] = list(result_list)
serializer = self.get_serializer(instance=plan)
headers = self.get_success_headers(serializer.data) headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)