Adds basic support for membership trials
Note: Membership trial for volunteers can only happen in autumn. Also: - Hide dist file diffs
This commit is contained in:
1 parent
67a259aa3d
commit
927f1fbcf5
8 files changed
+67
-15
No files matched your search
@@ -0,0 +1,2 @@
|
||||
static/dist/styles/*.css -diff
|
||||
static/dist/scripts/*.js -diff
|
||||
@@ -0,0 +1,19 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.db import models, migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('kassa', '0005_auto_20150829_1525'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='kassaevent',
|
||||
name='event',
|
||||
field=models.CharField(max_length=255, choices=[('add_or_renew', 'New or renewed user membership'), ('new_card_membership', 'New card membership (no user yet)'), ('refund', 'Refunded membership'), ('renew_only', 'Renewed user membership'), ('sms_card_notify', 'Sent activation link to phone number'), ('update_card', 'Updated card'), ('membership_trial', 'New membership trial')]),
|
||||
),
|
||||
]
|
||||
@@ -10,13 +10,15 @@ class KassaEvent(models.Model):
|
||||
RENEW_ONLY = 'renew_only'
|
||||
SMS_CARD_NOTIFY = 'sms_card_notify'
|
||||
UPDATE_CARD = 'update_card'
|
||||
MEMBERSHIP_TRIAL = 'membership_trial'
|
||||
EVENT_CHOICES = (
|
||||
(ADD_OR_RENEW, _('Added or renewed user membership')),
|
||||
(NEW_CARD_MEMBERSHIP, _('Added new card membership (no user yet)')),
|
||||
(ADD_OR_RENEW, _('New or renewed user membership')),
|
||||
(NEW_CARD_MEMBERSHIP, _('New card membership (no user yet)')),
|
||||
(REFUND, _('Refunded membership')),
|
||||
(RENEW_ONLY, _('Renewed user membership')),
|
||||
(SMS_CARD_NOTIFY, _('Notified phone number about activation')),
|
||||
(UPDATE_CARD, _('Updated user card number')),
|
||||
(SMS_CARD_NOTIFY, _('Sent activation link to phone number')),
|
||||
(UPDATE_CARD, _('Updated card')),
|
||||
(MEMBERSHIP_TRIAL, _('New membership trial'))
|
||||
)
|
||||
event = models.CharField(max_length=255, choices=EVENT_CHOICES)
|
||||
card_number = models.IntegerField(null=True, blank=True)
|
||||
|
||||
@@ -17,9 +17,13 @@
|
||||
<li>Registering a card number with a phone number already tied to an existing user, will add the card to that user.</li>
|
||||
</ul>
|
||||
<button id="register-submit-btn" type="submit" class="btn btn-primary btn-lg" disabled>{% trans "Register card" %}</button>
|
||||
<button type="reset" class="register-reset-btn btn btn-default">{% trans "Reset" %}</button><br><br>
|
||||
<button type="reset" class="register-reset-btn btn btn-default">{% trans "Reset" %}</button>
|
||||
{% if show_trial_membership %}
|
||||
<input type="checkbox" class="" id="id_membership_trial" name="membership_trial" value="volunteer"><label for="id_membership_trial" title="{% trans "Expires January 1. next year" %}">{% trans "Trial membership" %}</label>
|
||||
{% endif %}
|
||||
<br><br>
|
||||
<ul>
|
||||
<li>If an existing user is found, you can renew the membership only (up to 30 days before expiry).</li>
|
||||
<li>If an existing user with card is found, you can renew the membership only (up to 30 days before expiry).</li>
|
||||
</ul>
|
||||
<button id="membership-submit-btn" type="submit" class="btn btn-default" disabled>{% trans "Renew membership only" %}</button>
|
||||
</form>
|
||||
|
||||
+16
-2
@@ -2,6 +2,7 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
import datetime
|
||||
import json
|
||||
import phonenumbers
|
||||
import requests
|
||||
@@ -35,7 +36,7 @@ def inside_get_card(card_number):
|
||||
return requests.get(url, params=params)
|
||||
|
||||
|
||||
def inside_update_card(card_number, user_id, phone_number, action):
|
||||
def inside_update_card(card_number, user_id, phone_number, action, membership_trial=None):
|
||||
url = '{}card.php'.format(settings.INSIDE_API_URL)
|
||||
|
||||
payload = {
|
||||
@@ -44,6 +45,9 @@ def inside_update_card(card_number, user_id, phone_number, action):
|
||||
'phone_number': phone_number,
|
||||
'action': action # new_card_membership, update_card, add_or_renew, sms_card_notify
|
||||
}
|
||||
if membership_trial is not None:
|
||||
payload.update({'membership_trial': membership_trial})
|
||||
|
||||
return requests.post(
|
||||
url,
|
||||
data=json.dumps(payload),
|
||||
@@ -52,7 +56,7 @@ def inside_update_card(card_number, user_id, phone_number, action):
|
||||
)
|
||||
|
||||
|
||||
def inside_update_membership(user_id, purchased=None):
|
||||
def inside_update_membership(user_id, purchased=None, membership_trial=None):
|
||||
url = '{}membership.php'.format(settings.INSIDE_API_URL)
|
||||
payload = {
|
||||
'apikey': settings.INSIDE_API_KEY,
|
||||
@@ -60,6 +64,9 @@ def inside_update_membership(user_id, purchased=None):
|
||||
'purchased': purchased,
|
||||
'source': 'kassa'
|
||||
}
|
||||
if membership_trial is not None:
|
||||
payload.update({'membership_trial': membership_trial})
|
||||
|
||||
return requests.post(url, data=json.dumps(payload), headers=dict(content_type='application/json'))
|
||||
|
||||
|
||||
@@ -76,3 +83,10 @@ def format_phone_number(number):
|
||||
return number
|
||||
|
||||
return phonenumbers.format_number(p, phonenumbers.PhoneNumberFormat.E164)
|
||||
|
||||
|
||||
def is_autumn():
|
||||
today = datetime.date.today()
|
||||
_min = datetime.date(year=today.year, month=8, day=1)
|
||||
_max = datetime.date(year=today.year + 1, month=1, day=1)
|
||||
return _min <= today < _max
|
||||
+10
-5
@@ -15,7 +15,7 @@ import logging
|
||||
|
||||
from apps.kassa.forms import AddCardForm, SearchUserForm
|
||||
from apps.kassa.utils import tekstmelding_new_membership_card, inside_update_card, inside_get_card, \
|
||||
inside_update_membership, format_phone_number
|
||||
inside_update_membership, format_phone_number, is_autumn
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -24,7 +24,8 @@ logger = logging.getLogger(__name__)
|
||||
def register(request):
|
||||
context = {
|
||||
'add_card_form': AddCardForm(),
|
||||
'search_user_form': SearchUserForm()
|
||||
'search_user_form': SearchUserForm(),
|
||||
'show_trial_membership': is_autumn()
|
||||
}
|
||||
return render(request, 'kassa/register.html', context)
|
||||
|
||||
@@ -99,12 +100,14 @@ def register_card_and_membership(request):
|
||||
# TODO: multiple actions (to allow renewal only)
|
||||
user_id = post_data.get('user_id')
|
||||
card_number = post_data.get('card_number')
|
||||
membership_trial = post_data.get('membership_trial')
|
||||
|
||||
response = inside_update_card(
|
||||
card_number,
|
||||
user_id,
|
||||
post_data.get('phone_number'),
|
||||
action
|
||||
action,
|
||||
membership_trial
|
||||
)
|
||||
if response.status_code != 200:
|
||||
return JsonResponse(response.json(), status=response.status_code)
|
||||
@@ -129,6 +132,8 @@ def register_card_and_membership(request):
|
||||
event = KassaEvent.NEW_CARD_MEMBERSHIP
|
||||
if action == 'sms_card_notify':
|
||||
event = KassaEvent.SMS_CARD_NOTIFY
|
||||
elif event == KassaEvent.NEW_CARD_MEMBERSHIP and membership_trial is not None:
|
||||
event = KassaEvent.MEMBERSHIP_TRIAL
|
||||
|
||||
# FIXME: could be async
|
||||
tekstmelding_new_membership_card(card_number=card['card_number'], phone_number=card['owner_phone_number'])
|
||||
@@ -140,9 +145,9 @@ def register_card_and_membership(request):
|
||||
|
||||
# Add initial or renew membership for existing user
|
||||
elif action == 'add_or_renew':
|
||||
response = inside_update_membership(user_id, post_data.get('purchased'))
|
||||
response = inside_update_membership(user_id, post_data.get('purchased'), membership_trial=membership_trial)
|
||||
KassaEvent.objects.create(
|
||||
event=KassaEvent.ADD_OR_RENEW,
|
||||
event=KassaEvent.ADD_OR_RENEW if membership_trial is None else KassaEvent.MEMBERSHIP_TRIAL,
|
||||
user_inside_id=user_id
|
||||
)
|
||||
|
||||
|
||||
@@ -142,6 +142,8 @@ function resetCardForm(reset_native) {
|
||||
selectedUser = null;
|
||||
_dom.userIdField.val('').trigger('change');
|
||||
|
||||
_dom.membershipTrialCheckBox.prop('checked', false);
|
||||
|
||||
pendingSMSMembership = null;
|
||||
|
||||
/* Disable submit buttons */
|
||||
@@ -317,7 +319,8 @@ $(document).ready(function(){
|
||||
toastWrap: $('.toast-wrap'),
|
||||
registerResetButton: $('.register-reset-btn'),
|
||||
searchResetButton: $('.search-reset-btn'),
|
||||
membershipSubmitButton: $('#membership-submit-btn')
|
||||
membershipSubmitButton: $('#membership-submit-btn'),
|
||||
membershipTrialCheckBox: $('#id_membership_trial')
|
||||
};
|
||||
|
||||
var lazyCheckPhoneNumber = _.debounce(checkPhoneNumber, 250);
|
||||
|
||||
Vendored
+4
-1
@@ -142,6 +142,8 @@ function resetCardForm(reset_native) {
|
||||
selectedUser = null;
|
||||
_dom.userIdField.val('').trigger('change');
|
||||
|
||||
_dom.membershipTrialCheckBox.prop('checked', false);
|
||||
|
||||
pendingSMSMembership = null;
|
||||
|
||||
/* Disable submit buttons */
|
||||
@@ -317,7 +319,8 @@ $(document).ready(function(){
|
||||
toastWrap: $('.toast-wrap'),
|
||||
registerResetButton: $('.register-reset-btn'),
|
||||
searchResetButton: $('.search-reset-btn'),
|
||||
membershipSubmitButton: $('#membership-submit-btn')
|
||||
membershipSubmitButton: $('#membership-submit-btn'),
|
||||
membershipTrialCheckBox: $('#id_membership_trial')
|
||||
};
|
||||
|
||||
var lazyCheckPhoneNumber = _.debounce(checkPhoneNumber, 250);
|
||||
|
||||
Reference in new issue
Block a user