Browse Source

Move the invite codes below the 'generate' button and sort them by newest.

Update the response of the invite generation endpoint to return the
full list of invite codes. This guarantees consistency and makes it
simpler to reason about the Intercooler replacement logic.
merge-requests/11/head
Shane Moore 7 years ago
parent
commit
dfa0f01d95
  1. 33
      tildes/tildes/templates/intercooler/invite_code.jinja2
  2. 40
      tildes/tildes/templates/invite.jinja2
  3. 14
      tildes/tildes/views/api/web/user.py
  4. 3
      tildes/tildes/views/user.py

33
tildes/tildes/templates/intercooler/invite_code.jinja2

@ -1,12 +1,21 @@
<input class="form-input input-lg input-invite-code" type="text" value="{{ code }}" readonly data-js-autoselect-input>
{% if num_remaining > 0 %}
<button
class="btn btn-primary"
data-ic-get-from="{{ request.route_url(
'ic_user_invite_code',
username=request.user.username,
) }}"
data-ic-replace-target="true"
>Generate new code ({{ num_remaining }} left)</button>
{% endif %}
<div id="codes">
{% if num_remaining > 0 %}
<button
class="btn btn-primary"
data-ic-get-from="{{ request.route_url(
'ic_user_invite_code',
username=request.user.username,
) }}"
data-ic-replace-target="true"
data-ic-target="#codes"
>Generate new code ({{ num_remaining }} left)</button>
{% else %}
<p>You don't currently have any invite codes available.</p>
{% endif %}
{% if codes %}
<p>You have the following invite codes active that have not been used yet:</p>
{% for code in codes %}
<input class="form-input input-lg input-invite-code" type="text" value="{{ code }}" readonly data-js-autoselect-input>
{% endfor %}
{% endif %}
</div>

40
tildes/tildes/templates/invite.jinja2

@ -17,23 +17,25 @@
<div class="divider"></div>
{% if codes %}
<p>You have the following invite codes active that have not been used yet:</p>
{% for code in codes %}
<input class="form-input input-lg input-invite-code" type="text" value="{{ code }}" readonly data-js-autoselect-input>
{% endfor %}
{% endif %}
{% if request.user.invite_codes_remaining > 0 %}
<button
class="btn btn-primary"
data-ic-get-from="{{ request.route_url(
'ic_user_invite_code',
username=request.user.username,
) }}"
data-ic-replace-target="true"
>Generate new code ({{ request.user.invite_codes_remaining }} left)</button>
{% else %}
<p>You don't currently have any invite codes available.</p>
{% endif %}
<div id="codes">
{% if request.user.invite_codes_remaining > 0 %}
<button
class="btn btn-primary"
data-ic-get-from="{{ request.route_url(
'ic_user_invite_code',
username=request.user.username,
) }}"
data-ic-replace-target="true"
data-ic-target="#codes"
>Generate new code ({{ request.user.invite_codes_remaining }} left)</button>
{% else %}
<p>You don't currently have any invite codes available.</p>
{% endif %}
{% if codes %}
<p>You have the following invite codes active that have not been used yet:</p>
{% for code in codes %}
<input class="form-input input-lg input-invite-code" type="text" value="{{ code }}" readonly data-js-autoselect-input>
{% endfor %}
{% endif %}
</div>
{% endblock %}

14
tildes/tildes/views/api/web/user.py

@ -171,13 +171,25 @@ def get_invite_code(request: Request) -> dict:
except IntegrityError:
savepoint.rollback()
codes = (
request.query(UserInviteCode)
.filter(
UserInviteCode.user_id == request.user.user_id,
UserInviteCode.invitee_id == None, # noqa
)
.order_by(
UserInviteCode.created_time.desc()
)
.all()
)
# doing an atomic decrement on request.user.invite_codes_remaining is going
# to make it unusable as an integer in the template, so store the expected
# value after the decrement first, to be able to use that instead
num_remaining = request.user.invite_codes_remaining - 1
request.user.invite_codes_remaining = User.invite_codes_remaining - 1
return {'code': code, 'num_remaining': num_remaining}
return {'codes': codes, 'num_remaining': num_remaining}
@ic_view_config(

3
tildes/tildes/views/user.py

@ -83,6 +83,9 @@ def get_invite(request: Request) -> dict:
UserInviteCode.user_id == request.user.user_id,
UserInviteCode.invitee_id == None, # noqa
)
.order_by(
UserInviteCode.created_time.desc()
)
.all()
)

Loading…
Cancel
Save