Begin implementing Drilldown plan

This commit is contained in:
Mark Veidemanis 2022-07-21 13:45:57 +01:00
parent 85998bbc38
commit 4bd2bb2f1a
Signed by: m
GPG Key ID: 5ACFCEED46C0904F
7 changed files with 78 additions and 146 deletions

View File

@ -16,7 +16,7 @@ Including another URLconf
from django.contrib import admin from django.contrib import admin
from django.urls import include, path from django.urls import include, path
from core.views import Home, Profile, Signup from core.views import Drilldown, Home, Profile, Signup
urlpatterns = [ urlpatterns = [
path("", Home.as_view(), name="home"), path("", Home.as_view(), name="home"),
@ -24,4 +24,5 @@ urlpatterns = [
path("admin/", admin.site.urls), path("admin/", admin.site.urls),
path("accounts/", include("django.contrib.auth.urls")), path("accounts/", include("django.contrib.auth.urls")),
path("accounts/signup/", Signup.as_view(), name="signup"), path("accounts/signup/", Signup.as_view(), name="signup"),
path("ui/drilldown/", Drilldown.as_view(), name="drilldown"),
] ]

View File

@ -2,7 +2,7 @@ from django.contrib import admin
from django.contrib.auth.admin import UserAdmin from django.contrib.auth.admin import UserAdmin
from .forms import CustomUserCreationForm from .forms import CustomUserCreationForm
from .models import Product, User from .models import Plan, User
# Register your models here. # Register your models here.
@ -36,4 +36,4 @@ class CustomUserAdmin(UserAdmin):
admin.site.register(User, CustomUserAdmin) admin.site.register(User, CustomUserAdmin)
admin.site.register(Product) admin.site.register(Plan)

View File

@ -1,4 +1,4 @@
# Generated by Django 4.0.6 on 2022-07-05 12:45 # Generated by Django 4.0.6 on 2022-07-05 15:55
import django.contrib.auth.models import django.contrib.auth.models
import django.contrib.auth.validators import django.contrib.auth.validators
@ -11,147 +11,51 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
("auth", "0012_alter_user_first_name_max_length"), ('auth', '0012_alter_user_first_name_max_length'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name="Product", name='Plan',
fields=[ fields=[
( ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
"id", ('name', models.CharField(max_length=255, unique=True)),
models.BigAutoField( ('description', models.CharField(blank=True, max_length=1024, null=True)),
auto_created=True, ('cost', models.IntegerField()),
primary_key=True, ('product_id', models.UUIDField(blank=True, null=True)),
serialize=False, ('image', models.CharField(blank=True, max_length=1024, null=True)),
verbose_name="ID",
),
),
("name", models.CharField(max_length=255)),
("description", models.CharField(max_length=1024, null=True)),
("cost", models.IntegerField()),
("product_id", models.UUIDField(null=True)),
("image", models.CharField(max_length=1024, null=True)),
], ],
), ),
migrations.CreateModel( migrations.CreateModel(
name="User", name='User',
fields=[ fields=[
( ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
"id", ('password', models.CharField(max_length=128, verbose_name='password')),
models.BigAutoField( ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
auto_created=True, ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
primary_key=True, ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
serialize=False, ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
verbose_name="ID", ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
), ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
), ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
("password", models.CharField(max_length=128, verbose_name="password")), ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
( ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
"last_login", ('stripe_id', models.CharField(blank=True, max_length=255, null=True)),
models.DateTimeField( ('subscription_id', models.CharField(blank=True, max_length=255, null=True)),
blank=True, null=True, verbose_name="last login" ('subscription_active', models.BooleanField(blank=True, null=True)),
), ('last_payment', models.DateTimeField(blank=True, null=True)),
), ('paid', models.BooleanField(blank=True, null=True)),
( ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
"is_superuser", ('plans', models.ManyToManyField(blank=True, to='core.plan')),
models.BooleanField( ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
default=False,
help_text="Designates that this user has all permissions without explicitly assigning them.",
verbose_name="superuser status",
),
),
(
"username",
models.CharField(
error_messages={
"unique": "A user with that username already exists."
},
help_text="Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.",
max_length=150,
unique=True,
validators=[
django.contrib.auth.validators.UnicodeUsernameValidator()
],
verbose_name="username",
),
),
(
"first_name",
models.CharField(
blank=True, max_length=150, verbose_name="first name"
),
),
(
"last_name",
models.CharField(
blank=True, max_length=150, verbose_name="last name"
),
),
(
"email",
models.EmailField(
blank=True, max_length=254, verbose_name="email address"
),
),
(
"is_staff",
models.BooleanField(
default=False,
help_text="Designates whether the user can log into this admin site.",
verbose_name="staff status",
),
),
(
"is_active",
models.BooleanField(
default=True,
help_text="Designates whether this user should be treated as active. Unselect this instead of deleting accounts.",
verbose_name="active",
),
),
(
"date_joined",
models.DateTimeField(
default=django.utils.timezone.now, verbose_name="date joined"
),
),
("stripe_id", models.CharField(max_length=255, null=True)),
("subscription_id", models.CharField(max_length=255, null=True)),
("subscription_active", models.BooleanField(null=True)),
("last_payment", models.DateTimeField(null=True)),
("paid", models.BooleanField(null=True)),
(
"groups",
models.ManyToManyField(
blank=True,
help_text="The groups this user belongs to. A user will get all permissions granted to each of their groups.",
related_name="user_set",
related_query_name="user",
to="auth.group",
verbose_name="groups",
),
),
("plans", models.ManyToManyField(to="core.product")),
(
"user_permissions",
models.ManyToManyField(
blank=True,
help_text="Specific permissions for this user.",
related_name="user_set",
related_query_name="user",
to="auth.permission",
verbose_name="user permissions",
),
),
], ],
options={ options={
"verbose_name": "user", 'verbose_name': 'user',
"verbose_name_plural": "users", 'verbose_name_plural': 'users',
"abstract": False, 'abstract': False,
}, },
managers=[ managers=[
("objects", django.contrib.auth.models.UserManager()), ('objects', django.contrib.auth.models.UserManager()),
], ],
), ),
] ]

View File

@ -4,12 +4,12 @@ from django.db import models
# Create your models here. # Create your models here.
class Product(models.Model): class Plan(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255, unique=True)
description = models.CharField(max_length=1024) description = models.CharField(max_length=1024, null=True, blank=True)
cost = models.IntegerField() cost = models.IntegerField()
product_id = models.UUIDField(blank=True) product_id = models.UUIDField(null=True, blank=True)
image = models.CharField(max_length=1024, blank=True) image = models.CharField(max_length=1024, null=True, blank=True)
def __str__(self): def __str__(self):
return f"{self.name}{self.cost})" return f"{self.name}{self.cost})"
@ -17,12 +17,12 @@ class Product(models.Model):
class User(AbstractUser): class User(AbstractUser):
# Stripe customer ID # Stripe customer ID
stripe_id = models.CharField(max_length=255, blank=True) stripe_id = models.CharField(max_length=255, null=True, blank=True)
subscription_id = models.CharField(max_length=255, blank=True) subscription_id = models.CharField(max_length=255, null=True, blank=True)
subscription_active = models.BooleanField(blank=True) subscription_active = models.BooleanField(null=True, blank=True)
last_payment = models.DateTimeField(blank=True) last_payment = models.DateTimeField(null=True, blank=True)
paid = models.BooleanField(blank=True) paid = models.BooleanField(null=True, blank=True)
plans = models.ManyToManyField(Product, blank=True) plans = models.ManyToManyField(Plan, blank=True)
def has_plan(self, plan): def has_plan(self, plan):
plan_list = [plan.name for plan in self.plans.all()] plan_list = [plan.name for plan in self.plans.all()]

View File

@ -4,9 +4,9 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">s
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pathogen - Login</title> <title>Pathogen - {{ request.path_info }}</title>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css"> <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<link rel="stylesheet" href="{% static 'style.css' %}" /> <link rel="stylesheet" href="{% static 'style.css' %}" />
<script src="https://js.stripe.com/v3/"></script> <script src="https://js.stripe.com/v3/"></script>

View File

@ -0,0 +1,18 @@
{% extends "base.html" %}
{% block content %}
<h1 class="title">
Access denied
</h1>
<h2 class="subtitle">
Sorry, you do not have the necessary permissions to view this page.
</h2>
<div class="col">
{% if user.subscription_active %}
{% include 'checkout.html' %}
{% else %}
<h2> Please setup a payment mandate in the profile page to view products </h2>
{% endif %}
</div>
{% endblock %}

View File

@ -9,7 +9,16 @@ from core.forms import NewUserForm
# Create your views here # Create your views here
class Home(LoginRequiredMixin, View): class Drilldown(LoginRequiredMixin, View):
template_name = "ui/drilldown.html"
def get(self, request, *args, **kwargs):
if not request.user.has_plan("drilldown"):
return render(request, "denied.html")
return render(request, self.template_name)
class Home(View):
template_name = "index.html" template_name = "index.html"
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):