mirror of
				https://gitlab.com/animath/si/plateforme.git
				synced 2025-10-31 19:04:33 +01:00 
			
		
		
		
	Export notes on Google Sheet automatically
Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr>
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| # Copyright (C) 2020 by Animath | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| import asyncio | ||||
| from datetime import date | ||||
| import os | ||||
|  | ||||
| @@ -15,6 +16,7 @@ from django.utils.crypto import get_random_string | ||||
| from django.utils.text import format_lazy | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| import gspread | ||||
| from django.views.debug import ExceptionReporter | ||||
| from gspread.utils import a1_range_to_grid_range, MergeType | ||||
| from registration.models import Payment, VolunteerRegistration | ||||
| from tfjm.lists import get_sympa_client | ||||
| @@ -736,7 +738,7 @@ class Pool(models.Model): | ||||
|         format_requests = [] | ||||
|  | ||||
|         # Merge cells | ||||
|         merge_cells = ["A1:B1"] | ||||
|         merge_cells = ["A1:B1", "A2:B2", "A3:B3"] | ||||
|         for i, passage in enumerate(passages): | ||||
|             merge_cells.append(f"{getcol(3 + i * passage_width)}1:{getcol(2 + passage_width + i * passage_width)}1") | ||||
|  | ||||
| @@ -1262,6 +1264,28 @@ class Note(models.Model): | ||||
|         self.reporter_oral = reporter_oral | ||||
|         self.observer_oral = observer_oral | ||||
|  | ||||
|     def update_spreadsheet(self): | ||||
|         gc = gspread.service_account_from_dict(settings.GOOGLE_SERVICE_CLIENT) | ||||
|         passage = Passage.objects.prefetch_related('pool__tournament', 'pool__participations').get(pk=self.passage.pk) | ||||
|         spreadsheet_id = passage.pool.tournament.notes_sheet_id | ||||
|         spreadsheet = gc.open_by_key(spreadsheet_id) | ||||
|         worksheet = spreadsheet.worksheet(f"Poule {passage.pool.short_name}") | ||||
|         jury_id_cell = worksheet.find(str(self.jury_id), in_column=2) | ||||
|         if not jury_id_cell: | ||||
|             raise ValueError("The jury ID cell was not found in the spreadsheet.") | ||||
|         jury_row = jury_id_cell.row | ||||
|         passage_width = 7 if passage.pool.participations.count() == 4 else 6 | ||||
|  | ||||
|         def getcol(number: int) -> str: | ||||
|             if number == 0: | ||||
|                 return '' | ||||
|             return getcol((number - 1) // 26) + chr(65 + (number - 1) % 26) | ||||
|  | ||||
|         min_col = getcol(3 + (self.passage.position - 1) * passage_width) | ||||
|         max_col = getcol(3 + self.passage.position * passage_width - 1) | ||||
|  | ||||
|         worksheet.update([list(self.get_all())], f"{min_col}{jury_row}:{max_col}{jury_row}") | ||||
|  | ||||
|     def get_absolute_url(self): | ||||
|         return reverse_lazy("participation:passage_detail", args=(self.passage.pk,)) | ||||
|  | ||||
| @@ -1272,6 +1296,10 @@ class Note(models.Model): | ||||
|     def has_any_note(self): | ||||
|         return any(self.get_all()) | ||||
|  | ||||
|     def save(self, *args, **kwargs): | ||||
|         super().save(*args, **kwargs) | ||||
|         self.update_spreadsheet() | ||||
|  | ||||
|     def __str__(self): | ||||
|         return _("Notes of {jury} for {passage}").format(jury=self.jury, passage=self.passage) | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user