@@ -33,8 +48,8 @@
Please use this referral link to invite your friends trying out SimpleLogin:
-
-
+
+ You can also use the referral code {{ referral.code }} when sharing any link on SimpleLogin.
+ Just append ?slref={{ referral.code }} to any link on SimpleLogin website.
+
+
+
+
+
+
{% endfor %}
@@ -57,9 +85,39 @@
{% endif %}
-
-
+{% endblock %}
+
+{% block script %}
+
{% endblock %}
\ No newline at end of file
diff --git a/app/dashboard/views/referral.py b/app/dashboard/views/referral.py
index f9aedfa0..29f37c32 100644
--- a/app/dashboard/views/referral.py
+++ b/app/dashboard/views/referral.py
@@ -4,7 +4,7 @@ from flask_login import login_required, current_user
from app.dashboard.base import dashboard_bp
from app.extensions import db
from app.log import LOG
-from app.models import Referral
+from app.models import Referral, User
from app.utils import random_string
@@ -12,20 +12,42 @@ from app.utils import random_string
@login_required
def referral_route():
if request.method == "POST":
- # Generate a new unique ref code
- code = random_string(15)
- for _ in range(100):
- if not Referral.get_by(code=code):
- # found
- break
-
- LOG.warning("Referral Code %s already used", code)
+ if request.form.get("form-name") == "create":
+ # Generate a new unique ref code
code = random_string(15)
+ for _ in range(100):
+ if not Referral.get_by(code=code):
+ # found
+ break
- referral = Referral.create(user_id=current_user.id, code=code)
- db.session.commit()
- flash("A new referral code has been created", "success")
- return redirect(url_for("dashboard.referral_route", highlight_id=referral.id))
+ LOG.warning("Referral Code %s already used", code)
+ code = random_string(15)
+
+ name = request.form.get("name")
+ referral = Referral.create(user_id=current_user.id, code=code, name=name)
+ db.session.commit()
+ flash("A new referral code has been created", "success")
+ return redirect(
+ url_for("dashboard.referral_route", highlight_id=referral.id)
+ )
+ elif request.form.get("form-name") == "update":
+ referral_id = request.form.get("referral-id")
+ referral = Referral.get(referral_id)
+ if referral and referral.user_id == current_user.id:
+ referral.name = request.form.get("name")
+ db.session.commit()
+ flash("Referral name updated", "success")
+ return redirect(
+ url_for("dashboard.referral_route", highlight_id=referral.id)
+ )
+ elif request.form.get("form-name") == "delete":
+ referral_id = request.form.get("referral-id")
+ referral = Referral.get(referral_id)
+ if referral and referral.user_id == current_user.id:
+ Referral.delete(referral.id)
+ db.session.commit()
+ flash("Referral deleted", "success")
+ return redirect(url_for("dashboard.referral_route"))
# Highlight a referral
highlight_id = request.args.get("highlight_id")
diff --git a/app/models.py b/app/models.py
index 2cedaf81..0f68b97e 100644
--- a/app/models.py
+++ b/app/models.py
@@ -158,7 +158,9 @@ 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_id = db.Column(
+ db.ForeignKey("referral.id", ondelete="SET NULL"), nullable=True, default=None
+ )
referral = db.relationship("Referral", foreign_keys=[referral_id])
@@ -1153,6 +1155,7 @@ class Referral(db.Model, ModelMixin):
"""Referral code so user can invite others"""
user_id = db.Column(db.ForeignKey(User.id, ondelete="cascade"), nullable=False)
+ name = db.Column(db.String(512), nullable=True, default=None)
code = db.Column(db.String(128), unique=True, nullable=False)
diff --git a/migrations/versions/2020_050218_f939d67374e4_.py b/migrations/versions/2020_050218_f939d67374e4_.py
new file mode 100644
index 00000000..d91b5880
--- /dev/null
+++ b/migrations/versions/2020_050218_f939d67374e4_.py
@@ -0,0 +1,33 @@
+"""empty message
+
+Revision ID: f939d67374e4
+Revises: b4146f7d5277
+Create Date: 2020-05-02 18:07:42.275092
+
+"""
+import sqlalchemy_utils
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'f939d67374e4'
+down_revision = 'b4146f7d5277'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.add_column('referral', sa.Column('name', sa.String(length=512), nullable=True))
+ op.drop_constraint('users_referral_id_fkey', 'users', type_='foreignkey')
+ op.create_foreign_key(None, 'users', 'referral', ['referral_id'], ['id'], ondelete='SET NULL')
+ # ### end Alembic commands ###
+
+
+def downgrade():
+ # ### commands auto generated by Alembic - please adjust! ###
+ op.drop_constraint(None, 'users', type_='foreignkey')
+ op.create_foreign_key('users_referral_id_fkey', 'users', 'referral', ['referral_id'], ['id'])
+ op.drop_column('referral', 'name')
+ # ### end Alembic commands ###
diff --git a/server.py b/server.py
index 99ae24ba..3f1ad13f 100644
--- a/server.py
+++ b/server.py
@@ -51,6 +51,7 @@ from app.models import (
DeletedAlias,
Contact,
EmailLog,
+ Referral,
)
from app.monitor.base import monitor_bp
from app.oauth.base import oauth_bp
@@ -216,6 +217,18 @@ def fake_data():
DeletedAlias.create(user_id=user.id, email="d2@ab.cd")
db.session.commit()
+ referral = Referral.create(user_id=user.id, code="REFCODE", name="First referral")
+ db.session.commit()
+
+ User.create(
+ email="winston@continental.com",
+ name="Winston",
+ password="password",
+ activated=True,
+ referral_id=referral.id,
+ )
+ db.session.commit()
+
@login_manager.user_loader
def load_user(user_id):