Skip to content

Commit

Permalink
Merge pull request #84 from buildly-release-management/master
Browse files Browse the repository at this point in the history
Update prod
  • Loading branch information
glind authored Feb 10, 2023
2 parents df536b6 + ec277e5 commit 3aee3ae
Show file tree
Hide file tree
Showing 19 changed files with 489 additions and 20 deletions.
3 changes: 3 additions & 0 deletions buildly/settings/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -195,9 +195,12 @@
DEFAULT_ORG = os.getenv('DEFAULT_ORG').lower() if os.getenv('DEFAULT_ORG') else None
AUTO_APPROVE_USER = False if os.getenv('AUTO_APPROVE_USER') == 'False' else True
FREE_COUPON_CODE = os.getenv('FREE_COUPON_CODE', '')
STRIPE_SECRET = os.getenv('STRIPE_SECRET', '')


# Swagger settings - for generate_swagger management command

SWAGGER_SETTINGS = {
'DEFAULT_INFO': 'gateway.urls.swagger_info',
}

39 changes: 39 additions & 0 deletions core/migrations/0009_auto_20230115_1103.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Generated by Django 2.2.28 on 2023-01-15 11:03

from django.conf import settings
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion
import uuid


class Migration(migrations.Migration):

dependencies = [
('core', '0008_organization_unlimited_free_plan'),
]

operations = [
migrations.AddField(
model_name='organization',
name='stripe_info',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True),
),
migrations.CreateModel(
name='Subscription',
fields=[
('subscription_uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, unique=True)),
('stripe_product', models.CharField(max_length=255)),
('stripe_id', models.CharField(max_length=255)),
('card', models.CharField(blank=True, max_length=255, null=True)),
('trial_start_date', models.DateField(blank=True, null=True)),
('trial_end_date', models.DateField(blank=True, null=True)),
('subscription_start_date', models.DateField()),
('create_date', models.DateTimeField(auto_now_add=True)),
('update_date', models.DateTimeField(auto_now=True)),
('created_by', models.ForeignKey(blank=b'', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subscription_creator', to=settings.AUTH_USER_MODEL)),
('organization', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Organization')),
('user', models.ForeignKey(blank=b'', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subscription_user', to=settings.AUTH_USER_MODEL)),
],
),
]
17 changes: 17 additions & 0 deletions core/migrations/0010_remove_organization_stripe_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 2.2.28 on 2023-01-15 11:07

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('core', '0009_auto_20230115_1103'),
]

operations = [
migrations.RemoveField(
model_name='organization',
name='stripe_info',
),
]
40 changes: 40 additions & 0 deletions core/migrations/0011_auto_20230115_1552.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Generated by Django 2.2.28 on 2023-01-15 15:52

from django.conf import settings
import django.contrib.postgres.fields.jsonb
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('core', '0010_remove_organization_stripe_info'),
]

operations = [
migrations.RemoveField(
model_name='subscription',
name='card',
),
migrations.AddField(
model_name='subscription',
name='stripe_card_info',
field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, null=True),
),
migrations.AlterField(
model_name='subscription',
name='created_by',
field=models.ForeignKey(blank=b'', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_subscription', to=settings.AUTH_USER_MODEL),
),
migrations.AlterField(
model_name='subscription',
name='organization',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='organization_subscription', to='core.Organization'),
),
migrations.AlterField(
model_name='subscription',
name='user',
field=models.ForeignKey(blank=b'', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='user_subscription', to=settings.AUTH_USER_MODEL),
),
]
27 changes: 27 additions & 0 deletions core/migrations/0012_auto_20230118_0651.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# Generated by Django 2.2.28 on 2023-01-18 06:51

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('core', '0011_auto_20230115_1552'),
]

operations = [
migrations.RenameField(
model_name='subscription',
old_name='stripe_id',
new_name='customer_stripe_id',
),
migrations.RemoveField(
model_name='subscription',
name='stripe_card_info',
),
migrations.AddField(
model_name='subscription',
name='stripe_card_id',
field=models.CharField(blank=True, max_length=255, null=True),
),
]
23 changes: 23 additions & 0 deletions core/migrations/0013_auto_20230207_1403.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 2.2.28 on 2023-02-07 14:03

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('core', '0012_auto_20230118_0651'),
]

operations = [
migrations.AddField(
model_name='subscription',
name='subscription_end_date',
field=models.DateField(blank=True, null=True),
),
migrations.AlterField(
model_name='subscription',
name='subscription_start_date',
field=models.DateField(blank=True, null=True),
),
]
33 changes: 33 additions & 0 deletions core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from django.contrib.sites.models import Site
from django.db import models
from django.utils import timezone
from pyasn1.compat.octets import null

ROLE_ORGANIZATION_ADMIN = 'OrgAdmin'
ROLE_WORKFLOW_ADMIN = 'WorkflowAdmin'
Expand Down Expand Up @@ -275,3 +276,35 @@ class Partner(models.Model):
name = models.CharField(blank=True, null=True, max_length=255)
create_date = models.DateTimeField(null=True, blank=True)
edit_date = models.DateTimeField(null=True, blank=True)


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)
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)
trial_end_date = models.DateField(null=True, blank=True)
subscription_start_date = models.DateField(null=True, blank=True)
subscription_end_date = models.DateField(null=True, blank=True)
create_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now=True)
user = models.ForeignKey(
'core.CoreUser',
on_delete=models.SET_NULL,
blank=null,
null=True,
related_name='user_subscription'
)
created_by = models.ForeignKey(
'core.CoreUser',
on_delete=models.SET_NULL,
blank=null,
null=True,
related_name='created_subscription'
)
organization = models.ForeignKey(
'core.Organization',
on_delete=models.CASCADE,
related_name='organization_subscription'
)
81 changes: 72 additions & 9 deletions core/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from core.email_utils import send_email, send_email_body

from core.models import CoreUser, CoreGroup, EmailTemplate, LogicModule, Organization, PERMISSIONS_ORG_ADMIN, \
TEMPLATE_RESET_PASSWORD, PERMISSIONS_VIEW_ONLY, Partner
TEMPLATE_RESET_PASSWORD, PERMISSIONS_VIEW_ONLY, Partner, Subscription


class LogicModuleSerializer(serializers.ModelSerializer):
Expand Down Expand Up @@ -80,6 +80,7 @@ class CoreUserSerializer(serializers.ModelSerializer):
is_active = serializers.BooleanField(required=False)
core_groups = CoreGroupSerializer(read_only=True, many=True)
invitation_token = serializers.CharField(required=False)
subscriptions = serializers.SerializerMethodField()

def validate_invitation_token(self, value):
try:
Expand All @@ -95,12 +96,33 @@ def validate_invitation_token(self, value):

class Meta:
model = CoreUser
fields = ('id', 'core_user_uuid', 'first_name', 'last_name', 'email', 'username', 'is_active',
'title', 'contact_info', 'privacy_disclaimer_accepted', 'organization', 'core_groups',
'invitation_token', 'user_type', 'survey_status')
fields = (
'id',
'core_user_uuid',
'first_name',
'last_name',
'email',
'username',
'is_active',
'title',
'contact_info',
'privacy_disclaimer_accepted',
'organization',
'core_groups',
'invitation_token',
'user_type',
'survey_status',
'subscriptions'
)
read_only_fields = ('core_user_uuid', 'organization',)
depth = 1

def get_subscriptions(self, user):
return SubscriptionSerializer(
user.organization.organization_subscription.all(),
many=True
).data


class CoreUserWritableSerializer(CoreUserSerializer):
"""
Expand Down Expand Up @@ -327,11 +349,29 @@ def save(self):

class OrganizationSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(source='organization_uuid', read_only=True)
subscription = serializers.SerializerMethodField()

class Meta:
model = Organization
fields = '__all__'

def get_subscription(self, organization):
return SubscriptionSerializer(organization.organization_subscription.all()).data


class OrganizationNestedSerializer(serializers.ModelSerializer):
id = serializers.UUIDField(source='organization_uuid', read_only=True)
subscription = serializers.SerializerMethodField()

class Meta:
model = Organization
fields = '__all__'

def get_subscription(self, organization):
return SubscriptionSerializer(
organization.organization_subscription.all(),
many=True
).data

class AccessTokenSerializer(serializers.ModelSerializer):
user = CoreUserSerializer()
Expand Down Expand Up @@ -366,8 +406,10 @@ def create(self, validated_data):


class CoreUserUpdateOrganizationSerializer(serializers.ModelSerializer):
""" Let's user update his organization_name,and email from the one time pop-up screen.
Also this assigns permissions to users """
"""
Lets user update his organization_name,and email from the one time pop-up screen.
Also, this assigns permissions to users
"""

email = serializers.CharField(required=False)
organization_name = serializers.CharField(required=False)
Expand All @@ -376,9 +418,23 @@ class CoreUserUpdateOrganizationSerializer(serializers.ModelSerializer):

class Meta:
model = CoreUser
fields = ('id', 'core_user_uuid', 'first_name', 'last_name', 'email', 'username', 'is_active', 'title',
'contact_info', 'privacy_disclaimer_accepted', 'organization_name', 'organization', 'core_groups',
'user_type', 'survey_status')
fields = (
'id',
'core_user_uuid',
'first_name',
'last_name',
'email',
'username',
'is_active',
'title',
'contact_info',
'privacy_disclaimer_accepted',
'organization_name',
'organization',
'core_groups',
'user_type',
'survey_status'
)

def update(self, instance, validated_data):
organization_name = str(validated_data.pop('organization_name')).lower()
Expand Down Expand Up @@ -480,3 +536,10 @@ def validate(self, attrs):
raise serializers.ValidationError({'token': ['Invalid value']})

return attrs


class SubscriptionSerializer(serializers.ModelSerializer):
class Meta:
model = Subscription
fields = '__all__'

50 changes: 50 additions & 0 deletions core/tests/test_subscription_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from django.urls import reverse
from django.utils import timezone
from django.test import override_settings
from rest_framework import status
from rest_framework.test import (APIClient, APITestCase)

import factories


class SubscriptionTestCase(APITestCase):
def setUp(self) -> None:
self.client = APIClient()
self.user = factories.CoreUser(
first_name='John', last_name='doe', email="[email protected]"
)
self.subscription = factories.Subscription(
subscription_start_date=timezone.localdate(),
organization=self.user.organization
)

def test_list_subscriptions(self):
self.client.force_authenticate(self.user)
response = self.client.get(
reverse('subscription-list')
)

self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(len(response.data), 1)

# @override_settings(STRIPE_SECRET='sk_test_ddLjeqLRWcj8znVAhMaNPu7J00evbJrikA')
# def test_post_subscription(self):
# self.client.force_authenticate(self.user)
# payload = dict(
# product='pm_1MQveB2eZvKYlo2CNDz1tA9f',
# stripe_card_info='card_1MQtzn2eZvKYlo2C8conuf6j'
# )
#
# response = self.client.post(
# reverse('subscription-list'),
# payload,
# format='json'
# )
# self.assertEqual(response.status_code, (status.HTTP_201_CREATED or status.HTTP_400_BAD_REQUEST))
# self.assertEqual(response.data.get('product'), 'prod_LcvzgZTikSo1yd')

def test_get_stripe_products(self):
response = self.client.get(f'{reverse("subscription-list")}stripe_products/')

self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertGreater(len(response.data), 0)
Loading

0 comments on commit 3aee3ae

Please sign in to comment.