# 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")