88 lines
3.7 KiB
Python
88 lines
3.7 KiB
Python
# Copyright (C) 2020 by Animath
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
import os
|
|
|
|
from django.contrib.auth.models import User
|
|
from django.core.management import BaseCommand
|
|
from django.db.models import Q
|
|
import requests
|
|
|
|
|
|
class Command(BaseCommand):
|
|
def handle(self, *args, **options): # noqa: C901
|
|
# Get access token
|
|
response = requests.post('https://api.helloasso.com/oauth2/token', headers={
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
}, data={
|
|
'client_id': os.getenv('HELLOASSO_CLIENT_ID', ''),
|
|
'client_secret': os.getenv('HELLOASSO_CLIENT_SECRET', ''),
|
|
'grant_type': 'client_credentials',
|
|
}).json()
|
|
|
|
token = response['access_token']
|
|
|
|
organization = "animath"
|
|
form_slug = "tfjm-2022-tournois-regionaux"
|
|
from_date = "2000-01-01"
|
|
url = f"https://api.helloasso.com/v5/organizations/{organization}/forms/Event/{form_slug}/payments" \
|
|
f"?from={from_date}&pageIndex=1&pageSize=100&retrieveOfflineDonations=false"
|
|
headers = {
|
|
"Accept": "application/json",
|
|
"Authorization": f"Bearer {token}",
|
|
}
|
|
http_response = requests.get(url, headers=headers)
|
|
response = http_response.json()
|
|
|
|
if http_response.status_code != 200:
|
|
message = response["message"]
|
|
self.stderr.write(f"Error while querying Hello Asso: {message}")
|
|
return
|
|
|
|
for payment in response["data"]:
|
|
if payment["state"] != "Authorized":
|
|
continue
|
|
|
|
payer = payment["payer"]
|
|
email = payer["email"]
|
|
last_name = payer["lastName"]
|
|
first_name = payer["firstName"]
|
|
base_filter = Q(
|
|
registration__participantregistration__isnull=False,
|
|
registration__participantregistration__team__isnull=False,
|
|
registration__participantregistration__team__participation__valid=True,
|
|
)
|
|
qs = User.objects.filter(
|
|
base_filter,
|
|
email=email,
|
|
)
|
|
if not qs.exists():
|
|
qs = User.objects.filter(
|
|
base_filter,
|
|
last_name__icontains=last_name,
|
|
)
|
|
if qs.count() >= 2:
|
|
qs = qs.filter(first_name__icontains=first_name)
|
|
if not qs.exists():
|
|
self.stderr.write(f"Warning: a payment was found by {first_name} {last_name} ({email}), "
|
|
"but this user is unknown.")
|
|
continue
|
|
if qs.count() > 1:
|
|
self.stderr.write(f"Warning: a payment was found by {first_name} {last_name} ({email}), "
|
|
f"but there are {qs.count()} matching users.")
|
|
continue
|
|
user = qs.get()
|
|
if not user.registration.participates:
|
|
self.stderr.write(f"Warning: a payment was found by the email address {email}, "
|
|
"but this user is not a participant.")
|
|
continue
|
|
payment_obj = user.registration.payment
|
|
payment_obj.valid = True
|
|
payment_obj.type = "helloasso"
|
|
payment_obj.additional_information = f"Identifiant de transation : {payment['id']}\n" \
|
|
f"Date : {payment['date']}\n" \
|
|
f"Reçu : {payment['paymentReceiptUrl']}\n" \
|
|
f"Montant : {payment['amount'] / 100:.2f} €"
|
|
payment_obj.save()
|
|
self.stdout.write(f"{payment_obj} is validated")
|