From cdf23d04fcecc59929c4653e1c6485d59f1bc889 Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Thu, 9 Apr 2020 22:19:45 +0200 Subject: [PATCH] Add Referral model --- app/models.py | 19 +++++++++ .../versions/2020_040922_ea30c0b5b2e3_.py | 42 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 migrations/versions/2020_040922_ea30c0b5b2e3_.py diff --git a/app/models.py b/app/models.py index 1506c296..589e0232 100644 --- a/app/models.py +++ b/app/models.py @@ -20,6 +20,7 @@ from app.config import ( JOB_ONBOARDING_2, JOB_ONBOARDING_3, JOB_ONBOARDING_4, + LANDING_PAGE_URL, ) from app.extensions import db from app.log import LOG @@ -155,6 +156,10 @@ class User(db.Model, ModelMixin, UserMixin): db.Boolean, default=True, nullable=False, server_default="1" ) + referral_id = db.Column(db.ForeignKey("referral.id"), nullable=True, default=None) + + referral = db.relationship("Referral", foreign_keys=[referral_id]) + @classmethod def create(cls, email, name, password=None, **kwargs): user: User = super(User, cls).create(email=email, name=name, **kwargs) @@ -1087,3 +1092,17 @@ class RefusedEmail(db.Model, ModelMixin): def __repr__(self): return f"" + + +class Referral(db.Model, ModelMixin): + """Referral code so user can invite others""" + + user_id = db.Column(db.ForeignKey(User.id, ondelete="cascade"), nullable=False) + + code = db.Column(db.String(128), unique=True, nullable=False) + + def nb_user(self): + return User.filter_by(referral_id=self.id, activated=True).count() + + def link(self): + return f"{LANDING_PAGE_URL}?slref={self.code}" diff --git a/migrations/versions/2020_040922_ea30c0b5b2e3_.py b/migrations/versions/2020_040922_ea30c0b5b2e3_.py new file mode 100644 index 00000000..32dca88a --- /dev/null +++ b/migrations/versions/2020_040922_ea30c0b5b2e3_.py @@ -0,0 +1,42 @@ +"""empty message + +Revision ID: ea30c0b5b2e3 +Revises: 497cfd2a02e2 +Create Date: 2020-04-09 22:16:58.923473 + +""" +import sqlalchemy_utils +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = 'ea30c0b5b2e3' +down_revision = '497cfd2a02e2' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table('referral', + sa.Column('id', sa.Integer(), autoincrement=True, nullable=False), + sa.Column('created_at', sqlalchemy_utils.types.arrow.ArrowType(), nullable=False), + sa.Column('updated_at', sqlalchemy_utils.types.arrow.ArrowType(), nullable=True), + sa.Column('user_id', sa.Integer(), nullable=False), + sa.Column('code', sa.String(length=128), nullable=False), + sa.ForeignKeyConstraint(['user_id'], ['users.id'], ondelete='cascade'), + sa.PrimaryKeyConstraint('id'), + sa.UniqueConstraint('code') + ) + op.add_column('users', sa.Column('referral_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'users', 'referral', ['referral_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'users', type_='foreignkey') + op.drop_column('users', 'referral_id') + op.drop_table('referral') + # ### end Alembic commands ###