From 3ce3a05c7b1ee793a0924632de260e5dc3b12e27 Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sat, 2 May 2020 18:08:05 +0200 Subject: [PATCH 1/4] Add referral name --- app/models.py | 5 ++++- server.py | 13 +++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) 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/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): From 16673567420fc0bbba8eb0a4cdb19ceea870388a Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sat, 2 May 2020 18:11:10 +0200 Subject: [PATCH 2/4] User can update/create referral name --- .../templates/dashboard/referral.html | 35 +++++++++++++---- app/dashboard/views/referral.py | 39 ++++++++++++------- 2 files changed, 54 insertions(+), 20 deletions(-) diff --git a/app/dashboard/templates/dashboard/referral.html b/app/dashboard/templates/dashboard/referral.html index 77b78f43..c30f8702 100644 --- a/app/dashboard/templates/dashboard/referral.html +++ b/app/dashboard/templates/dashboard/referral.html @@ -19,8 +19,23 @@ {% for referral in referrals %}
-
Referral Code: {{ referral.code }} -
+ +
+ + + + Name +
+
+ +
+
+ +
+
+
+ + {% if referral.nb_user() > 0 %}
@@ -33,8 +48,8 @@
Please use this referral link to invite your friends trying out SimpleLogin:
-
-
+
+
@@ -49,6 +64,11 @@
+
+ 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 +77,10 @@ {% endif %}
- + + +
- -
{% endblock %} \ No newline at end of file diff --git a/app/dashboard/views/referral.py b/app/dashboard/views/referral.py index f9aedfa0..05333bef 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,33 @@ 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) # Highlight a referral highlight_id = request.args.get("highlight_id") From eff0eb9e3203959af4841beb1247d1950b167a5c Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sat, 2 May 2020 18:14:09 +0200 Subject: [PATCH 3/4] can delete referral --- .../templates/dashboard/referral.html | 37 +++++++++++++++++++ app/dashboard/views/referral.py | 9 +++++ 2 files changed, 46 insertions(+) diff --git a/app/dashboard/templates/dashboard/referral.html b/app/dashboard/templates/dashboard/referral.html index c30f8702..73eb0e5e 100644 --- a/app/dashboard/templates/dashboard/referral.html +++ b/app/dashboard/templates/dashboard/referral.html @@ -69,6 +69,14 @@ Just append ?slref={{ referral.code }} to any link on SimpleLogin website.
+
+
+ + + Delete +
+
+
{% endfor %} @@ -83,4 +91,33 @@ +{% 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 05333bef..29f37c32 100644 --- a/app/dashboard/views/referral.py +++ b/app/dashboard/views/referral.py @@ -39,6 +39,15 @@ def referral_route(): 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") From 249eab31e70ada1def281f5d082ac0628b6bc63c Mon Sep 17 00:00:00 2001 From: Son NK <> Date: Sat, 2 May 2020 18:14:17 +0200 Subject: [PATCH 4/4] sql migration --- .../versions/2020_050218_f939d67374e4_.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 migrations/versions/2020_050218_f939d67374e4_.py 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 ###