diff --git a/app/dashboard/templates/dashboard/referral.html b/app/dashboard/templates/dashboard/referral.html index 77b78f43..73eb0e5e 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,19 @@
+
+ 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. +
+ +
+
+ + + Delete +
+
+
{% 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):