mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-11-04 10:22:11 +01:00 
			
		
		
		
	Add notifications from Google Drive to automatically get updates from Google Sheets
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
		@@ -0,0 +1,58 @@
 | 
			
		||||
# Copyright (C) 2024 by Animath
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from hashlib import sha1
 | 
			
		||||
 | 
			
		||||
import gspread
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
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}-{timezone.now().date()}-{site.domain}".encode()).hexdigest()
 | 
			
		||||
            url = f"https://www.googleapis.com/drive/v3/files/{tournament.notes_sheet_id}/watch"
 | 
			
		||||
            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())),
 | 
			
		||||
            }
 | 
			
		||||
            http_client.request(method="POST", endpoint=url, json=body).raise_for_status()
 | 
			
		||||
		Reference in New Issue
	
	Block a user