ajoute le stockage S3 des devoirs maison (bloc B, dernier chantier)
Dépôt de fichier en plus du texte libre pour les devoirs maison, stocké sur Hetzner Object Storage (jamais sur le disque du serveur), masqué côté élève tant que le bucket n'est pas configuré. Purge RGPD étendue pour supprimer aussi les fichiers d'Object Storage. Ansible lit les identifiants depuis un fichier que seul Adam peut créer sur le serveur (runbook docs/runbooks/stockage-s3.md) ; le bloc B du CLAUDE.md est maintenant complet. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
parent
79d4a06fdf
commit
6ea7a1cc16
16 changed files with 1022 additions and 59 deletions
|
|
@ -26,14 +26,26 @@
|
|||
<p class="mt-2 font-semibold text-[#5f6368]">Rendu le {{ $rendu->rendu_a->timezone(config('app.fuseau_utilisateurs'))->translatedFormat('d/m/Y H:i') }}. Un nouvel envoi remplace celui-ci{{ $devoir->echeanceDepassee() ? '' : ', jusqu\'à l\'échéance' }}.</p>
|
||||
@endif
|
||||
@error('reponse')<p class="mt-2 font-bold text-[#A63D2A]">{{ $message }}</p>@enderror
|
||||
@error('fichier')<p class="mt-2 font-bold text-[#A63D2A]">{{ $message }}</p>@enderror
|
||||
@if ($rendu && $rendu->aUnFichier())
|
||||
<p class="mt-2 font-semibold text-[#5f6368]">Fichier déjà envoyé : {{ $rendu->fichier_nom_original }}</p>
|
||||
@endif
|
||||
@if (! $devoir->echeanceDepassee())
|
||||
<form action="{{ route('devoirs.eleve.rendre', $devoir) }}" method="post" class="mt-4 grid gap-3">
|
||||
<form action="{{ route('devoirs.eleve.rendre', $devoir) }}" method="post" enctype="multipart/form-data" class="mt-4 grid gap-3">
|
||||
@csrf
|
||||
<textarea name="reponse" required rows="8" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold">{{ old('reponse', $rendu->reponse ?? '') }}</textarea>
|
||||
<textarea name="reponse" rows="8" class="rounded-xl border border-[#c4c7c5] bg-white px-3 py-2 font-semibold" placeholder="Ta réponse (facultatif si tu joins un fichier)">{{ old('reponse', $rendu->reponse ?? '') }}</textarea>
|
||||
@if ($depotFichierDisponible)
|
||||
<label class="font-bold">
|
||||
Joindre un fichier (facultatif)
|
||||
<input type="file" name="fichier" class="mt-1 block font-semibold">
|
||||
</label>
|
||||
@endif
|
||||
<button type="submit" class="mt-2 inline-flex h-11 w-fit items-center rounded-full bg-black px-5 font-bold text-white">Envoyer</button>
|
||||
</form>
|
||||
@elseif ($rendu)
|
||||
<p class="mt-4 whitespace-pre-wrap font-semibold">{{ $rendu->reponse }}</p>
|
||||
@if ($rendu->reponse)
|
||||
<p class="mt-4 whitespace-pre-wrap font-semibold">{{ $rendu->reponse }}</p>
|
||||
@endif
|
||||
@endif
|
||||
</section>
|
||||
@endif
|
||||
|
|
|
|||
|
|
@ -32,7 +32,14 @@
|
|||
@endif
|
||||
</div>
|
||||
@if ($rendu)
|
||||
<p class="mt-3 whitespace-pre-wrap rounded-xl border border-[#e3e5e8] bg-[#f8f9fa] p-4 font-semibold">{{ $rendu->reponse }}</p>
|
||||
@if ($rendu->reponse)
|
||||
<p class="mt-3 whitespace-pre-wrap rounded-xl border border-[#e3e5e8] bg-[#f8f9fa] p-4 font-semibold">{{ $rendu->reponse }}</p>
|
||||
@endif
|
||||
@if ($rendu->aUnFichier())
|
||||
<a href="{{ route('mes-classes.devoirs.telecharger', [$classe, $devoir, $rendu]) }}" class="mt-3 inline-flex items-center gap-2 rounded-xl border border-[#e3e5e8] bg-[#f8f9fa] px-4 py-2 font-bold underline underline-offset-4">
|
||||
Fichier : {{ $rendu->fichier_nom_original }} ({{ number_format($rendu->fichier_taille_octets / 1024, 0) }} Ko)
|
||||
</a>
|
||||
@endif
|
||||
<form action="{{ route('mes-classes.devoirs.noter', [$classe, $devoir, $rendu]) }}" method="post" class="mt-3 flex items-center gap-2">
|
||||
@csrf
|
||||
<label class="font-bold">Note <input type="number" name="note" min="0" max="20" value="{{ $rendu->note }}" class="w-20 rounded-xl border border-[#c4c7c5] bg-white px-2 py-1 font-semibold"> / 20</label>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue