118 lines
3.9 KiB
Python
118 lines
3.9 KiB
Python
import datetime
|
|
import logging
|
|
|
|
import phonenumbers
|
|
import requests
|
|
from django.conf import settings
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
galtinn_auth = {"Authorization": f"Token {settings.GALTINN_API_KEY}"}
|
|
|
|
tekstmelding_auth = {"Authorization": f"Token {settings.TEKSTMELDING_API_KEY}"}
|
|
|
|
|
|
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 = {"to": to, "message": message}
|
|
if not settings.TEKSTMELDING_ENABLED:
|
|
logger.info(f"Tekstmelding disabled. Payload would be: {payload}")
|
|
return None
|
|
url = f"{settings.TEKSTMELDING_API_URL}send"
|
|
response = requests.post(url, json=payload, headers=tekstmelding_auth, timeout=10)
|
|
return response.json()
|
|
|
|
|
|
def get_card(card_number):
|
|
url = f"{settings.GALTINN_API_URL}cards/{card_number}/"
|
|
return requests.get(url, headers=galtinn_auth, timeout=10)
|
|
|
|
|
|
def get_order(order_uuid):
|
|
url = f"{settings.GALTINN_API_URL}orders/{order_uuid}/"
|
|
return requests.get(url, headers=galtinn_auth, timeout=10)
|
|
|
|
|
|
def get_latest_order_by_card(card_number):
|
|
url = f"{settings.GALTINN_API_URL}orders/"
|
|
payload = {"card_number": card_number}
|
|
orders = requests.get(url, params=payload, headers=galtinn_auth, timeout=10).json()
|
|
return orders.get("results")[0]
|
|
|
|
|
|
def get_latest_order_by_phone(phone_number):
|
|
url = f"{settings.GALTINN_API_URL}orders/"
|
|
payload = {"phone_number": phone_number}
|
|
orders = requests.get(url, params=payload, headers=galtinn_auth, timeout=10).json()
|
|
if orders.get("count"):
|
|
return orders.get("results")[0]
|
|
return None
|
|
|
|
|
|
def get_user(user_id):
|
|
url = f"{settings.GALTINN_API_URL}users/{user_id}/"
|
|
return requests.get(url, headers=galtinn_auth, timeout=10)
|
|
|
|
|
|
def get_user_by_phone(phone_number):
|
|
url = f"{settings.GALTINN_API_URL}users/"
|
|
payload = {"phone_number": phone_number}
|
|
users = requests.get(url, params=payload, headers=galtinn_auth, timeout=10).json()
|
|
if users.get("count") == 1:
|
|
return users.get("results")[0]
|
|
return None
|
|
|
|
|
|
def update_card(card_number, user_id=None, order_uuid=None, transaction_id=None):
|
|
if user_id and order_uuid:
|
|
raise ValueError("Cannot provide both user_id and order_uuid. Provide one or the other.")
|
|
|
|
url = f"{settings.GALTINN_API_URL}kassa/card/"
|
|
payload = {
|
|
"member_card": card_number,
|
|
"user": user_id,
|
|
"order": order_uuid,
|
|
"transaction_id": str(transaction_id) if transaction_id else None,
|
|
}
|
|
return requests.patch(url, json=payload, headers=galtinn_auth, timeout=10)
|
|
|
|
|
|
def update_membership(user=None, phone_number=None, card_number=None, membership_type=None, transaction_id=None):
|
|
if membership_type not in ("standard", "trial"):
|
|
raise ValueError("Invalid membership type provided. Must be 'standard' or 'trial'.")
|
|
|
|
url = f"{settings.GALTINN_API_URL}kassa/membership/"
|
|
payload = {
|
|
"user": user,
|
|
"phone_number": phone_number,
|
|
"member_card": card_number,
|
|
"membership_type": membership_type,
|
|
"transaction_id": transaction_id,
|
|
}
|
|
return requests.post(url, json=payload, headers=galtinn_auth, timeout=10)
|
|
|
|
|
|
def format_phone_number(number):
|
|
if len(number) == 0:
|
|
return number
|
|
|
|
try:
|
|
p = phonenumbers.parse(number, region="NO")
|
|
except phonenumbers.NumberParseException:
|
|
return number
|
|
|
|
if not phonenumbers.is_valid_number(p):
|
|
return number
|
|
|
|
return phonenumbers.format_number(p, phonenumbers.PhoneNumberFormat.E164)
|
|
|
|
|
|
def is_autumn():
|
|
today = datetime.datetime.now(tz=datetime.UTC).date()
|
|
_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
|