diff --git a/accounts/api/serializers.py b/accounts/api/serializers.py index fd35547..eec1c17 100644 --- a/accounts/api/serializers.py +++ b/accounts/api/serializers.py @@ -135,7 +135,6 @@ class PasswordResetSerializer(BasePasswordSerializer, serializers.ModelSerialize class ProfileSerializer(serializers.ModelSerializer): profile_photo = serializers.ImageField(required=False) - phone_no = serializers.CharField(read_only=True) email = serializers.CharField(read_only=True) invite_count = serializers.SerializerMethodField(read_only=True) principal_type_name = serializers.SerializerMethodField(read_only=True) @@ -148,7 +147,6 @@ class ProfileSerializer(serializers.ModelSerializer): "profile_photo", "first_name", "last_name", - "phone_no", "email", "invite_count", ] diff --git a/manage_events/api/serializers.py b/manage_events/api/serializers.py index 56b4ffa..5e89960 100644 --- a/manage_events/api/serializers.py +++ b/manage_events/api/serializers.py @@ -1,5 +1,6 @@ from rest_framework import serializers from accounts.models import IAmPrincipalLocation +from accounts.api.serializers import ProfileSerializer from manage_events.models import ( EventMaster, Event, @@ -23,6 +24,8 @@ class EventImageSerializer(serializers.ModelSerializer): class VenueSerializer(serializers.ModelSerializer): + created_by = ProfileSerializer(read_only=True) + class Meta: model = Venue fields = "__all__" diff --git a/manage_referrals/admin.py b/manage_referrals/admin.py index 8c38f3f..e0d4ce1 100644 --- a/manage_referrals/admin.py +++ b/manage_referrals/admin.py @@ -1,3 +1,87 @@ from django.contrib import admin +from .models import ReferralCode, ReferralRecord, ReferralRecordReward -# Register your models here. + +class ReferralCodeAdmin(admin.ModelAdmin): + list_display = ( + "referral_code", + "principal", + "principal_type", + "get_principal_name", + ) + search_fields = ( + "referral_code", + "principal__first_name", + "principal__last_name", + "principal_type__name", + ) + list_filter = ("principal_type",) + + def get_principal_name(self, obj): + return obj.principal.first_name + " " + obj.principal.last_name + + get_principal_name.short_description = "Principal Name" + + +admin.site.register(ReferralCode, ReferralCodeAdmin) + + +class ReferralRecordAdmin(admin.ModelAdmin): + list_display = ( + "id", + "get_referrer_name", + "get_referred_name", + "principal_type", + "is_completed", + ) + search_fields = ( + "referrer_principal__first_name", + "referrer_principal__last_name", + "referred_principal__first_name", + "referred_principal__last_name", + "principal_type__name", + ) + list_filter = ( + "is_completed", + "principal_type", + ) + raw_id_fields = ("referrer_principal", "referred_principal", "principal_type") + + def get_referrer_name(self, obj): + return f"{obj.referrer_principal.first_name} {obj.referrer_principal.last_name}" + + get_referrer_name.short_description = "Referrer Name" + + def get_referred_name(self, obj): + return f"{obj.referred_principal.first_name} {obj.referred_principal.last_name}" + + get_referred_name.short_description = "Referred Name" + + +admin.site.register(ReferralRecord, ReferralRecordAdmin) + + +class ReferralRecordRewardAdmin(admin.ModelAdmin): + list_display = ( + "id", + "get_referral_record_id", + "get_subscription_name", + "coins", + "value", + ) + search_fields = ("referral_record__id", "subscription__name", "coins") + list_filter = ("subscription",) + raw_id_fields = ("referral_record", "subscription") + + def get_referral_record_id(self, obj): + return f"{obj.referral_record.id}" + + get_referral_record_id.short_description = "Referral Record ID" + + def get_subscription_name(self, obj): + return obj.subscription.name + + get_subscription_name.short_description = "Subscription Name" + + +admin.site.register(ReferralRecordReward, ReferralRecordRewardAdmin) diff --git a/manage_referrals/migrations/0002_goodtimecoins.py b/manage_referrals/migrations/0002_goodtimecoins.py new file mode 100644 index 0000000..2981bca --- /dev/null +++ b/manage_referrals/migrations/0002_goodtimecoins.py @@ -0,0 +1,65 @@ +# Generated by Django 5.0.2 on 2024-03-01 10:55 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("manage_referrals", "0001_initial"), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name="GoodTimeCoins", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("active", models.BooleanField(default=True)), + ("deleted", models.BooleanField(default=False)), + ("created_on", models.DateTimeField(auto_now_add=True)), + ("modified_on", models.DateTimeField(auto_now=True)), + ("coins", models.IntegerField()), + ( + "value_in_pound", + models.DecimalField(decimal_places=2, max_digits=10), + ), + ("comments", models.CharField(blank=True, max_length=255, null=True)), + ("start_date", models.DateField()), + ("end_date", models.DateField()), + ( + "created_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(class)s_created", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "modified_by", + models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name="%(class)s_modified", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "db_table": "good_time_coins", + }, + ), + ] diff --git a/manage_referrals/models.py b/manage_referrals/models.py index 1fb6795..cf84f3a 100644 --- a/manage_referrals/models.py +++ b/manage_referrals/models.py @@ -2,7 +2,7 @@ from django.db import models import random import string from accounts.models import BaseModel, IAmPrincipal, IAmPrincipalType -from manage_subscriptions.models import Subscription +from manage_subscriptions.models import PrincipalSubscription, Subscription # Create your models here. @@ -147,6 +147,12 @@ class ReferralTracking(BaseModel): referral_record = models.ForeignKey( ReferralRecord, on_delete=models.CASCADE, related_name="record_tracking" ) + referrer_subscription_id = models.PositiveIntegerField(null=True, blank=True) + referred_subscription_id = models.PositiveIntegerField(null=True, blank=True) + is_referrer_subscribed = models.BooleanField( + default=False, + help_text="is referrer subscribed at the time of referred subscription", + ) ip_address = models.GenericIPAddressField() user_agent = models.CharField(max_length=255) device_model = models.CharField(max_length=100, blank=True, null=True) @@ -156,3 +162,17 @@ class ReferralTracking(BaseModel): def __str__(self): return f"Referral Record ID: {self.referral_record.id}" + + +class GoodTimeCoins(BaseModel): + coins = models.IntegerField() + value_in_pound = models.DecimalField(max_digits=10, decimal_places=2) + comments = models.CharField(max_length=255, blank=True, null=True) + start_date = models.DateField() + end_date = models.DateField() + + def __str__(self): + return f"Coins: {self.coins}, Value in Pound: {self.value_in_pound}" + + class Meta: + db_table = "good_time_coins" diff --git a/manage_subscriptions/api/views.py b/manage_subscriptions/api/views.py index 7dfdc17..bba8938 100644 --- a/manage_subscriptions/api/views.py +++ b/manage_subscriptions/api/views.py @@ -48,15 +48,29 @@ class CreatePrincipalSubscriptionApi(APIView): ) print("order_id: ", order_id) try: + customer = stripe.Customer.create( + email=request.user.email, + shipping={ + "name": request.user.first_name, + "address": { + "line1": "Test Address", + "city": "Test City", + "postal_code": "400060", + "country": "IN", # Adjust accordingly + }, + }, + ) + payment_intent = stripe.PaymentIntent.create( amount=int(subscription.amount * 100), - currency="INR", + currency="GBP", description="Principal Subscription", metadata={ "principal": request.user.id, "order_id": order_id, "subscription": subscription.id, }, + customer=customer.id, ) return Response( { @@ -120,6 +134,8 @@ class CreatePrincipalSubscriptionApi(APIView): # return ApiResponse.error(**fail_response) import json + + @method_decorator(csrf_exempt, name="dispatch") class StripeWebhookTest(APIView): authentication_classes = [] diff --git a/manage_subscriptions/utils.py b/manage_subscriptions/utils.py new file mode 100644 index 0000000..0ba51b2 --- /dev/null +++ b/manage_subscriptions/utils.py @@ -0,0 +1,20 @@ +from django.utils.timezone import now + +from manage_subscriptions.models import PrincipalSubscription, SubscriptionStatus + + +def get_active_subscription_id_for_principal(principal): + # Filter subscriptions for the principal that are active and not cancelled + active_subscriptions = PrincipalSubscription.objects.filter( + principal=principal, + status=SubscriptionStatus.ACTIVE, + cancelled=False, + end_date__gte=now().date(), # Ensure the subscription hasn't expired + ).order_by( + "-end_date" + ) # Order by end_date to get the most recent active subscription + + if active_subscriptions.exists(): + # Return the ID of the most recent active subscription + return active_subscriptions.first().id + return None