Skip to content

Instantly share code, notes, and snippets.

@okomarov
okomarov / __init__.py
Last active July 9, 2019 11:08
__init__ for multiple dash apps
def create_app():
server = Flask(__name__)
server.config.from_object(BaseConfig)
from app.dashapp1.layout import layout as layout1
from app.dashapp1.callbacks import register_callbacks as register_callbacks1
register_dashapp(server, 'Dashapp 1', 'dashboard', layout1, register_callbacks1)
from app.dashapp2.layout import layout as layout2
from app.dashapp2.callbacks import register_callbacks as register_callbacks2
@okomarov
okomarov / models.py
Last active November 13, 2019 12:30
Viral queue user model
class User(BaseModel, db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), unique=True, nullable=False)
email_confirmed = db.Column(db.Boolean, default=False)
email_confirmed_on = db.Column(db.DateTime(timezone=True))
waitlist = db.relationship('Waitlist', uselist=False, back_populates='user')
def __init__(self, email):
@okomarov
okomarov / models.py
Last active November 13, 2019 12:41
Viral queue waitlist and referrals
class Waitlist(BaseModel, db.Model):
__tablename__ = 'waitlist'
initial_score = 65231
decrease_per_referral = 10
uuid = db.Column(db.String(8), primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
user = db.relationship('User', back_populates='waitlist')
score = db.Column(db.Integer)
@okomarov
okomarov / logic.py
Last active November 15, 2019 15:27
Get waitlist position
def get_waitlist_position(uuid):
waitlist_user = get_waitlist_user(uuid)
score = waitlist_user.score
users_ahead = Waitlist.query.filter(Waitlist.score <= score).count()
return max(score, users_ahead)
@okomarov
okomarov / logic.py
Created November 10, 2019 10:33
viral queue verify email and refer logic
def verify_email(token):
payload = utils.decode_jwt_token(token)
user = get_user(payload['user_id'])
if user is None:
return
if not user.email_confirmed:
user.email_confirmed = True
now = datetime.now(timezone.utc)
user.email_confirmed_on = now
@okomarov
okomarov / models.py
Created November 10, 2019 10:46
viral queue referrals model
referrals = db.Table(
'referral',
db.Column('referring', db.String(8), db.ForeignKey('waitlist.uuid')),
db.Column('referred', db.String(8), db.ForeignKey('waitlist.uuid')),
db.PrimaryKeyConstraint('referring', 'referred', name='referrals_pk')
)
@okomarov
okomarov / utils.py
Created November 10, 2019 11:25
viral queue email normalization
def normalize_email(email):
'''
Reduces an email address to its canonical form:
- strips white space
- transforms to lowercase
- removes the +tag part in the name
- removes dots if a google domain
'''
email = email.strip().lower()
name, domain = email.rsplit('@', 1)
@okomarov
okomarov / forms.py
Last active November 10, 2019 12:15
viral queue email form
class EmailForm(FlaskForm):
email = EmailField('Email', validators=[DataRequired(), Email()])
submit = SubmitField('Get early access')
@okomarov
okomarov / index.html
Last active November 11, 2019 12:11
viral queue flask form in the waitlist
{% extends "base.html" %}
{% block content %}
<div class="container">
<div class="row justify-content-center pt-2">
{% if referring_uuid %}
<form action="{{ url_for('main.index') + '?user=' + referring_uuid }}" method="post" class="form-inline">
{% else %}
<form action="{{ url_for('main.index') }}" method="post" class="form-inline">
@okomarov
okomarov / index.html
Last active November 11, 2019 13:59
viral queue og tags
<head>
{% set title="Your page title goes here"%}
{% set description="Some description if you wish."%}
<!-- Social sharing tags -->
<meta property="og:title" content="{{ title }}">
<meta property="og:description" content="{{ description }}">
<meta property="og:image" content="{{ url_for('static', filename='img/social-sharing-thumbnail.png', _external=True) }}">
<meta property="og:url" content="{{ url_for('main.index', _external=True) }}">
<meta name="twitter:card" content="summary_large_image">