diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..d09c034 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +static/dist/styles/*.css -diff +static/dist/scripts/*.js -diff diff --git a/apps/kassa/migrations/0006_auto_20150829_1811.py b/apps/kassa/migrations/0006_auto_20150829_1811.py new file mode 100644 index 0000000..1a83743 --- /dev/null +++ b/apps/kassa/migrations/0006_auto_20150829_1811.py @@ -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')]), + ), + ] diff --git a/apps/kassa/models.py b/apps/kassa/models.py index f945141..c2cf5c4 100644 --- a/apps/kassa/models.py +++ b/apps/kassa/models.py @@ -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) diff --git a/apps/kassa/templates/kassa/register.html b/apps/kassa/templates/kassa/register.html index c3755f5..b951f23 100644 --- a/apps/kassa/templates/kassa/register.html +++ b/apps/kassa/templates/kassa/register.html @@ -17,9 +17,13 @@
  • Registering a card number with a phone number already tied to an existing user, will add the card to that user.
  • -

    + + {% if show_trial_membership %} + + {% endif %} +

    diff --git a/apps/kassa/utils.py b/apps/kassa/utils.py index b770d34..4f5e951 100644 --- a/apps/kassa/utils.py +++ b/apps/kassa/utils.py @@ -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 diff --git a/apps/kassa/views.py b/apps/kassa/views.py index b4630a4..c83ddb5 100644 --- a/apps/kassa/views.py +++ b/apps/kassa/views.py @@ -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 ) diff --git a/static/app/scripts/app.js b/static/app/scripts/app.js index 0bc3a84..31f5d0c 100644 --- a/static/app/scripts/app.js +++ b/static/app/scripts/app.js @@ -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); diff --git a/static/dist/scripts/app.js b/static/dist/scripts/app.js index 0bc3a84..31f5d0c 100644 --- a/static/dist/scripts/app.js +++ b/static/dist/scripts/app.js @@ -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);