From 1d7b088f317eacd9525a5ff36012e69d4298b9fa Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Tue, 14 Feb 2023 16:45:48 +0300 Subject: [PATCH 1/9] fix serializer error --- Dockerfile | 2 +- core/serializers.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index b4bb8d7e..cbac8762 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.7-alpine3.10 +FROM --platform=linux/amd64 python:3.7-alpine3.10 # Do not buffer log messages in memory; some messages can be lost otherwise ENV PYTHONUNBUFFERED 1 diff --git a/core/serializers.py b/core/serializers.py index 5c0376ce..1459f6e7 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -356,7 +356,10 @@ class Meta: fields = '__all__' def get_subscription(self, organization): - return SubscriptionSerializer(organization.organization_subscription.all()).data + return SubscriptionSerializer( + organization.organization_subscription.all(), + many=True + ).data class OrganizationNestedSerializer(serializers.ModelSerializer): From dfd165e250e8b5e5c9e58b4c07fcca59c779cfab Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Wed, 15 Feb 2023 17:41:28 +0300 Subject: [PATCH 2/9] update stripe info --- core/models.py | 1 + core/views/subscription.py | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/models.py b/core/models.py index 573d9da8..97aae528 100644 --- a/core/models.py +++ b/core/models.py @@ -281,6 +281,7 @@ class Partner(models.Model): class Subscription(models.Model): subscription_uuid = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False) stripe_product = models.CharField(max_length=255) + stripe_product_info = JSONField(blank=True, null=True) customer_stripe_id = models.CharField(max_length=255) stripe_card_id = models.CharField(max_length=255, null=True, blank=True) trial_start_date = models.DateField(null=True, blank=True) diff --git a/core/views/subscription.py b/core/views/subscription.py index 34eb8c0c..eb8d77eb 100644 --- a/core/views/subscription.py +++ b/core/views/subscription.py @@ -126,10 +126,22 @@ def get_stripe_details(self): trial_start_date=timezone.now().date(), trial_end_date=timezone.now().date() + relativedelta.relativedelta(months=1), subscription_start_date=timezone.now().date() + relativedelta.relativedelta(months=1), + subscription_end_date=timezone.now().date() + relativedelta.relativedelta(months=2), organization=self.request.user.organization.organization_uuid, ) - data.update(stripe_subscription_details) + + # get product details + stripe_product = stripe.Product.retrieve(product).data + data.update( + dict( + stripe_product_info=dict( + id=stripe_product.get('id'), + name=stripe_product.get('name') + ) + ) + ) + except stripe.error.InvalidRequestError: return None From 980243a001b77c52c82348367293fd9727b2f80a Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Wed, 15 Feb 2023 17:44:43 +0300 Subject: [PATCH 3/9] update subscription fields --- .../0014_subscription_stripe_product_info.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 core/migrations/0014_subscription_stripe_product_info.py diff --git a/core/migrations/0014_subscription_stripe_product_info.py b/core/migrations/0014_subscription_stripe_product_info.py new file mode 100644 index 00000000..67b1b73d --- /dev/null +++ b/core/migrations/0014_subscription_stripe_product_info.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.28 on 2023-02-15 14:43 + +import django.contrib.postgres.fields.jsonb +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0013_auto_20230207_1403'), + ] + + operations = [ + migrations.AddField( + model_name='subscription', + name='stripe_product_info', + field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True), + ), + ] From 4f04a3d892ef7001d5192b5a0d176453f3cd2222 Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Thu, 16 Feb 2023 09:21:25 +0300 Subject: [PATCH 4/9] fix subscription endpoint --- core/views/subscription.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/views/subscription.py b/core/views/subscription.py index eb8d77eb..7f60ee8e 100644 --- a/core/views/subscription.py +++ b/core/views/subscription.py @@ -132,12 +132,13 @@ def get_stripe_details(self): data.update(stripe_subscription_details) # get product details - stripe_product = stripe.Product.retrieve(product).data + stripe_product = stripe.Product.retrieve(product) data.update( dict( stripe_product_info=dict( id=stripe_product.get('id'), - name=stripe_product.get('name') + name=stripe_product.get('name'), + description=stripe_product.get('description', ''), ) ) ) @@ -146,3 +147,4 @@ def get_stripe_details(self): return None return data + From 9b9cbafa5546ec3384d1e9074af6738ee0f8bb4d Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Thu, 23 Feb 2023 17:35:44 +0300 Subject: [PATCH 5/9] fix data --- core/views/subscription.py | 20 ++++++++++ templates/email/coreuser/subscription.html | 46 ++++++++++++++++++++++ templates/email/coreuser/subscription.txt | 11 ++++++ 3 files changed, 77 insertions(+) create mode 100644 templates/email/coreuser/subscription.html create mode 100644 templates/email/coreuser/subscription.txt diff --git a/core/views/subscription.py b/core/views/subscription.py index 7f60ee8e..c51e86af 100644 --- a/core/views/subscription.py +++ b/core/views/subscription.py @@ -11,6 +11,7 @@ from rest_framework.decorators import action from rest_framework.permissions import (AllowAny, IsAuthenticated) +from core.email_utils import send_email from core.models import Subscription from core.serializers import SubscriptionSerializer @@ -60,6 +61,25 @@ def update(self, request, *args, **kwargs): serializer.is_valid(raise_exception=True) self.perform_create(serializer) + product_info = data.get('stripe_product_info', {}) + # send the email + frontend_link = '' + context = { + 'frontend_link': frontend_link, + 'product_name': product_info.get('name'), + 'product_description': product_info.get('description') + } + subject = 'Subscription Success' + template_name = 'email/coreuser/subscription.txt' + html_template_name = 'email/coreuser/subscription.html' + send_email( + self.request.user.email, + subject, + context, + template_name, + html_template_name + ) + return Response( serializer.data, status=status.HTTP_201_CREATED diff --git a/templates/email/coreuser/subscription.html b/templates/email/coreuser/subscription.html new file mode 100644 index 00000000..35dacb69 --- /dev/null +++ b/templates/email/coreuser/subscription.html @@ -0,0 +1,46 @@ + + + + + + + +
Buildly
+



+ + + + + + +
+

Subscription successful!

+

You have successfully subscribed to Insights on Buildly!
Click the button below to return to the app

+
+ + + + + + +
Buildly Insights
+ + + + + + + + + + + + + + + +
+

Package

+
{{ product_name }}
{{ product_description }}
+ + diff --git a/templates/email/coreuser/subscription.txt b/templates/email/coreuser/subscription.txt new file mode 100644 index 00000000..c930c8f9 --- /dev/null +++ b/templates/email/coreuser/subscription.txt @@ -0,0 +1,11 @@ +Subscription successful! + +You have successfully subscribed to Insights on Buildly. + +Go to {{ frontend_link }} to access the app. + +Package! + +{{ product_name }} + +{{ product_description }} \ No newline at end of file From cd6e540ecb36bcb94bc6561f3cd1a26505ec6b2b Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Thu, 23 Feb 2023 18:10:39 +0300 Subject: [PATCH 6/9] fix data --- core/views/subscription.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/views/subscription.py b/core/views/subscription.py index c51e86af..333eca10 100644 --- a/core/views/subscription.py +++ b/core/views/subscription.py @@ -63,9 +63,8 @@ def update(self, request, *args, **kwargs): product_info = data.get('stripe_product_info', {}) # send the email - frontend_link = '' context = { - 'frontend_link': frontend_link, + 'frontend_link': settings.FRONTEND_URL, 'product_name': product_info.get('name'), 'product_description': product_info.get('description') } From d1ec61781a96e3d8514a9e862fac636820eb08ac Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Wed, 1 Mar 2023 07:53:40 +0100 Subject: [PATCH 7/9] add coupon field --- core/migrations/0015_coreuser_coupon.py | 18 ++++++++++++++++++ core/models.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 core/migrations/0015_coreuser_coupon.py diff --git a/core/migrations/0015_coreuser_coupon.py b/core/migrations/0015_coreuser_coupon.py new file mode 100644 index 00000000..87912c7e --- /dev/null +++ b/core/migrations/0015_coreuser_coupon.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2023-03-01 06:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0014_subscription_stripe_product_info'), + ] + + operations = [ + migrations.AddField( + model_name='coreuser', + name='coupon', + field=models.CharField(blank=True, max_length=48, null=True), + ), + ] diff --git a/core/models.py b/core/models.py index 97aae528..c1d2cd02 100644 --- a/core/models.py +++ b/core/models.py @@ -187,6 +187,7 @@ class CoreUser(AbstractUser): edit_date = models.DateTimeField(null=True, blank=True) user_type = models.CharField(blank=True, null=True, max_length=50, choices=USER_TYPE_CHOICES, default='Product Team') survey_status = models.BooleanField(default=False) + coupon = models.CharField(max_length=48, blank=True, null=True) class Meta: ordering = ('first_name',) From c35b70d6f633723d5911db56be8355a197722703 Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Wed, 1 Mar 2023 14:11:07 +0100 Subject: [PATCH 8/9] update coupon code --- core/migrations/0016_auto_20230301_1310.py | 18 ++++++++++++++++++ core/models.py | 2 +- core/serializers.py | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 core/migrations/0016_auto_20230301_1310.py diff --git a/core/migrations/0016_auto_20230301_1310.py b/core/migrations/0016_auto_20230301_1310.py new file mode 100644 index 00000000..482cdf8e --- /dev/null +++ b/core/migrations/0016_auto_20230301_1310.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.28 on 2023-03-01 13:10 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0015_coreuser_coupon'), + ] + + operations = [ + migrations.RenameField( + model_name='coreuser', + old_name='coupon', + new_name='coupon_code', + ), + ] diff --git a/core/models.py b/core/models.py index c1d2cd02..29cdca44 100644 --- a/core/models.py +++ b/core/models.py @@ -187,7 +187,7 @@ class CoreUser(AbstractUser): edit_date = models.DateTimeField(null=True, blank=True) user_type = models.CharField(blank=True, null=True, max_length=50, choices=USER_TYPE_CHOICES, default='Product Team') survey_status = models.BooleanField(default=False) - coupon = models.CharField(max_length=48, blank=True, null=True) + coupon_code = models.CharField(max_length=48, blank=True, null=True) class Meta: ordering = ('first_name',) diff --git a/core/serializers.py b/core/serializers.py index 1459f6e7..75a82bd0 100644 --- a/core/serializers.py +++ b/core/serializers.py @@ -146,7 +146,7 @@ def create(self, validated_data): core_groups = validated_data.pop('core_groups', []) invitation_token = validated_data.pop('invitation_token', None) - coupon_code = validated_data.pop('coupon_code', None) + coupon_code = validated_data.get('coupon_code', None) # create core user if settings.AUTO_APPROVE_USER: # If auto-approval set to true From 57fdec47e05b20db5e50ff6aa5c32e86dd8c8669 Mon Sep 17 00:00:00 2001 From: Peter Odeny Date: Thu, 9 Mar 2023 12:33:26 +0100 Subject: [PATCH 9/9] update version --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index cbac8762..b80f4585 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,4 +25,4 @@ EXPOSE 8080 ENTRYPOINT ["bash", "/code/scripts/docker-entrypoint.sh"] # Specify tag name to be created on github -LABEL version="0.5.5" +LABEL version="0.5.6"