def choisir_liste_attente(request): """On ne peut que choisir des ditributions dont les créneaux sont tous pleins et dont la liste d'attente n'est pas pleine (condition codée dans le fichier forms.py). On vérifie maintenant que l'utilisateur ne s'est pas déjà inscrit à un créneau aujourd'hui et qu'il n'est pas déjà inscrit dans la liste d'attente de la distribution qu'il a choisie.""" if request.method == "POST": form = ChoixAttenteForm(request.POST) if form.is_valid(): choix = form.cleaned_data.get('choix') inscription_attente = InscriptionAttente(distribution=choix, beneficiaire=request.user) distribution_attente = choix inscription_creneau_actuelle = InscriptionCreneau.objects \ .filter(beneficiaire=request.user) \ .filter(creneau_horaire__distribution=distribution_attente) \ .count() inscription_attente_actuelle = InscriptionAttente.objects \ .filter(beneficiaire=request.user) \ .filter(distribution=distribution_attente) \ .count() if not inscription_creneau_actuelle and not inscription_attente_actuelle: if creneaux_tous_complets(distribution_attente): inscription_attente.save() return reponse(request, "Vous avez bien été inscrit sur la file d'attente.") else: return reponse(request, "Il reste des créneaux libres pour cette distribution !") elif inscription_creneau_actuelle: return reponse(request, "Vous êtes déjà inscrit à un créneau horaire pour récupérer un colis ce jour-là.") elif inscription_attente_actuelle: return reponse(request, "Vous êtes déjà inscrit sur cette liste d'attente.") else: form = ChoixAttenteForm() return render(request, 'inscription_file_attente.html', {'form': form})
def modifier_profil(request): """Attention, ne fonctionne pas si le bénéficaire associé à l'utilisateur n'a pas été défini""" nom = request.user.username sexe = request.user.beneficiaire.sexe if request.method == "POST": form = ProfilForm(instance=request.user.beneficiaire, data=request.POST) if form.is_valid(): form.save() return reponse(request, "Vos modifications ont bien été prises en compte.") else: return reponse(request, "Formulaire invalide. Veuillez réessayer.") else: form = ProfilForm() return render(request, 'modifier_profil.html', {'form': form, 'sexe': sexe, 'nom': nom})
def choisir_creneau(request): """décommenter la ligne envoyer_mail(request, objet_mail, contenu_mail) pour envoyer les mails automatiques de confirmation.""" if request.method == "POST": form = ChoixCreneauForm(request.POST) if form.is_valid(): choix = form.cleaned_data.get('choix') inscription = InscriptionCreneau(creneau_horaire=choix, beneficiaire=request.user) date_inscription = inscription.creneau_horaire.date_heure_debut.date() distribution_actuelle = choix.distribution if distribution_actuelle.reservations_prioritaires: # On teste d'abord si l'utilisateur est prioritaire. distribution_precedente = distribution_actuelle.liste_prioritaire inscriptions_attente_actuelles = InscriptionAttente.objects \ .filter(beneficiaire=request.user) \ .filter(distribution=distribution_precedente) if inscriptions_attente_actuelles: utilisateur_prioritaire = True else: utilisateur_prioritaire = False else: utilisateur_prioritaire = True # si les inscriptions sont ouvertes pour tout le monde, tous les utilisateurs sont prioritaires. if not utilisateur_prioritaire: return reponse(request, """Les inscriptions sont actuellement réservées aux personnes qui sont inscrites sur la liste d'attente. Vous n'en faites pas partie.""") else: inscriptions_actuelles = InscriptionCreneau.objects \ .filter(beneficiaire=request.user) \ .filter(creneau_horaire__date_heure_debut__date=date_inscription) \ .count() if not inscriptions_actuelles: inscription.save() for inscription_attente in InscriptionAttente.objects \ .filter(beneficiaire=request.user) \ .filter(distribution__date=date_inscription): inscription_attente.delete() contenu_mail = texte_mail_inscription(request.user.username, inscription) objet_mail = 'Inscription créneau épicerINT' # envoyer_mail(request, objet_mail, contenu_mail) return reponse(request, "Votre choix a bien été enregistré.") else: return reponse(request, "Vous êtes déjà inscrit à un créneau ce jour-là") else: form = ChoixCreneauForm() return render(request, 'creneaux_disponibles.html', {'form': form})
def planning_colis_a_livrer(request): liste_dates = [] liste_nombre_colis_maximum = [] liste_nombre_colis_total = [] liste_nombre_colis_femme = [] liste_nombre_colis_homme = [] liste_nombre_maximal_beneficiaires_attente = [] liste_nombre_beneficiaires_attente = [] distributions = reversed(Distribution.objects.all().order_by('-date')) if distributions: for distribution in distributions: nombre_maximal_beneficiaires_attente = distribution.nombre_maximal_inscriptions_file_attente nombre_beneficiaires_attente = InscriptionAttente.objects \ .filter(distribution=distribution) \ .count() nombre_inscriptions_homme_journee = InscriptionCreneau.objects \ .filter(creneau_horaire__distribution=distribution) \ .filter(beneficiaire__beneficiaire__sexe='masculin') \ .count() nombre_inscriptions_femme_journee = InscriptionCreneau.objects \ .filter(creneau_horaire__distribution=distribution) \ .filter(beneficiaire__beneficiaire__sexe='féminin') \ .count() nombre_inscriptions_total_journee = nombre_inscriptions_homme_journee + nombre_inscriptions_femme_journee nombre_colis_maximum = 0 for creneau in distribution.creneaux.all(): nombre_colis_maximum += creneau.nombre_maximal_inscriptions liste_dates.append(distribution) liste_nombre_colis_maximum.append(nombre_colis_maximum) liste_nombre_colis_femme.append(nombre_inscriptions_femme_journee) liste_nombre_colis_homme.append(nombre_inscriptions_homme_journee) liste_nombre_colis_total.append(nombre_inscriptions_total_journee) liste_nombre_maximal_beneficiaires_attente.append( nombre_maximal_beneficiaires_attente) liste_nombre_beneficiaires_attente.append( nombre_beneficiaires_attente) return render( request, 'planning_colis.html', { 'liste_date_colis': zip(liste_dates, liste_nombre_colis_maximum, liste_nombre_colis_total, liste_nombre_colis_femme, liste_nombre_colis_homme, liste_nombre_maximal_beneficiaires_attente, liste_nombre_beneficiaires_attente) }) else: return reponse(request, "Aucune distribution n'a été prévue pour le moment.")
def desinscription_liste_attente(request): inscriptions_liste_attente = request.user.inscriptions_file_attente.all() if request.method == "POST": form = DesinscriptionListeAttenteForm(request.POST) if form.is_valid(): quitter_liste_attente = form.cleaned_data.get('supprimer_mon_inscription') if quitter_liste_attente: for inscription_file_attente in inscriptions_liste_attente: if inscription_file_attente.distribution.date >= timezone.now().date(): inscription_file_attente.delete() return render(request, 'mes_attentes.html') else: return render(request, 'mes_attentes.html', {'form': form, 'inscriptions_liste_attente': inscriptions_liste_attente}) else: return reponse(request, "Formulaire invalide. Veuillez réessayer.") else: form = DesinscriptionListeAttenteForm() return render(request, 'mes_attentes.html', {'form': form, 'inscriptions_liste_attente': inscriptions_liste_attente})
def annuler_rdv(request): """Décommenter la ligne envoyer_mail(request, objet_mail, contenu_mail) pour envoyer un mail automatique.""" rdvs_utilisateur = request.user.rdvs.all() if request.method == "POST": form = AnnulerRdvForm(request.POST) if form.is_valid(): annulation_rdv = form.cleaned_data.get('annuler_mes_rdv') if annulation_rdv: objet_mail = 'Désinscription créneaux épicerINT' contenu_mail = texte_mail_desinscription(request.user.username) # envoyer_mail(request, objet_mail, contenu_mail) for rdv_utilisateur in rdvs_utilisateur: if rdv_utilisateur.creneau_horaire.date_heure_debut > timezone.now(): rdv_utilisateur.delete() return render(request, 'mon_rdv.html') else: return render(request, 'mon_rdv.html', {'form': form, 'rdvs_utilisateur': rdvs_utilisateur}) else: return reponse(request, "Formulaire invalide. Veuillez réessayer.") else: form = AnnulerRdvForm() return render(request, 'mon_rdv.html', {'form': form, 'rdvs_utilisateur': rdvs_utilisateur})
def creer_creneaux(request): if request.method == "POST": form = CreneauForm(request.POST) if form.is_valid(): date_heure_debut = form.cleaned_data.get('date_heure_debut') duree = form.cleaned_data.get('duree_en_minutes') nombre_maximal_inscriptions = form.cleaned_data.get( 'nombre_maximal_inscriptions') nombre_maximal_inscriptions_file_attente = form.cleaned_data.get( 'nombre_maximal_inscriptions_file_attente') nombre_creneaux = form.cleaned_data.get('nombre_creneaux') distribution_existante = Distribution.objects.filter( date=date_heure_debut.date()) if not distribution_existante: distribution_precedente = Distribution.objects \ .filter(date__lt=date_heure_debut.date()) distribution_suivante = Distribution.objects \ .filter(date__gt=date_heure_debut.date()) if not distribution_precedente and not distribution_suivante: distribution = Distribution( date=date_heure_debut.date(), nombre_maximal_inscriptions_file_attente= nombre_maximal_inscriptions_file_attente, reservations_prioritaires=False) elif not distribution_precedente and distribution_suivante: distribution = Distribution( date=date_heure_debut.date(), nombre_maximal_inscriptions_file_attente= nombre_maximal_inscriptions_file_attente, reservations_prioritaires=False) distribution.save() distribution_suivante_la_plus_proche = distribution_suivante.order_by( '-date').last() distribution_suivante_la_plus_proche.liste_prioritaire = distribution distribution_suivante_la_plus_proche.save() elif distribution_precedente and distribution_suivante: distribution = Distribution( date=date_heure_debut.date(), nombre_maximal_inscriptions_file_attente= nombre_maximal_inscriptions_file_attente, reservations_prioritaires=False) distribution.save() distribution_suivante_la_plus_proche = distribution_suivante.order_by( '-date').last() distribution_suivante_la_plus_proche.liste_prioritaire = distribution distribution_suivante_la_plus_proche.save() distribution.liste_prioritaire = distribution_precedente.order_by( '-date').first() else: # i.e. distribution_precedente and not distribution_suivante distribution_precedente_la_plus_recente = distribution_precedente.order_by( '-date').first() distribution = Distribution( date=date_heure_debut.date(), nombre_maximal_inscriptions_file_attente= nombre_maximal_inscriptions_file_attente, reservations_prioritaires=False, liste_prioritaire= distribution_precedente_la_plus_recente) distribution.save() else: distribution = Distribution.objects.get( date=date_heure_debut.date()) creer_creneaux_automatiquement(distribution, date_heure_debut, duree, nombre_creneaux, nombre_maximal_inscriptions) return reponse( request, f"""Avec ce planning, {nombre_creneaux * nombre_maximal_inscriptions} colis devront êtres distribués.""") else: return reponse(request, "Le formulaire est invalide.") else: form = CreneauForm() return render(request, 'creer_creneaux.html', {'form': form})