Files
goodtimes/manage_subscriptions/models.py

136 lines
4.9 KiB
Python
Raw Normal View History

from datetime import timedelta, timezone
2024-02-29 13:25:50 +05:30
from django.db import models
from accounts.models import BaseModel, IAmPrincipal, IAmPrincipalType
from django.utils.translation import gettext_lazy as _
2024-04-04 20:11:07 +05:30
2024-02-29 13:25:50 +05:30
# Create your models here.
class Plan(BaseModel):
title = models.CharField(max_length=255)
days = models.PositiveIntegerField()
class Meta:
db_table = "plan"
def __str__(self):
return self.title
2024-07-31 13:12:17 +05:30
class StripeProduct(BaseModel):
title = models.CharField(max_length=255)
product_id = models.CharField(max_length=255, blank=True, null=True)
description = models.TextField(blank=True, null=True)
metadata = models.JSONField(blank=True, null=True)
image_url = models.URLField(blank=True, null=True)
default_price_id = models.CharField(max_length=255, blank=True, null=True)
class Meta:
db_table = "stripe_product"
def __str__(self):
return self.title
2024-02-29 13:25:50 +05:30
class Subscription(BaseModel):
title = models.CharField(max_length=255)
2024-07-31 13:12:17 +05:30
price_id = models.CharField(max_length=255, blank=True, null=True)
stripe_product = models.ForeignKey(
StripeProduct,
related_name="subscription_product",
on_delete=models.CASCADE,
null=True,
blank=True,
)
2024-04-10 14:53:30 +05:30
short_description = models.CharField(max_length=255, null=True, blank=True)
long_description = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to="subscription_img", null=True, blank=True)
2024-02-29 13:25:50 +05:30
plan = models.ForeignKey(
Plan, related_name="subscription_plan", on_delete=models.CASCADE
)
2024-04-10 14:53:30 +05:30
high_amount = models.DecimalField(max_digits=14, decimal_places=2, default=0.00)
2024-02-29 13:25:50 +05:30
amount = models.DecimalField(max_digits=14, decimal_places=2, default=0.00)
2024-04-07 16:45:22 +05:30
principal_types = models.ManyToManyField(
2024-04-09 16:24:15 +05:30
IAmPrincipalType, related_name="principal_type_subscriptions", blank=True
2024-04-07 16:45:22 +05:30
)
2024-04-24 13:45:16 +05:30
referral_percentage = models.DecimalField(max_digits=5, decimal_places=2)
2024-07-31 13:12:17 +05:30
is_free = models.BooleanField(
default=False,
help_text="Indicates whether this subscription is free and only accessible by administrators, not visible to regular users.",
)
2024-02-29 13:25:50 +05:30
class Meta:
db_table = "subscription"
def __str__(self):
return self.title
class SubscriptionStatus(models.TextChoices):
2024-04-04 20:11:07 +05:30
ACTIVE = "active", _("Active")
EXPIRED = "expired", _("Expired")
INACTIVE = "inactive", _("Inactive")
2024-02-29 13:25:50 +05:30
class PrincipalSubscription(BaseModel):
subscription = models.ForeignKey(
Subscription, related_name="subscription_reference", on_delete=models.CASCADE
)
principal = models.ForeignKey(
IAmPrincipal, related_name="principal_subscription", on_delete=models.CASCADE
)
is_paid = models.BooleanField(default=False)
auto_renew = models.BooleanField(default=False)
status = models.CharField(
max_length=255,
choices=SubscriptionStatus.choices,
default=SubscriptionStatus.ACTIVE,
)
start_date = models.DateField()
end_date = models.DateField()
order_id = models.CharField(max_length=255, null=True, blank=True)
cancelled = models.BooleanField(default=False)
cancelled_date_time = models.DateTimeField(null=True, blank=True)
grace_period_end_date = models.DateField(null=True, blank=True)
stripe_customer_id = models.CharField(max_length=255, null=True, blank=True)
2024-07-31 13:12:17 +05:30
stripe_subscription_id = models.CharField(max_length=255, null=True, blank=True)
comments = models.CharField(max_length=255, null=True, blank=True)
is_stripe_subscription = models.BooleanField(default=False)
2024-02-29 13:25:50 +05:30
payment_intent_id = models.CharField(max_length=255, null=True, blank=True)
2024-04-04 20:11:07 +05:30
payment_intent_client_secret = models.CharField(
max_length=255, null=True, blank=True
)
coupon_code = models.CharField(max_length=255, null=True, blank=True)
2024-02-29 13:25:50 +05:30
class Meta:
db_table = "principal_subscription"
def __str__(self):
return f"{self.subscription} - {self.principal.first_name}"
2024-07-31 13:12:17 +05:30
def generate_order_id(email):
return f"order_{str(timezone.localtime().timestamp())}{str(email)}"
def generate_grace_period_end_date(date):
return date + timedelta(days=15)
2024-04-19 13:00:41 +05:30
class WebhookEvent(BaseModel):
event_id = models.CharField(max_length=255, unique=True, db_index=True)
2024-04-19 16:05:47 +05:30
event_type = models.CharField(max_length=255, null=True, blank=True)
2024-04-19 13:00:41 +05:30
received_at = models.DateTimeField(auto_now_add=True)
processed_at = models.DateTimeField(null=True, blank=True)
status = models.CharField(
max_length=20, default="received"
) # e.g., 'received', 'processed', 'failed'
error_message = models.TextField(null=True, blank=True)
event_payload = models.JSONField(
null=True, blank=True
) # Optional: Store the payload for debugging.
def __str__(self):
return f"Webhook Event {self.event_id} - Status: {self.status}"
class Meta:
db_table = "webhook_event"