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:
nikolark committed 2015-08-29 18:20:04 +02:00
1 parent 67a259aa3d
commit 927f1fbcf5
8 files changed
+67 -15

No files matched your search

+2
View File
@@ -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')]),
),
]
+6 -4
View File
@@ -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)
+6 -2
View File
@@ -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
View File
@@ -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
View File
@@ -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
)
+4 -1
View File
@@ -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);
+4 -1
View File
@@ -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);