Skip to content

Commit

Permalink
feat: new invites via code (#1279)
Browse files Browse the repository at this point in the history
* feat: new invites via code

* fix: lower emails
  • Loading branch information
vas3k authored Dec 27, 2024
1 parent 108a56b commit cedfdc0
Show file tree
Hide file tree
Showing 31 changed files with 499 additions and 147 deletions.
1 change: 1 addition & 0 deletions club/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
"tags.apps.TagsConfig",
"rooms.apps.RoomsConfig",
"misc.apps.MiscConfig",
"invites.apps.InvitesConfig",
"simple_history",
"django_q",
"webpack_loader",
Expand Down
5 changes: 5 additions & 0 deletions club/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
from comments.views import create_comment, edit_comment, delete_comment, show_comment, upvote_comment, \
retract_comment_vote, pin_comment, delete_comment_thread
from common.feature_flags import feature_switch
from invites.views import show_invite, list_invites, activate_invite
from landing.views import landing, docs, godmode_network_settings, godmode_digest_settings, godmode_settings, \
godmode_invite
from misc.fun import badge_generator, mass_note
Expand Down Expand Up @@ -166,6 +167,10 @@
path("label/<slug:label_code>/", feed, name="feed_label"),
path("label/<slug:label_code>/<slug:ordering>/", feed, name="feed_label_ordering"),

path("invites/", list_invites, name="invites"),
path("invites/<slug:invite_code>/", show_invite, name="show_invite"),
path("invites/<slug:invite_code>/activate/", activate_invite, name="activate_invite"),

path("comment/<uuid:comment_id>/upvote/", upvote_comment, name="upvote_comment"),
path("comment/<uuid:comment_id>/retract_vote/", retract_comment_vote, name="retract_comment_vote"),
path("comment/<uuid:comment_id>/edit/", edit_comment, name="edit_comment"),
Expand Down
7 changes: 3 additions & 4 deletions frontend/html/docs/blocked_dolor.html
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,12 @@ <h2>🦄 Если у вас уже есть аккаунт</h2>
<h2>🤝 Если у вас есть друг в Клубе</h2>

<p>
Попросите его продлить вам аккаунт.
Это можно сделать через ту же самую форму инвайта, которая используется для приглашения новых людей в Клуб.
Только он должен точно указать почту, на которую зареган ваш аккаунт (иначе заведётся второй).
Пусть он воспользуется нашей формой для инвайто, через которую любой активный член Клуба может купить инвайт-код и прислать его вам.
С этим кодом можно зарегистрировать новый аккаунт или продлить существующий.
</p>

<p>
Форма инвайта: <a href="https://vas3k.club/user/me/edit/monies/#invite">vas3k.club/user/me/edit/monies/#invite</a>
Форма инвайта: <a href="https://vas3k.club/invites/">vas3k.club/invites/</a>
</p>

<h2>🌎 Или у вас есть друг с иностранной картой</h2>
Expand Down
18 changes: 6 additions & 12 deletions frontend/html/emails/invite_confirm.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,34 +25,28 @@
{% endblock %}

{% block title %}
👍 Вы оплатили другу аккаунт в Клубе
🎁 Вы купили инвайт
{% endblock %}

{% block body %}
<p>
Офигенно!
Теперь можно подарить его другу.
</p>

<p>
На таких людях как вы держится этот мир!
Используйте вот эту ссылку: <strong><a href="{{ settings.APP_HOST }}{% url "show_invite" invite.code %}">{{ settings.APP_HOST }}{% url "show_invite" invite.code %}</a></strong>
</p>

<p>
Если ваш друг еще не в Клубе, сейчас ему на <strong>{{ to_user.email }}</strong> упадёт письмо с пояснениями как завести аккаунт и заполнить профиль.
Если ваш друг еще не в Клубе, он сразу сможет по ней зарегистрироваться, минуя оплату. Однако, ему всё так же придётся написать интро и пройти модерацию.
</p>

<p>
На всякий случай поделитесь с другом лайфхаками написания лучшего в мире интро.
Этот шаг всё еще обязателен и не все его так легко проходят, как кажется :)
Инвайт ссылку можно подарить и тому, кто уже есть в Клубе. В этом случае купленные дни добавятся ему на аккаунт.
</p>

<p>
Если ваш друг почему-то не получил наше письмо, скажите ему пусть просто входит в Клуб по имейлу <strong>{{ to_user.email }}</strong>.
</p>

<p>
Кстати, ваш инвайт-платёж одноразовый (то есть не подписка) и чек за транзакцию упадёт на почту именно вам.
Через год другу самому придётся продлить себе аккаунт, если ему у нас понравится.
Инвайт истекает через год. Если за это время его не использовать — код протухнет :(
</p>

<br><br><br>
Expand Down
2 changes: 1 addition & 1 deletion frontend/html/emails/registration.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
{% endblock %}

{% block title %}
Ваше приглашение 🪪
Ваша Клубная Карта 🪪
{% endblock %}

{% block body %}
Expand Down
55 changes: 55 additions & 0 deletions frontend/html/invites/edit.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
{% extends "layout.html" %}

{% block title %}
Инвайт {{ invite.code }} — {{ block.super }}
{% endblock %}

{% block content %}
<div class="content user-edit">
<div class="block">
<div class="block-header">💌<br>Инвайт {{ invite.code }}</div>

<div class="block-description block-description-center">
<p>
{% include "invites/widgets/status_badge.html" %}
</p>

{% if invite.is_used %}
<p>
Пользователь «{{ invite.invited_user.full_name }}» зарегистрировался или продлил свой аккаунт по этому инвайту {{ invite.used_at | date:"j E Y" }} 👇
</p>

{% if invite.invited_user %}
{% include "users/widgets/card.html" with user=invite.invited_user %}
{% endif %}
{% elif invite.is_expired %}
<p>
К сожалению, этот инвайт истёк и никто по нему никто так и не зарегистрировался. Больше его использовать не получится.
</p>
{% else %}
<p>
Создан <strong>{{ invite.created_at | date:"j E Y" }}</strong>
</p>

<p>
Нужно активировать до <strong>{{ invite.expires_at | date:"j E Y" }}</strong>
</p>

<br>

<p>
Секретная ссылка, чтобы подарить её другу 👇
</p>

<p>
<input type="text" value="{{ settings.APP_HOST }}{% url "show_invite" invite.code %}" style="font-size: 140%; width: 100%;" readonly>
</p>

<p>
По ней можно зарегистрироваться в Клубе, либо продлить уже существующий аккаунт.
</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}
50 changes: 50 additions & 0 deletions frontend/html/invites/list_invites.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{% extends "layout.html" %}
{% load static %}
{% load text_filters %}

{% block title %}
Инвайты в Клуб — {{ block.super }}
{% endblock %}

{% block content %}
<div class="content user-edit">
<div class="form-title">💌<br>Инвайты</div>

<div class="block-description block-description-center">
<p>
Здесь можно купить инвайт-код и подарить его своему другу, чтобы он смог зарегистрироваться в Клубе или продлил имеющийся аккаунт.
</p>

<br>

<form action="{% url "pay" %}" method="get">
{% csrf_token %}
<input type="hidden" name="product_code" value="club1_invite">
<input type="hidden" name="is_invite" value="true">
<button type="submit" class="button">🎁 Купить инвайт-код</button>
</form>

<div class="invites-list">
{% for invite in invites %}
<a href="{% url "show_invite" invite.code %}" class="block invites-list-item zoom-on-hover">
<strong>
Инвайт {{ invite.code|slice:":3" }}...{{ invite.code|slice:"-3:" }}
</strong>
<span>
{% include "invites/widgets/status_badge.html" %}
</span>
<span>
{% if invite.used_at %}
➡️ {{ invite.invited_user.full_name }}
{% elif invite.is_expired %}
истек {{ invite.expires_at | date:"j E Y" }}
{% else %}
истекает {{ invite.expires_at | date:"j E Y" }}
{% endif %}
</span>
</a>
{% endfor %}
</div>
</div>
</div>
{% endblock %}
51 changes: 51 additions & 0 deletions frontend/html/invites/show.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{% extends "layout.html" %}

{% block content %}
<div class="content user-edit">
<div class="form-title">🎁<br>Вам подарили 1 год в Клубе</div>

<div class="block">
<div class="block-description block-description-center">
<p>
Ого! Пользователь <strong>{{ invite.user.full_name }}</strong> подарил вам 1 год в Вастрик Клубе. Должно быть, вы это заслужили! 🥳
</p>

{% if request.me %}
<p>Нажмите на кнопку ниже, чтобы мы начислили его на ваш аккаунт 👇</p>

{% include "users/widgets/card.html" with user=request.me %}

<br><br>

<form action="{% url "activate_invite" invite.code %}" method="post">
{% csrf_token %}
<input type="hidden" name="email" value="{{ request.me.email }}">
<div class="form-row">
<button type="submit" class="button">🔥 Активировать инвайт</button>
</div>
</form>
{% else %}
<p>
Введите адрес своей электронной почты, чтобы мы накинули на него подарочных дней. Если у вас уже есть аккаунт в Клубе — укажите email, который к нему привязан, либо сначала <a href="{% url "login" %}"><strong>войдите</strong></a>.
</p>

<div class="block-description block-description-center">
<form action="{% url "activate_invite" invite.code %}" method="post">
{% csrf_token %}

<div class="form-row">
<label for="invited-email" class="form-label"><strong>Ваша почта 👇</strong></label>
<input type="email" name="email" id="invited-email" placeholder="[email protected]" {% if request.me %}value="{{ request.me.email }}"{% endif %} required>
</div>

<div class="form-row">
<button type="submit" class="button">🔥 Активировать инвайт</button>
</div>
</form>
</div>
{% endif %}
</div>

</div>
</div>
{% endblock %}
7 changes: 7 additions & 0 deletions frontend/html/invites/widgets/status_badge.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{% if invite.is_used %}
<span class="badge-invite badge-invite-used">☑️ Использован</span>
{% elif invite.is_expired %}
<span class="badge-invite badge-invite-expired">🕓 Истёк</span>
{% else %}
<span class="badge-invite badge-invite-new">🎁 Активен</span>
{% endif %}
12 changes: 4 additions & 8 deletions frontend/html/payments/messages/done.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,18 @@ <h2>Успех 🤘</h2>

{% if "invite" in payment.product_code %}
<p>
{% if payment.data.is_created %}
Вы успешно пригласили друга <strong>{{ payment.invited_user_email }}</strong>
{% else %}
Вы успешно продлили аккаунт другу <strong>{{ payment.invited_user_email }}</strong>
{% endif %}
Вы успешно купили инвайт.
</p>

<p>
Сейчас ему и вам упадут на почту все нужные подтверждения и инструкции что делать дальше.
Можете написать ему сами и порадовать от себя.
Отныне он сохранен в списке инвайтов в настройках профиля.
Можно пойти туда, взять код и поделиться им с другом! 👇
</p>

<br>

<p>
<a href="{% url "profile" payment.user.slug %}" class="button">Вернуться в свой профиль</a>
<a href="{% url "invites" %}" class="button">Мои инвайты</a>
</p>

{% elif payment.user.is_member %}
Expand Down
6 changes: 1 addition & 5 deletions frontend/html/payments/pay.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@
<div class="pay-title">
Платим 💰<br>
<small>
{% if payment.invited_user_email %}
за друга: <strong>{{ payment.invited_user_email }}</strong>
{% else %}
за аккаунт: <strong>{{ user.email }}</strong>
{% endif %}
ваш аккаунт: <strong>{{ user.email }}</strong>
</small>
</div>

Expand Down
11 changes: 0 additions & 11 deletions frontend/html/users/edit/auth.html

This file was deleted.

7 changes: 6 additions & 1 deletion frontend/html/users/edit/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,19 @@
<span class="dashboard-item-title">Уведомления</span>
</a>

<a href="{% url "invites" %}" class="dashboard-item">
<span class="dashboard-item-icon">🎁</span>
<span class="dashboard-item-title">Инвайты</span>
</a>

<a href="{% url "edit_data" user.slug %}" class="dashboard-item">
<span class="dashboard-item-icon">💾</span>
<span class="dashboard-item-title">Мои данные</span>
</a>

<a href="{% url "apps" %}" class="dashboard-item">
<span class="dashboard-item-icon">🤖</span>
<span class="dashboard-item-title">API</span>
<span class="dashboard-item-title">API и приложения</span>
</a>

<a href="{% url "edit_account" user.slug %}" class="dashboard-item">
Expand Down
26 changes: 1 addition & 25 deletions frontend/html/users/edit/payments.html
Original file line number Diff line number Diff line change
Expand Up @@ -116,31 +116,7 @@
<div class="block-header">💌<br>Пригласить друга</div>

<div class="block-description block-description-center">
У вас есть хороший знакомый, который тоже хочет в Клуб, но не может заплатить долор?
</div>

<div class="block-description block-description-center">
Здесь вы можете ввести почту любого человека и подарить ему аккаунт на год!
Не забудьте предупредить друга, что собираетесь выслать ему инвайт, ведь интро ему всё равно придётся написать самостоятельно.
</div>

<div class="block invite-friend">
<form action="{% url "pay" %}" method="get">
{% csrf_token %}
<input type="hidden" name="product_code" value="club1_invite">
<input type="hidden" name="is_invite" value="true">

<label>
<strong>Адрес почты</strong>
<input type="email" name="email" placeholder="[email protected]" required>
</label>

<button type="submit" class="button">Позвать в Клуб</button>
</form>
</div>

<div class="block-description block-description-center">
💡 <strong>Лайфхак:</strong> указав здесь почту существующего члена Клуба, вы продлите ему аккаунт. Только спросите его точный адрес.
<a href="{% url "invites" %}" class="button">🎁 Инвайты переехали сюда</a>
</div>
</div>
{% endblock %}
Loading

0 comments on commit cedfdc0

Please sign in to comment.