62 lines
2.5 KiB
Python
62 lines
2.5 KiB
Python
# Copyright (C) 2024 by Animath
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
from hashlib import sha1
|
|
|
|
from django.conf import settings
|
|
from django.contrib.sites.models import Site
|
|
from django.core.management import BaseCommand
|
|
from django.urls import reverse
|
|
from django.utils import timezone
|
|
from django.utils.timezone import localtime
|
|
import gspread
|
|
|
|
from ...models import Tournament
|
|
|
|
|
|
class Command(BaseCommand):
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'--tournament', '-t', help="Tournament name to update (if not set, all tournaments will be updated)",
|
|
)
|
|
|
|
def handle(self, *args, **options):
|
|
tournaments = Tournament.objects.all() if not options['tournament'] \
|
|
else Tournament.objects.filter(name=options['tournament']).all()
|
|
|
|
gc = gspread.service_account_from_dict(settings.GOOGLE_SERVICE_CLIENT)
|
|
http_client = gc.http_client
|
|
http_client.login()
|
|
|
|
site = Site.objects.get(pk=settings.SITE_ID)
|
|
|
|
now = localtime(timezone.now())
|
|
tomorrow = now + timezone.timedelta(days=1)
|
|
tomorrow -= timezone.timedelta(hours=now.hour, minutes=now.minute, seconds=now.second,
|
|
microseconds=now.microsecond)
|
|
|
|
for tournament in tournaments:
|
|
if options['verbosity'] >= 1:
|
|
self.stdout.write(f"Renewing Google Drive notifications for {tournament}")
|
|
|
|
if not tournament.notes_sheet_id:
|
|
if options['verbosity'] >= 1:
|
|
self.stdout.write(
|
|
self.style.WARNING(f"No spreadsheet found for {tournament}. Please create it first"))
|
|
continue
|
|
|
|
channel_id = sha1(f"{tournament.name}-{now.date()}-{site.domain}".encode()).hexdigest()
|
|
url = f"https://www.googleapis.com/drive/v3/files/{tournament.notes_sheet_id}/watch?supportsAllDrives=true"
|
|
notif_path = reverse('participation:tournament_gsheet_notifications', args=[tournament.pk])
|
|
notif_url = f"https://{site.domain}{notif_path}"
|
|
body = {
|
|
"id": channel_id,
|
|
"type": "web_hook",
|
|
"address": notif_url,
|
|
"expiration": str(int(1000 * tomorrow.timestamp())),
|
|
}
|
|
try:
|
|
http_client.request(method="POST", endpoint=url, json=body).raise_for_status()
|
|
except Exception as e:
|
|
self.stderr.write(self.style.ERROR(f"Error while renewing notifications for {tournament.name}: {e}"))
|