Fix integration with Tekstmelding + rename Dusken to Galtinn
This commit is contained in:
1 parent
8bcae5a1e0
commit
192a9fb194
8 files changed
+68
-87
No files matched your search
+2
-2
@@ -3,10 +3,10 @@ from django.contrib import admin
|
||||
|
||||
|
||||
class KassaEventAdmin(admin.ModelAdmin):
|
||||
list_display = ['id', 'event', 'card_number', 'user_phone_number', 'user_dusken_id',
|
||||
list_display = ['id', 'event', 'card_number', 'user_phone_number', 'user_galtinn_id',
|
||||
'user_inside_id', 'created', 'transaction_id']
|
||||
list_filter = ['event']
|
||||
search_fields = ['card_number', 'user_phone_number', 'user_dusken_id',
|
||||
search_fields = ['card_number', 'user_phone_number', 'user_galtinn_id',
|
||||
'user_inside_id', 'transaction_id']
|
||||
|
||||
admin.site.register(KassaEvent, KassaEventAdmin)
|
||||
+1
-1
@@ -14,7 +14,7 @@ class Migration(migrations.Migration):
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='kassaevent',
|
||||
name='user_dusken_id',
|
||||
name='user_galtinn_id',
|
||||
field=models.IntegerField(blank=True, null=True),
|
||||
),
|
||||
]
|
||||
@@ -21,7 +21,7 @@ class KassaEvent(models.Model):
|
||||
)
|
||||
event = models.CharField(max_length=255, choices=EVENT_CHOICES)
|
||||
card_number = models.IntegerField(null=True, blank=True)
|
||||
user_dusken_id = models.IntegerField(null=True, blank=True)
|
||||
user_galtinn_id = models.IntegerField(null=True, blank=True)
|
||||
user_inside_id = models.IntegerField(null=True, blank=True)
|
||||
user_phone_number = models.CharField(max_length=100, null=True, blank=True)
|
||||
transaction_id = models.UUIDField(null=True, blank=True)
|
||||
|
||||
+2
-4
@@ -1,7 +1,6 @@
|
||||
from django.conf.urls import url
|
||||
from apps.kassa.views import (register, user_search, check_card,
|
||||
check_phone_number, register_card_and_membership,
|
||||
stats_card_sales, renew_membership)
|
||||
from apps.kassa.views import (register, user_search, check_card, check_phone_number,
|
||||
register_card_and_membership, renew_membership)
|
||||
|
||||
urlpatterns = [
|
||||
url(r'^$', register, name='register'),
|
||||
@@ -10,5 +9,4 @@ urlpatterns = [
|
||||
url(r'^check-card/$', check_card, name='check-card'),
|
||||
url(r'^register-card-membership/$', register_card_and_membership, name='register-card-and-membership'),
|
||||
url(r'^renew-membership/$', renew_membership, name='renew-membership'),
|
||||
url(r'^stats/card-sales/$', stats_card_sales, name='stats-card-sales')
|
||||
]
|
||||
+32
-33
@@ -7,68 +7,67 @@ import logging
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
dusken_auth = {
|
||||
'Authorization': 'Token {}'.format(settings.DUSKEN_API_KEY)
|
||||
galtinn_auth = {
|
||||
'Authorization': 'Token {}'.format(settings.GALTINN_API_KEY)
|
||||
}
|
||||
|
||||
tekstmelding_auth = {
|
||||
'Authorization': 'Token {}'.format(settings.TEKSTMELDING_API_KEY)
|
||||
}
|
||||
|
||||
|
||||
def tekstmelding_new_membership_card(card_number, phone_number):
|
||||
def send_sms_activation_link(phone_number, transaction_id):
|
||||
to = phone_number.replace('+', ''),
|
||||
code = transaction_id[:8]
|
||||
activation_url = settings.GALTINN_ACTIVATION_URL.format(to=to, code=code)
|
||||
message = settings.TEKSTMELDING_ACTIVATION_SMS_TEMPLATE.format(url=activation_url)
|
||||
payload = {
|
||||
'phone_number': phone_number,
|
||||
'card_number': card_number,
|
||||
'action': 'new_card_no_user',
|
||||
'to': to,
|
||||
'message': message
|
||||
}
|
||||
|
||||
if not settings.TEKSTMELDING_ENABLED:
|
||||
logger.info('Tekstmelding disabled. Payload would be: ', payload)
|
||||
logger.info('Tekstmelding disabled. Payload would be: {}'.format(payload))
|
||||
return
|
||||
|
||||
url = '{}kassa/new-membership-card'.format(settings.TEKSTMELDING_API_URL)
|
||||
response = requests.post(
|
||||
url,
|
||||
json=payload,
|
||||
params={'api_key': settings.TEKSTMELDING_API_KEY},
|
||||
headers={'Content-Type': 'application/json'}
|
||||
)
|
||||
|
||||
url = '{}send'.format(settings.TEKSTMELDING_API_URL)
|
||||
response = requests.post(url, json=payload, headers=tekstmelding_auth)
|
||||
return response.json()
|
||||
|
||||
|
||||
def get_card(card_number):
|
||||
url = '{}cards/{}/'.format(settings.DUSKEN_API_URL, card_number)
|
||||
return requests.get(url, headers=dusken_auth)
|
||||
url = '{}cards/{}/'.format(settings.GALTINN_API_URL, card_number)
|
||||
return requests.get(url, headers=galtinn_auth)
|
||||
|
||||
|
||||
def get_order(order_uuid):
|
||||
url = '{}orders/{}/'.format(settings.DUSKEN_API_URL, order_uuid)
|
||||
return requests.get(url, headers=dusken_auth)
|
||||
url = '{}orders/{}/'.format(settings.GALTINN_API_URL, order_uuid)
|
||||
return requests.get(url, headers=galtinn_auth)
|
||||
|
||||
|
||||
def get_latest_order_by_card(card_number):
|
||||
url = '{}orders/'.format(settings.DUSKEN_API_URL)
|
||||
url = '{}orders/'.format(settings.GALTINN_API_URL)
|
||||
payload = {'card_number': card_number}
|
||||
orders = requests.get(url, params=payload, headers=dusken_auth).json()
|
||||
orders = requests.get(url, params=payload, headers=galtinn_auth).json()
|
||||
return orders.get('results')[0]
|
||||
|
||||
|
||||
def get_latest_order_by_phone(phone_number):
|
||||
url = '{}orders/'.format(settings.DUSKEN_API_URL)
|
||||
url = '{}orders/'.format(settings.GALTINN_API_URL)
|
||||
payload = {'phone_number': phone_number}
|
||||
orders = requests.get(url, params=payload, headers=dusken_auth).json()
|
||||
orders = requests.get(url, params=payload, headers=galtinn_auth).json()
|
||||
if orders.get('count'):
|
||||
return orders.get('results')[0]
|
||||
return None
|
||||
|
||||
|
||||
def get_user(user_id):
|
||||
url = '{}users/{}/'.format(settings.DUSKEN_API_URL, user_id)
|
||||
return requests.get(url, headers=dusken_auth)
|
||||
url = '{}users/{}/'.format(settings.GALTINN_API_URL, user_id)
|
||||
return requests.get(url, headers=galtinn_auth)
|
||||
|
||||
|
||||
def get_user_by_phone(phone_number):
|
||||
url = '{}users/'.format(settings.DUSKEN_API_URL)
|
||||
url = '{}users/'.format(settings.GALTINN_API_URL)
|
||||
payload = {'phone_number': phone_number}
|
||||
users = requests.get(url, params=payload, headers=dusken_auth).json()
|
||||
users = requests.get(url, params=payload, headers=galtinn_auth).json()
|
||||
if users.get('count') == 1:
|
||||
return users.get('results')[0]
|
||||
return None
|
||||
@@ -76,19 +75,19 @@ def get_user_by_phone(phone_number):
|
||||
|
||||
def update_card(card_number, user_id=None, order_uuid=None):
|
||||
assert not (user_id and order_uuid)
|
||||
url = '{}kassa/card/'.format(settings.DUSKEN_API_URL)
|
||||
url = '{}kassa/card/'.format(settings.GALTINN_API_URL)
|
||||
payload = {
|
||||
'member_card': card_number,
|
||||
'user': user_id,
|
||||
'order': order_uuid,
|
||||
}
|
||||
return requests.patch(url, json=payload, headers=dusken_auth)
|
||||
return requests.patch(url, json=payload, headers=galtinn_auth)
|
||||
|
||||
|
||||
def update_membership(user=None, phone_number=None, card_number=None, membership_type=None,
|
||||
transaction_id=None):
|
||||
assert membership_type in ('standard', 'trial')
|
||||
url = '{}kassa/membership/'.format(settings.DUSKEN_API_URL)
|
||||
url = '{}kassa/membership/'.format(settings.GALTINN_API_URL)
|
||||
payload = {
|
||||
'user': user,
|
||||
'phone_number': phone_number,
|
||||
@@ -96,7 +95,7 @@ def update_membership(user=None, phone_number=None, card_number=None, membership
|
||||
'membership_type': membership_type,
|
||||
'transaction_id': transaction_id,
|
||||
}
|
||||
return requests.post(url, json=payload, headers=dusken_auth)
|
||||
return requests.post(url, json=payload, headers=galtinn_auth)
|
||||
|
||||
|
||||
def format_phone_number(number):
|
||||
|
||||
+17
-35
@@ -13,9 +13,9 @@ import requests
|
||||
|
||||
from apps.kassa.models import KassaEvent
|
||||
from apps.kassa.forms import AddCardForm, SearchUserForm
|
||||
from apps.kassa.utils import tekstmelding_new_membership_card, update_card, get_card, \
|
||||
from apps.kassa.utils import send_sms_activation_link, update_card, get_card, \
|
||||
get_order, get_latest_order_by_card, get_latest_order_by_phone, get_user, get_user_by_phone, \
|
||||
dusken_auth, update_membership, format_phone_number, is_autumn
|
||||
galtinn_auth, update_membership, format_phone_number, is_autumn
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -35,8 +35,8 @@ def user_search(request):
|
||||
payload = {
|
||||
'search': request.GET.get('search', '')
|
||||
}
|
||||
url = '{}users/'.format(settings.DUSKEN_API_URL)
|
||||
data = requests.get(url, params=payload, headers=dusken_auth).json()
|
||||
url = '{}users/'.format(settings.GALTINN_API_URL)
|
||||
data = requests.get(url, params=payload, headers=galtinn_auth).json()
|
||||
|
||||
return JsonResponse(data)
|
||||
|
||||
@@ -100,6 +100,9 @@ def register_card_and_membership(request):
|
||||
phone_number = post_data.get('phone_number')
|
||||
membership_trial = post_data.get('membership_trial')
|
||||
membership_type = 'trial' if membership_trial else 'standard'
|
||||
transaction_id = uuid.uuid4()
|
||||
|
||||
logger.debug('register_card_and_membership post_data %r', post_data)
|
||||
|
||||
# Update card number on user or order
|
||||
if action in ('update_card', 'sms_card_notify'):
|
||||
@@ -116,14 +119,14 @@ def register_card_and_membership(request):
|
||||
'event': KassaEvent.UPDATE_CARD,
|
||||
'user_phone_number': phone_number,
|
||||
'card_number': card_number,
|
||||
'user_dusken_id': user_id,
|
||||
'user_galtinn_id': user_id,
|
||||
'transaction_id': transaction_id
|
||||
}
|
||||
logger.debug(event_data)
|
||||
KassaEvent.objects.create(**event_data)
|
||||
|
||||
# Add initial or renew membership for existing user or order
|
||||
if action in ('add_or_renew', 'new_card_membership'):
|
||||
transaction_id = uuid.uuid4()
|
||||
response = update_membership(
|
||||
user=user_id,
|
||||
phone_number=phone_number,
|
||||
@@ -132,7 +135,7 @@ def register_card_and_membership(request):
|
||||
transaction_id=str(transaction_id))
|
||||
KassaEvent.objects.create(
|
||||
event=KassaEvent.ADD_OR_RENEW if membership_type != 'trial' else KassaEvent.MEMBERSHIP_TRIAL,
|
||||
user_dusken_id=user_id,
|
||||
user_galtinn_id=user_id,
|
||||
card_number=card_number,
|
||||
user_phone_number=phone_number,
|
||||
transaction_id=transaction_id
|
||||
@@ -145,12 +148,13 @@ def register_card_and_membership(request):
|
||||
event = KassaEvent.SMS_CARD_NOTIFY
|
||||
|
||||
# FIXME: could be async
|
||||
tekstmelding_new_membership_card(card_number=card_number,
|
||||
phone_number=phone_number)
|
||||
send_sms_activation_link(phone_number=phone_number,
|
||||
transaction_id=str(transaction_id))
|
||||
KassaEvent.objects.create(
|
||||
event=event,
|
||||
card_number=card_number,
|
||||
user_phone_number=phone_number
|
||||
user_phone_number=phone_number,
|
||||
transaction_id=transaction_id
|
||||
)
|
||||
|
||||
return JsonResponse(response.json(), status=response.status_code)
|
||||
@@ -169,6 +173,8 @@ def renew_membership(request):
|
||||
membership_type = 'trial' if membership_trial else 'standard'
|
||||
transaction_id = str(uuid.uuid4())
|
||||
|
||||
logger.debug('renew_membership post_data %r', post_data)
|
||||
|
||||
response = update_membership(
|
||||
user=user_id,
|
||||
phone_number=phone_number,
|
||||
@@ -177,32 +183,8 @@ def renew_membership(request):
|
||||
transaction_id=transaction_id)
|
||||
KassaEvent.objects.create(
|
||||
event=KassaEvent.RENEW_ONLY if membership_trial is None else KassaEvent.MEMBERSHIP_TRIAL,
|
||||
user_dusken_id=user_id,
|
||||
user_galtinn_id=user_id,
|
||||
transaction_id=transaction_id
|
||||
)
|
||||
|
||||
return JsonResponse(response.json(), status=response.status_code)
|
||||
|
||||
|
||||
def stats_card_sales(request):
|
||||
sale_events = [KassaEvent.ADD_OR_RENEW, KassaEvent.NEW_CARD_MEMBERSHIP, KassaEvent.RENEW_ONLY]
|
||||
start = request.GET.get('start')
|
||||
if start:
|
||||
try:
|
||||
start_date = timezone.datetime.strptime(start, '%Y-%m-%d')
|
||||
except ValueError:
|
||||
logger.info('Invalid start date in param start: \'%s\'', start)
|
||||
return JsonResponse({'error': 'Invalid start date in param start: \'{}\''.format(start)})
|
||||
else:
|
||||
start_date = timezone.datetime(year=2015, month=8, day=1)
|
||||
|
||||
if not timezone.is_aware(start_date):
|
||||
start_date = timezone.make_aware(start_date, timezone.get_current_timezone())
|
||||
|
||||
events = KassaEvent.objects.filter(event__in=sale_events, created__gte=start_date).values_list('created')
|
||||
grouped = []
|
||||
date_format = '%Y-%m-%d'
|
||||
for key, values in groupby(events, key=lambda row: row[0].strftime(date_format)):
|
||||
grouped.append({'date': key, 'sales': len(list(values))})
|
||||
|
||||
return JsonResponse({'memberships': grouped})
|
||||
Reference in new issue
Block a user