diff --git a/manage_subscriptions/urls.py b/manage_subscriptions/urls.py index 5b1f6fb..0085713 100644 --- a/manage_subscriptions/urls.py +++ b/manage_subscriptions/urls.py @@ -92,6 +92,7 @@ urlpatterns = [ ), path("stripe/", views.SubscriptionPageView.as_view(), name="stripe"), path("active/", views.ActiveSubscriptionView.as_view(), name="active"), + path("active/", views.CancelSubscriptionView.as_view(), name="cancel_subscription"), path("success/", views.SuccessView.as_view(), name="success"), path("cancel/", views.CancelView.as_view(), name="cancel"), # path("join-now/", views.IndexView.as_view(), name="index"), diff --git a/manage_subscriptions/views.py b/manage_subscriptions/views.py index cfb8348..c7ba6a1 100644 --- a/manage_subscriptions/views.py +++ b/manage_subscriptions/views.py @@ -38,6 +38,7 @@ from django.views.decorators.http import require_POST from django.conf import settings from django.views.generic.base import TemplateView from django.db.models import Q +from django.db import transaction # Create your views here. @@ -670,6 +671,7 @@ class ActiveSubscriptionView(TemplateView): def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) request = self.request + today = timezone.now().date() if request.user.is_authenticated: active_subscription = ( PrincipalSubscription.objects.filter( @@ -684,7 +686,7 @@ class ActiveSubscriptionView(TemplateView): .first() ) - if active_subscription: + if active_subscription and active_subscription.end_date > today: context["active_subscription"] = active_subscription else: # If no active subscription is found, redirect to the SubscriptionPageView @@ -693,6 +695,40 @@ class ActiveSubscriptionView(TemplateView): return context +class CancelSubscriptionView(LoginRequiredMixin, generic.View): + def post(self, request, *args, **kwargs): + subscription_id = request.POST.get("subscription_id") + + try: + subscription = PrincipalSubscription.objects.get( + id=subscription_id, principal=request.user + ) + except PrincipalSubscription.DoesNotExist: + messages.error(request, "Subscription not found.") + return redirect("manage_subscriptions:cancel") + + try: + with transaction.atomic(): + if subscription.is_stripe_subscription: + # Cancel Stripe subscription + stripe.Subscription.modify( + subscription.stripe_subscription_id, cancel_at_period_end=True + ) + + # Updating subscription status in the local database + subscription.status = SubscriptionStatus.INACTIVE + subscription.cancelled = True + subscription.active = False + subscription.cancelled_date_time = timezone.now() + subscription.save() + + messages.success(request, "Subscription cancelled successfully.") + return redirect("manage_subscriptions:success") + except stripe.error.InvalidRequestError as e: + messages.error(request, f"Stripe error: {str(e)}") + return redirect("manage_subscriptions:cancel") + + @csrf_exempt def stripe_config(request): if request.method == "GET": diff --git a/templates/stripe_html/active_subscription.html b/templates/stripe_html/active_subscription.html index 06f440a..f489d9f 100644 --- a/templates/stripe_html/active_subscription.html +++ b/templates/stripe_html/active_subscription.html @@ -1,70 +1,125 @@ + Active Subscription - + + -
+ +
+

Your Active Subscription

+
+ +
-
-

Your Active Subscription

+
+

{{ active_subscription.subscription.name }}

- -
-
-
Subscription:
-

{{ active_subscription.subscription.name }}

-
-
-
Principal:
-

{{ active_subscription.principal.first_name }} {{ active_subscription.principal.last_name }}

-
-
+

Status: {{ active_subscription.status }}

+

Start Date: {{ active_subscription.start_date }}

+

End Date: {{ active_subscription.end_date }}

+

Auto Renew: {{ active_subscription.auto_renew }}

-
-
-
Status:
-

{{ active_subscription.get_status_display }}

-
-
-
Start Date:
-

{{ active_subscription.start_date }}

-
+ {% if active_subscription.cancelled %} +
+

Cancellation Details

+

Cancelled: Yes

+

Cancellation Date: {{ active_subscription.cancelled_date_time }}

+

Grace Period Ends: {{ active_subscription.grace_period_end_date }}

+ {% endif %} -
-
-
End Date:
-

{{ active_subscription.end_date }}

+ {% if active_subscription.auto_renew and not active_subscription.cancelled %} +
+

Cancel Subscription

+
+ {% csrf_token %} + + +
-
-
Auto Renew:
-

{{ active_subscription.auto_renew|yesno:"Yes,No" }}

-
-
+ {% endif %} - -
-
-
Coupon Code:
-

{{ active_subscription.coupon_code }}

-
-
- - -
- - +