Add Referral model

This commit is contained in:
Son NK 2020-04-09 22:19:45 +02:00
parent a54ac0b3da
commit cdf23d04fc
2 changed files with 61 additions and 0 deletions

View File

@ -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"<Refused Email {self.id} {self.path} {self.delete_at}>"
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}"

View File

@ -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 ###