تصحيح استخراج البيانات

ChatGPT Alger

عضو نشيط
المشاركات
72
مستوى التفاعل
3
النقاط
6
@app.route('/submit', methods=['POST']) def submit(): try: # Récupération des données du demandeur nom = request.form.get('demandeur_nom', '').strip() print(f"Nom du demandeur: {nom}") prenom = request.form.get('demandeur_prenom') print(f"Prénom du demandeur: {prenom}") type_demandeur = request.form.get('demandeur_type') print(f"Type de demandeur: {type_demandeur}") # Validation des champs obligatoires if not nom or not prenom or not type_demandeur: print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires") return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400 if type_demandeur not in TypeDemandeur.__members__: print(f"Erreur: Type de demandeur invalide: {type_demandeur}") return "Type de demandeur invalide", 400 # Vérification si le demandeur existe déjà existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first() if existing_demandeur: print(f"Erreur: Demandeur déjà existant: {existing_demandeur}") return "Demandeur déjà existant", 400 # Création du nouveau demandeur new_demandeur = Demandeur( nom=nom, prenom=prenom, type_demandeur=TypeDemandeur[type_demandeur] ) print(f"Nouveau demandeur créé: {new_demandeur}") db.session.add(new_demandeur) db.session.commit() print("Demandeur enregistré dans la base de données") # Redirection après succès print("Redirection vers la page d'accueil") return redirect(url_for('index')) except Exception as e: db.session.rollback() print(f"Erreur lors de l'enregistrement : {str(e)}") return f"Erreur lors de l'enregistrement : {str(e)}", 500 ;;; <a><p>يرجى ملء الإستمارة بتمعن </p> <form id="road-permit-form" method="POST" action="{{ url_for('submit') }}"> <div class="row"> <div class="col-md-12"> <div class="card"> <div class="card-header"> <h5 class="card-title">المعلومات الشخصية للمستفيد</h5> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-4"> <label for="optionsRadios">هل أنت:</label> <select class="form-control" id="optionsRadios" name="optionsRadios"> <option value="فرد" selected>فرد</option> <option value="مقاول">مقاول</option> <option value="شركة">شركة</option> <option value="الخدمة العامة">الخدمة العامة</option> </select> </div> <div class="form-group col-md-4"> <label for="nom" style="font-weight:600;">الاسم</label> <input type="text" class="form-control" id="demandeur_nom" name="demandeur_nom" placeholder="أدخل اسمك"> </div> <div class="form-group col-md-4"> <label for="prenom" style="font-weight:600;">اللقب</label> <input type="text" class="form-control" id="demandeur_prenom" name="demandeur_prenom" placeholder="أدخل لقبك"> </div> </div> </div> </div> </div> </div> <a><p>يرجى ملء الإستمارة بتمعن </p> <form id="road-permit-form" method="POST" action="{{ url_for('submit') }}"> <div class="row"> <div class="col-md-12"> <div class="card"> <div class="card-header"> <h5 class="card-title">المعلومات الشخصية للمستفيد</h5> </div> <div class="card-body"> <div class="row"> <div class="form-group col-md-4"> <label for="optionsRadios">هل أنت:</label> <select class="form-control" id="optionsRadios" name="optionsRadios"> <option value="فرد" selected>فرد</option> <option value="مقاول">مقاول</option> <option value="شركة">شركة</option> <option value="الخدمة العامة">الخدمة العامة</option> </select> </div> <div class="form-group col-md-4"> <label for="nom" style="font-weight:600;">الاسم</label> <input type="text" class="form-control" id="demandeur_nom" name="demandeur_nom" placeholder="أدخل اسمك"> </div> <div class="form-group col-md-4"> <label for="prenom" style="font-weight:600;">اللقب</label> <input type="text" class="form-control" id="demandeur_prenom" name="demandeur_prenom" placeholder="أدخل لقبك"> </div> </div> </div> </div> </div> </div> ;;;127.0.0.1 - - [03/Mar/2025 10:29:32] "GET /static/assets/js/plugin/chartist/plugin/chartist-plugin-tooltip.min.js.map HTTP/1.1" 404 - 127.0.0.1 - - [03/Mar/2025 10:29:32] "GET /static/assets/js/plugin/bootstrap-toggle/bootstrap-toggle.min.js.map HTTP/1.1" 404 - Nom du demandeur: Khaouni Prénom du demandeur: Aicha Type de demandeur: None Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires 127.0.0.1 - - [03/Mar/2025 10:29:34] "POST /submit HTTP/1.1" 400 -

قال ChatGPT:​

Le problème ici réside dans la manière dont les données sont envoyées à votre serveur.
Lors de l'envoi du formulaire, la valeur de type_demandeur est envoyée avec le nom optionsRadios, mais dans votre code, vous récupérez la valeur avec request.form.get('demandeur_type').
Solution :
Dans votre formulaire HTML, vous devez vous assurer que le champ type_demandeur correspond bien à ce qui est récupéré dans le backend. Il semble que le champ name de votre select soit optionsRadios, donc vous devez ajuster votre code pour récupérer la valeur de ce champ avec request.form.get('optionsRadios').
Voici le code modifié pour cela :

HTML :​

html
نسختحرير
<select class="form-control" id="optionsRadios" name="optionsRadios">
<option value="فرد" selected>فرد</option>
<option value="مقاول">مقاول</option>
<option value="شركة">شركة</option>
<option value="الخدمة العامة">الخدمة العامة</option>
</select>

Python (Backend) :​

python
نسختحرير
type_demandeur = request.form.get('optionsRadios')

Récapitulatif :​

  1. Changez la récupération de type_demandeur pour correspondre au nom du champ optionsRadios.
  2. Assurez-vous que le formulaire envoie bien les données sous cette forme.
Cela devrait résoudre l'erreur "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires" et permettre au backend de recevoir correctement la valeur de type_demandeur.

4o

أنت قلت:​

class TypeDemandeur(PyEnum): particulier = "Particulier" service_public = "Service public" maitre_oeuvre = "Maître d’œuvre" entreprise = "Entreprise" @app.route('/') def form(): return render_template('dash/forms.html') :127.0.0.1 - - [03/Mar/2025 10:32:48] "GET /static/assets/js/plugin/chartist/chartist.min.js.map HTTP/1.1" 404 - 127.0.0.1 - - [03/Mar/2025 10:32:48] "GET /static/assets/js/plugin/bootstrap-toggle/bootstrap-toggle.min.js.map HTTP/1.1" 404 - Nom du demandeur: Khaouni Prénom du demandeur: Aicha Type de demandeur: Particulier Erreur: Type de demandeur invalide: Particulier 127.0.0.1 - - [03/Mar/2025 10:32:53] "POST /submit HTTP/1.1" 400 - @app.route('/submit', methods=['POST']) def submit(): try: # Récupération des données du demandeur nom = request.form.get('demandeur_nom', '').strip() print(f"Nom du demandeur: {nom}") prenom = request.form.get('demandeur_prenom') print(f"Prénom du demandeur: {prenom}") type_demandeur = request.form.get('optionsRadios') print(f"Type de demandeur: {type_demandeur}") # Validation des champs obligatoires if not nom or not prenom or not type_demandeur: print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires") return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400 if type_demandeur not in TypeDemandeur.__members__: print(f"Erreur: Type de demandeur invalide: {type_demandeur}") return "Type de demandeur invalide", 400 # Vérification si le demandeur existe déjà existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first() if existing_demandeur: print(f"Erreur: Demandeur déjà existant: {existing_demandeur}") return "Demandeur déjà existant", 400 # Création du nouveau demandeur new_demandeur = Demandeur( nom=nom, prenom=prenom, type_demandeur=TypeDemandeur[type_demandeur] ) print(f"Nouveau demandeur créé: {new_demandeur}") db.session.add(new_demandeur) db.session.commit() print("Demandeur enregistré dans la base de données") # Redirection après succès print("Redirection vers la page d'accueil") return redirect(url_for('index')) except Exception as e: db.session.rollback() print(f"Erreur lors de l'enregistrement : {str(e)}") return f"Erreur lors de l'enregistrement : {str(e)}", 500

قال ChatGPT:​

L'erreur que vous rencontrez indique que la valeur récupérée pour type_demandeur dans votre formulaire (ici "Particulier") ne correspond pas exactement à l'une des valeurs définies dans l'énumération TypeDemandeur en raison d'un décalage de casse ou d'un autre problème.

Analyse du problème :​

Le champ type_demandeur est récupéré à partir de request.form.get('optionsRadios'), et vous tentez de l'associer à un membre de l'énumération TypeDemandeur. Cependant, la valeur que vous obtenez, "Particulier", est un peu différente de celle dans l'énumération, où la valeur attendue est "particulier" (en minuscules).

Solution :​

Vous devez vous assurer que la valeur récupérée du formulaire est correctement transformée pour correspondre aux membres de l'énumération. Une solution consiste à convertir la valeur en minuscules avant de l'utiliser, comme ceci :

Code Python Modifié :​

python
نسختحرير
@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

# Conversion du type de demandeur en minuscules pour correspondre aux membres de l'énumération
type_demandeur = type_demandeur.lower()

if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")

# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500

Explication des changements :​

  • Transformation en minuscules : Avant de vérifier si type_demandeur est un membre valide de l'énumération, on le convertit en minuscules avec type_demandeur.lower(). Cela garantit que le champ du formulaire "Particulier" sera comparé correctement avec le membre "particulier" de l'énumération.

Vérifications supplémentaires :​

  • Assurez-vous que la valeur type_demandeur est bien passée dans le formulaire (par exemple "Particulier" et non une autre valeur comme None ou une valeur vide).
  • Si d'autres erreurs surviennent, vous pouvez imprimer les valeurs de type_demandeur et de TypeDemandeur.__members__ pour mieux comprendre où la comparaison échoue.
Cela devrait résoudre le problème lié à la comparaison incorrecte des types de demandeurs.

4o

أنت قلت:​

import datetime from flask import Flask, jsonify, request, redirect, render_template import json from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate from sqlalchemy import Column, Integer, String, Boolean, Date, ForeignKey, Enum from sqlalchemy.orm import relationship import enum app = Flask(__name__, static_url_path='/static') app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///autorisation.db' app.config['SECRET_KEY'] = '580594580594' db = SQLAlchemy(app) migrate = Migrate(app, db) from sqlalchemy import Column, Integer, String, Date, Enum, ForeignKey from sqlalchemy.orm import relationship from enum import Enum as PyEnum class Nature_travaux(PyEnum): Sous_accotement = "sous accotement" Sous_voirie = "sous voirie" Sous_trottoir = "sous trottoir" Sous_ouvrage_art = "sous ouvrage d'art" Souterrain = "souterrain" Operateurs_reseaux = "operateurs reseaux" Aérien = "aérien" Autres = "autres" class Type_travaux(PyEnum): Branchement_eau_potable = "Branchement d'eau potable" Branchement_reseau_eaux_usees = "Branchement au reseau des eaux usees" Assainissement_eaux_pluviales = "Assainissement eaux pluviales" Assainissement_eaux_usees = "Assainissement eaux usees" Telecommunication = "Télécommunications" Raccordement_reseau_gaz = "Raccordement au reseau de gaz" Raccordement_electricite = "Raccordement de l'electricite" Autres = "autres" class TypeDemandeur(PyEnum): particulier = "Particulier" service_public = "Service public" maitre_oeuvre = "Maître d’œuvre" entreprise = "Entreprise" class Demandeur(db.Model): __tablename__ = 'demandeurs' id = Column(Integer, primary_key=True, autoincrement=True) nom = Column(String, nullable=False) prenom = Column(String, nullable=False) date_Naissance = Column(Date, nullable=True) lieuNaissance = Column(String, nullable=True) sexe = Column(String, nullable=True) adresse = Column(String, nullable=True) telephone = Column(String, nullable=True) fax = Column(String, nullable=True) email = Column(String, nullable=True) type_demandeur = Column(Enum(TypeDemandeur), nullable=False) travaux = relationship('Travaux', backref='demandeur') class Travaux(db.Model): __tablename__ = 'travaux' id = Column(Integer, primary_key=True, autoincrement=True) Pièces_jointes = Column(String, nullable=True) type_travaux = Column(Enum(Type_travaux), nullable=True) Nature_travaux = Column(Enum(Nature_travaux), nullable=True) # Corrected to Nature_travaux pk_debut = Column(Integer, nullable=True) pk_fin = Column(Integer, nullable=True) profondeur = Column(Integer, nullable=True) date_debut = Column(Date, nullable=True) duree_travaux = Column(Integer, nullable=True) demandeur_id = Column(Integer, ForeignKey('demandeurs.id'), nullable=False) def set_pieces_jointes(self, pieces): self.Pièces_jointes = ",".join(pieces) def get_pieces_jointes(self): return self.Pièces_jointes.split(",") if self.Pièces_jointes else [] class Contractant(db.Model): __tablename__ = 'contractant' id = Column(Integer, primary_key=True, autoincrement=True) NIF = Column(String, nullable=True) nombres_ilots = Column(Integer, nullable=True) nom = Column(String, nullable=False) prenom = Column(String, nullable=False) nom_bureau_etude = Column(String, nullable=True) adresse = Column(String, nullable=True) telephone = Column(String, nullable=True) fax = Column(String, nullable=True) email = Column(String, nullable=True) @app.route('/') def form(): return render_template('dash/forms.html') @app.route('/submit', methods=['POST']) @app.route('/submit', methods=['POST']) def submit(): try: # Récupération des données du demandeur nom = request.form.get('demandeur_nom', '').strip() print(f"Nom du demandeur: {nom}") prenom = request.form.get('demandeur_prenom') print(f"Prénom du demandeur: {prenom}") type_demandeur = request.form.get('optionsRadios') print(f"Type de demandeur: {type_demandeur}") # Validation des champs obligatoires if not nom or not prenom or not type_demandeur: print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires") return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400 # Conversion du type de demandeur en minuscules pour correspondre aux membres de l'énumération type_demandeur = type_demandeur.lower() if type_demandeur not in TypeDemandeur.__members__: print(f"Erreur: Type de demandeur invalide: {type_demandeur}") return "Type de demandeur invalide", 400 # Vérification si le demandeur existe déjà existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first() if existing_demandeur: print(f"Erreur: Demandeur déjà existant: {existing_demandeur}") return "Demandeur déjà existant", 400 # Création du nouveau demandeur new_demandeur = Demandeur( nom=nom, prenom=prenom, type_demandeur=TypeDemandeur[type_demandeur] ) print(f"Nouveau demandeur créé: {new_demandeur}") db.session.add(new_demandeur) db.session.commit() print("Demandeur enregistré dans la base de données") # Redirection après succès print("Redirection vers la page d'accueil") return redirect(url_for('index')) except Exception as e: db.session.rollback() print(f"Erreur lors de l'enregistrement : {str(e)}") return f"Erreur lors de l'enregistrement : {str(e)}", 500 with open('moock_test.json') as f: db_geocoding = json.load(f) @app.route('/reverseGeocoding', methods=['GET']) def reverse_geocoding(): lat = request.args.get('lat') lon = request.args.get('lon') location_key = f"{lat},{lon}" if location_key in db_geocoding['reverseGeocoding']: return jsonify(db_geocoding['reverseGeocoding'][location_key]) else: return jsonify({'error': 'Coordinates not found'}), 404 if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=3000)

قال ChatGPT:​

Votre code présente une implémentation de plusieurs fonctionnalités dans une application Flask, mais il y a quelques points à corriger ou optimiser. Je vais vous donner des conseils et clarifications sur les problèmes potentiels, notamment au niveau de la gestion des données de formulaire, de la création de nouveaux demandeurs, et de la validation des entrées.

1. Erreur liée à la casse des valeurs Enum

Vous avez mentionné précédemment une erreur où la valeur Particulier ne correspondait pas à la valeur attendue dans l'énumération TypeDemandeur. Voici un ajustement que vous avez déjà commencé, mais quelques améliorations supplémentaires sont nécessaires.
  • Lors de la réception de la valeur de optionsRadios, vous effectuez une conversion en minuscules, mais cela ne correspond toujours pas à la structure de l'énumération qui a des majuscules et minuscules spécifiques. Une meilleure approche serait de ne pas modifier la casse des valeurs de l'énumération ou de faire correspondre directement les valeurs sans conversion de casse.

2. Simplification de la conversion de type_demandeur

Si vous avez besoin de faire correspondre la valeur au format correct dans l'énumération, vous pouvez utiliser une approche plus directe. Il suffira de comparer directement sans conversion en minuscules.
Voici une version améliorée de la validation et de la création du demandeur :
python
نسختحرير
@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

# Vérification de la validité du type_demandeur
if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur] # Pas de conversion nécessaire ici
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")

# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500

3. Gestion de l'énumération TypeDemandeur dans le formulaire

Il est important que les valeurs envoyées depuis le formulaire correspondent aux valeurs définies dans l'énumération TypeDemandeur. Assurez-vous que le formulaire HTML contient les bonnes options et que la valeur de optionsRadios est correctement envoyée et correspond bien à l'une des clés de l'énumération (comme 'particulier', 'service_public', etc.). Exemple d'un formulaire :
 

ChatGPT Alger

عضو نشيط
المشاركات
72
مستوى التفاعل
3
النقاط
6
@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('demandeur_type')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400


# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")


# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500 ;;; <a><p>يرجى ملء الإستمارة بتمعن </p>
<form id="road-permit-form" method="POST" action="{{ url_for('submit') }}">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h5 class="card-title">المعلومات الشخصية للمستفيد</h5>
</div>
<div class="card-body">
<div class="row">
<div class="form-group col-md-4">
<label for="optionsRadios">هل أنت:</label>
<select class="form-control" id="optionsRadios" name="optionsRadios">
<option value="فرد" selected>فرد</option>
<option value="مقاول">مقاول</option>
<option value="شركة">شركة</option>
<option value="الخدمة العامة">الخدمة العامة</option>
</select>
</div>

<div class="form-group col-md-4">
<label for="nom" style="font-weight:600;">الاسم</label>
<input type="text" class="form-control" id="demandeur_nom" name="demandeur_nom" placeholder="أدخل اسمك">
</div>

<div class="form-group col-md-4">
<label for="prenom" style="font-weight:600;">اللقب</label>
<input type="text" class="form-control" id="demandeur_prenom" name="demandeur_prenom" placeholder="أدخل لقبك">
</div>
</div>



</div>
</div>
</div>
</div>

<a><p>يرجى ملء الإستمارة بتمعن </p>
<form id="road-permit-form" method="POST" action="{{ url_for('submit') }}">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h5 class="card-title">المعلومات الشخصية للمستفيد</h5>
</div>
<div class="card-body">
<div class="row">
<div class="form-group col-md-4">
<label for="optionsRadios">هل أنت:</label>
<select class="form-control" id="optionsRadios" name="optionsRadios">
<option value="فرد" selected>فرد</option>
<option value="مقاول">مقاول</option>
<option value="شركة">شركة</option>
<option value="الخدمة العامة">الخدمة العامة</option>
</select>
</div>

<div class="form-group col-md-4">
<label for="nom" style="font-weight:600;">الاسم</label>
<input type="text" class="form-control" id="demandeur_nom" name="demandeur_nom" placeholder="أدخل اسمك">
</div>

<div class="form-group col-md-4">
<label for="prenom" style="font-weight:600;">اللقب</label>
<input type="text" class="form-control" id="demandeur_prenom" name="demandeur_prenom" placeholder="أدخل لقبك">
</div>
</div>



</div>
</div>
</div>
</div>

;;;127.0.0.1 - - [03/Mar/2025 10:29:32] "GET /static/assets/js/plugin/chartist/plugin/chartist-plugin-tooltip.min.js.map HTTP/1.1" 404 -
127.0.0.1 - - [03/Mar/2025 10:29:32] "GET /static/assets/js/plugin/bootstrap-toggle/bootstrap-toggle.min.js.map HTTP/1.1" 404 -
Nom du demandeur: Khaouni
Prénom du demandeur: Aicha
Type de demandeur: None
Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires
127.0.0.1 - - [03/Mar/2025 10:29:34] "POST /submit HTTP/1.1" 400 -

قال ChatGPT:
Le problème ici réside dans la manière dont les données sont envoyées à votre serveur.

Lors de l'envoi du formulaire, la valeur de type_demandeur est envoyée avec le nom optionsRadios, mais dans votre code, vous récupérez la valeur avec request.form.get('demandeur_type').

Solution :
Dans votre formulaire HTML, vous devez vous assurer que le champ type_demandeur correspond bien à ce qui est récupéré dans le backend. Il semble que le champ name de votre select soit optionsRadios, donc vous devez ajuster votre code pour récupérer la valeur de ce champ avec request.form.get('optionsRadios').

Voici le code modifié pour cela :

HTML :
html
نسخ
تحرير
<select class="form-control" id="optionsRadios" name="optionsRadios">
<option value="فرد" selected>فرد</option>
<option value="مقاول">مقاول</option>
<option value="شركة">شركة</option>
<option value="الخدمة العامة">الخدمة العامة</option>
</select>
Python (Backend) :
python
نسخ
تحرير
type_demandeur = request.form.get('optionsRadios')
Récapitulatif :
Changez la récupération de type_demandeur pour correspondre au nom du champ optionsRadios.
Assurez-vous que le formulaire envoie bien les données sous cette forme.
Cela devrait résoudre l'erreur "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires" et permettre au backend de recevoir correctement la valeur de type_demandeur.







أنت قلت:
class TypeDemandeur(PyEnum):
particulier = "Particulier"
service_public = "Service public"
maitre_oeuvre = "Maître d’œuvre"
entreprise = "Entreprise"

@app.route('/')
def form():
return render_template('dash/forms.html') :127.0.0.1 - - [03/Mar/2025 10:32:48] "GET /static/assets/js/plugin/chartist/chartist.min.js.map HTTP/1.1" 404 -
127.0.0.1 - - [03/Mar/2025 10:32:48] "GET /static/assets/js/plugin/bootstrap-toggle/bootstrap-toggle.min.js.map HTTP/1.1" 404 -
Nom du demandeur: Khaouni
Prénom du demandeur: Aicha
Type de demandeur: Particulier
Erreur: Type de demandeur invalide: Particulier
127.0.0.1 - - [03/Mar/2025 10:32:53] "POST /submit HTTP/1.1" 400 -

@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400


# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")


# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500


قال ChatGPT:
L'erreur que vous rencontrez indique que la valeur récupérée pour type_demandeur dans votre formulaire (ici "Particulier") ne correspond pas exactement à l'une des valeurs définies dans l'énumération TypeDemandeur en raison d'un décalage de casse ou d'un autre problème.

Analyse du problème :
Le champ type_demandeur est récupéré à partir de request.form.get('optionsRadios'), et vous tentez de l'associer à un membre de l'énumération TypeDemandeur. Cependant, la valeur que vous obtenez, "Particulier", est un peu différente de celle dans l'énumération, où la valeur attendue est "particulier" (en minuscules).

Solution :
Vous devez vous assurer que la valeur récupérée du formulaire est correctement transformée pour correspondre aux membres de l'énumération. Une solution consiste à convertir la valeur en minuscules avant de l'utiliser, comme ceci :

Code Python Modifié :
python
نسخ
تحرير
@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

# Conversion du type de demandeur en minuscules pour correspondre aux membres de l'énumération
type_demandeur = type_demandeur.lower()

if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")

# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500
Explication des changements :
Transformation en minuscules : Avant de vérifier si type_demandeur est un membre valide de l'énumération, on le convertit en minuscules avec type_demandeur.lower(). Cela garantit que le champ du formulaire "Particulier" sera comparé correctement avec le membre "particulier" de l'énumération.
Vérifications supplémentaires :
Assurez-vous que la valeur type_demandeur est bien passée dans le formulaire (par exemple "Particulier" et non une autre valeur comme None ou une valeur vide).
Si d'autres erreurs surviennent, vous pouvez imprimer les valeurs de type_demandeur et de TypeDemandeur.__members__ pour mieux comprendre où la comparaison échoue.
Cela devrait résoudre le problème lié à la comparaison incorrecte des types de demandeurs.







أنت قلت:
import datetime
from flask import Flask, jsonify, request, redirect, render_template
import json
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from sqlalchemy import Column, Integer, String, Boolean, Date, ForeignKey, Enum
from sqlalchemy.orm import relationship
import enum

app = Flask(__name__, static_url_path='/static')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///autorisation.db'
app.config['SECRET_KEY'] = '580594580594'
db = SQLAlchemy(app)
migrate = Migrate(app, db)

from sqlalchemy import Column, Integer, String, Date, Enum, ForeignKey
from sqlalchemy.orm import relationship
from enum import Enum as PyEnum


class Nature_travaux(PyEnum):
Sous_accotement = "sous accotement"
Sous_voirie = "sous voirie"
Sous_trottoir = "sous trottoir"
Sous_ouvrage_art = "sous ouvrage d'art"
Souterrain = "souterrain"
Operateurs_reseaux = "operateurs reseaux"
Aérien = "aérien"
Autres = "autres"

class Type_travaux(PyEnum):
Branchement_eau_potable = "Branchement d'eau potable"
Branchement_reseau_eaux_usees = "Branchement au reseau des eaux usees"
Assainissement_eaux_pluviales = "Assainissement eaux pluviales"
Assainissement_eaux_usees = "Assainissement eaux usees"
Telecommunication = "Télécommunications"
Raccordement_reseau_gaz = "Raccordement au reseau de gaz"
Raccordement_electricite = "Raccordement de l'electricite"
Autres = "autres"

class TypeDemandeur(PyEnum):
particulier = "Particulier"
service_public = "Service public"
maitre_oeuvre = "Maître d’œuvre"
entreprise = "Entreprise"


class Demandeur(db.Model):
__tablename__ = 'demandeurs'
id = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String, nullable=False)
prenom = Column(String, nullable=False)
date_Naissance = Column(Date, nullable=True)
lieuNaissance = Column(String, nullable=True)
sexe = Column(String, nullable=True)
adresse = Column(String, nullable=True)
telephone = Column(String, nullable=True)
fax = Column(String, nullable=True)
email = Column(String, nullable=True)
type_demandeur = Column(Enum(TypeDemandeur), nullable=False)
travaux = relationship('Travaux', backref='demandeur')

class Travaux(db.Model):
__tablename__ = 'travaux'
id = Column(Integer, primary_key=True, autoincrement=True)
Pièces_jointes = Column(String, nullable=True)
type_travaux = Column(Enum(Type_travaux), nullable=True)
Nature_travaux = Column(Enum(Nature_travaux), nullable=True) # Corrected to Nature_travaux
pk_debut = Column(Integer, nullable=True)
pk_fin = Column(Integer, nullable=True)
profondeur = Column(Integer, nullable=True)
date_debut = Column(Date, nullable=True)
duree_travaux = Column(Integer, nullable=True)
demandeur_id = Column(Integer, ForeignKey('demandeurs.id'), nullable=False)

def set_pieces_jointes(self, pieces):
self.Pièces_jointes = ",".join(pieces)

def get_pieces_jointes(self):
return self.Pièces_jointes.split(",") if self.Pièces_jointes else []
class Contractant(db.Model):
__tablename__ = 'contractant'
id = Column(Integer, primary_key=True, autoincrement=True)
NIF = Column(String, nullable=True)
nombres_ilots = Column(Integer, nullable=True)
nom = Column(String, nullable=False)
prenom = Column(String, nullable=False)
nom_bureau_etude = Column(String, nullable=True)
adresse = Column(String, nullable=True)
telephone = Column(String, nullable=True)
fax = Column(String, nullable=True)
email = Column(String, nullable=True)

@app.route('/')
def form():
return render_template('dash/forms.html')

@app.route('/submit', methods=['POST'])
@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

# Conversion du type de demandeur en minuscules pour correspondre aux membres de l'énumération
type_demandeur = type_demandeur.lower()

if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")

# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500


with open('moock_test.json') as f:
db_geocoding = json.load(f)



@app.route('/reverseGeocoding', methods=['GET'])
def reverse_geocoding():
lat = request.args.get('lat')
lon = request.args.get('lon')
location_key = f"{lat},{lon}"
if location_key in db_geocoding['reverseGeocoding']:
return jsonify(db_geocoding['reverseGeocoding'][location_key])
else:
return jsonify({'error': 'Coordinates not found'}), 404

if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=3000)
قال ChatGPT:
Votre code présente une implémentation de plusieurs fonctionnalités dans une application Flask, mais il y a quelques points à corriger ou optimiser. Je vais vous donner des conseils et clarifications sur les problèmes potentiels, notamment au niveau de la gestion des données de formulaire, de la création de nouveaux demandeurs, et de la validation des entrées.

1. Erreur liée à la casse des valeurs Enum
Vous avez mentionné précédemment une erreur où la valeur Particulier ne correspondait pas à la valeur attendue dans l'énumération TypeDemandeur. Voici un ajustement que vous avez déjà commencé, mais quelques améliorations supplémentaires sont nécessaires.

Lors de la réception de la valeur de optionsRadios, vous effectuez une conversion en minuscules, mais cela ne correspond toujours pas à la structure de l'énumération qui a des majuscules et minuscules spécifiques. Une meilleure approche serait de ne pas modifier la casse des valeurs de l'énumération ou de faire correspondre directement les valeurs sans conversion de casse.
2. Simplification de la conversion de type_demandeur
Si vous avez besoin de faire correspondre la valeur au format correct dans l'énumération, vous pouvez utiliser une approche plus directe. Il suffira de comparer directement sans conversion en minuscules.

Voici une version améliorée de la validation et de la création du demandeur :

python
نسخ
تحرير
@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom', '').strip()
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

# Vérification de la validité du type_demandeur
if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom,
type_demandeur=TypeDemandeur[type_demandeur] # Pas de conversion nécessaire ici
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")

# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500
3. Gestion de l'énumération TypeDemandeur dans le formulaire
Il est important que les valeurs envoyées depuis le formulaire correspondent aux valeurs définies dans l'énumération TypeDemandeur. Assurez-vous que le formulaire HTML contient les bonnes options et que la valeur de optionsRadios est correctement envoyée et correspond bien à l'une des clés de l'énumération (comme 'particulier', 'service_public', etc.). Exemple d'un formulaire :
 

ChatGPT Alger

عضو نشيط
المشاركات
72
مستوى التفاعل
3
النقاط
6
'service_public', etc.). Exemple d'un formulaire :

html
نسخ
تحرير
<form method="POST" action="/submit">
<label for="optionsRadios">Type de Demandeur:</label>
<input type="radio" name="optionsRadios" value="particulier"> Particulier
<input type="radio" name="optionsRadios" value="service_public"> Service Public
<input type="radio" name="optionsRadios" value="maitre_oeuvre"> Maître d’œuvre
<input type="radio" name="optionsRadios" value="entreprise"> Entreprise
<!-- Autres champs ici -->
</form>
4. Autres améliorations possibles
Vous utilisez request.form.get() pour récupérer les champs, mais vous pourriez également gérer les erreurs au niveau du formulaire pour capturer les erreurs dès la soumission, par exemple en utilisant Flask-WTF pour faciliter la validation et la gestion des erreurs.
Si vous avez des champs supplémentaires dans le formulaire, assurez-vous que les noms des champs dans le formulaire HTML correspondent aux clés dans request.form.get().
5. Prise en charge de l'API de géocodage inversé
La gestion de la géolocalisation dans votre fonction reverse_geocoding() semble correcte. Assurez-vous que votre fichier moock_test.json est bien structuré, et qu'il contient la clé 'reverseGeocoding' pour chaque coordonnée. Par exemple, vérifiez que le format de votre fichier JSON est correct et qu'il contient bien les informations :

json
نسخ
تحرير
{
"reverseGeocoding": {
"48.8566,2.3522": {"city": "Paris", "country": "France"},
"40.7128,-74.0060": {"city": "New York", "country": "USA"}
}
}
Conclusion
En résumé :

Évitez de manipuler la casse des valeurs des énumérations à moins que cela ne soit nécessaire.
Validez le formulaire et les données avant de les insérer dans la base de données.
Utilisez une structure appropriée pour vos champs de formulaire, et assurez-vous que les valeurs sont correctement envoyées et mappées dans votre code Python.
Cela devrait résoudre les problèmes que vous avez rencontrés.







أنت قلت:

# Récupération des données des travaux
nature_travaux = request.form.getlist('nature_travaux[]')
print(f"nature_travaux: {nature_travaux}")
type_travaux = request.form.getlist('type_travaux[]')
print(f"type_travaux: {type_travaux}")
# Conversion des listes en chaînes séparées par des virgules
nature_travaux_str = ", ".join(nature_travaux)
print(f"nature_travaux_str: {nature_travaux_str}")
type_travaux_str = ", ".join(type_travaux_str)
print(f"type_travaux_str: {type_travaux_str}");;;;Email du contractant: None
Bureau d'étude du contractant: lamin
Contractant créé: <Contractant (transient 1976553137488)>
Contractant enregistré dans la base de données
nature_travaux: ['sous_accotement', 'sous_voirie', 'sous_ouvrage_art']
type_travaux: ['branchement_eaux_usees', 'assainissement_pluviales']
nature_travaux_str: sous_accotement, sous_voirie, sous_ouvrage_art
Erreur lors de l'enregistrement : cannot access local variable 'type_travaux_str' where it is not associated with a value
قال ChatGPT:
L'erreur que vous rencontrez, cannot access local variable 'type_travaux_str' where it is not associated with a value, se produit car vous essayez d'utiliser une variable type_travaux_str qui n'a pas été correctement définie avant son utilisation.

Dans votre code, vous faites cette ligne :

python
نسخ
تحرير
type_travaux_str = ", ".join(type_travaux_str)
Cependant, vous essayez de joindre une variable qui n'a pas encore été définie (type_travaux_str). La bonne approche consiste à joindre la liste type_travaux, comme vous l'avez fait pour nature_travaux.

Correction de la ligne
Modifiez cette ligne pour que vous utilisiez correctement la variable type_travaux :

python
نسخ
تحرير
type_travaux_str = ", ".join(type_travaux)
Ainsi, la conversion des listes nature_travaux et type_travaux en chaînes de caractères séparées par des virgules sera correctement effectuée.

Voici le code corrigé :

python
نسخ
تحرير
# Récupération des données des travaux
nature_travaux = request.form.getlist('nature_travaux[]')
print(f"nature_travaux: {nature_travaux}")
type_travaux = request.form.getlist('type_travaux[]')
print(f"type_travaux: {type_travaux}")

# Conversion des listes en chaînes séparées par des virgules
nature_travaux_str = ", ".join(nature_travaux)
print(f"nature_travaux_str: {nature_travaux_str}")
type_travaux_str = ", ".join(type_travaux) # Correction ici
print(f"type_travaux_str: {type_travaux_str}")
Explication
getlist() : Cette fonction permet de récupérer plusieurs valeurs envoyées avec le même nom dans le formulaire. Si vous avez des cases à cocher ou des champs avec des valeurs multiples, getlist() récupère toutes les valeurs sous forme de liste.

join() : Cette méthode permet de convertir une liste en une chaîne de caractères où chaque élément est séparé par une virgule.

Cela résoudra votre erreur et vous permettra de stocker et afficher correctement les valeurs de nature_travaux et type_travaux sous forme de chaînes séparées par des virgules.







أنت قلت:
nature_travaux = request.form.getlist('nature_travaux[]')
print(f"nature_travaux: {nature_travaux}")
type_travaux = request.form.getlist('type_travaux[]')
print(f"type_travaux: {type_travaux}")
nature_travaux_str = ", ".join(nature_travaux)
print(f"nature_travaux_str: {nature_travaux_str}")
type_travaux_str = ", ".join(type_travaux) # Correction ici
print(f"type_travaux_str: {type_travaux_str}")

pk_debut = request.form.get('pk_debut', type=int)
print(f"PK début: {pk_debut}")
pk_fin = request.form.get('pk_fin', type=int)
print(f"PK fin: {pk_fin}")
profondeur = request.form.get('profondeur', type=int)
print(f"Profondeur: {profondeur}")
date_debut_str = request.form.get('date_debut')
print(f"Date de début (chaîne): {date_debut_str}")
duree_travaux = request.form.get('duree_travaux', type=int)
print(f"Durée des travaux: {duree_travaux}")
pieces_jointes = request.form.getlist('pieces_jointes')
print(f"Pièces jointes: {pieces_jointes}")

# Validation des types de travaux
if type_travaux not in Type_travaux.__members__ or nature_travaux not in Nature_travaux.__members__:
print(f"Erreur: Type ou nature de travaux invalide: {type_travaux}, {nature_travaux}")
return "Type ou nature de travaux invalide", 400

# Conversion de la date de début
date_debut = datetime.datetime.strptime(date_debut_str, "%Y-%m-%d").date() if date_debut_str else None
print(f"Date de début (convertie): {date_debut}")

# Création des travaux
new_travaux = Travaux(
type_travaux=type_travaux_str,
Nature_travaux=nature_travaux_str,
pk_debut=pk_debut, pk_fin=pk_fin,
profondeur=profondeur, date_debut=date_debut,
duree_travaux=duree_travaux, demandeur_id=new_demandeur.id,
contractant_id=contractant.id if contractant else None
)
print(f"Nouveau travaux créé: {new_travaux}") :nature_travaux: ['sous_accotement', 'sous_voirie', 'sous_ouvrage_art']
type_travaux: ['branchement_eaux_usees', 'assainissement_pluviales']
nature_travaux_str: sous_accotement, sous_voirie, sous_ouvrage_art
type_travaux_str: branchement_eaux_usees, assainissement_pluviales
PK début: 12
PK fin: 13
Profondeur: 20
Date de début (chaîne):
Durée des travaux: 2
Pièces jointes: []
Erreur lors de l'enregistrement : unhashable type: 'list'
127.0.0.1 - - [03/Mar/2025 11:18:10] "POST /submit HTTP/1.1" 500 -
قال ChatGPT:
L'erreur unhashable type: 'list' provient du fait que vous essayez d'utiliser une liste comme une clé pour un objet qui nécessite des types hashables (comme un dictionnaire ou un set). Dans votre cas, cela semble se produire lorsqu'il y a une tentative de comparaison de votre variable type_travaux ou nature_travaux avec des éléments de l'énumération (Type_travaux et Nature_travaux).

Problème
Lorsque vous récupérez type_travaux et nature_travaux avec getlist(), vous obtenez des listes (et non des chaînes de caractères), et vous essayez de les comparer avec les éléments de l'énumération, ce qui échoue car une liste n'est pas hashable.

Solution
Vous devez modifier votre validation pour que vous compariez chaque élément de la liste type_travaux et nature_travaux avec les membres de l'énumération, et non pas la liste entière.

Voici une solution possible :

Correction de la validation
Modifiez la partie de votre code qui vérifie les éléments des énumérations pour qu'elle vérifie chaque élément de la liste type_travaux et nature_travaux individuellement.

python
نسخ
تحرير
# Validation des types de travaux
if any(t not in Type_travaux.__members__ for t in type_travaux) or any(n not in Nature_travaux.__members__ for n in nature_travaux):
print(f"Erreur: Type ou nature de travaux invalide: {type_travaux}, {nature_travaux}")
return "Type ou nature de travaux invalide", 400
Explication
any() : Cette fonction va vérifier si au moins un élément de la liste type_travaux ou nature_travaux n'est pas dans les membres de l'énumération correspondante.
Type_travaux.__members__ et Nature_travaux.__members__ : Ce sont des dictionnaires qui contiennent tous les membres de l'énumération sous forme de clés. Chaque valeur de type_travaux et nature_travaux doit être un membre valide de l'énumération, et la vérification sera faite sur chaque élément.
Correction complète pour le formulaire
Vous devez aussi vous assurer que vous ne stockez pas directement des listes dans les champs type_travaux et nature_travaux de la base de données, car elles doivent être des chaînes de caractères.

Voici la section du code corrigée avec les changements nécessaires :

python
نسخ
تحرير
# Récupération des données des travaux
nature_travaux = request.form.getlist('nature_travaux[]')
print(f"nature_travaux: {nature_travaux}")
type_travaux = request.form.getlist('type_travaux[]')
print(f"type_travaux: {type_travaux}")

# Conversion des listes en chaînes séparées par des virgules
nature_travaux_str = ", ".join(nature_travaux)
print(f"nature_travaux_str: {nature_travaux_str}")
type_travaux_str = ", ".join(type_travaux) # Correction ici
print(f"type_travaux_str: {type_travaux_str}")

# Validation des types de travaux
if any(t not in Type_travaux.__members__ for t in type_travaux) or any(n not in Nature_travaux.__members__ for n in nature_travaux):
print(f"Erreur: Type ou nature de travaux invalide: {type_travaux}, {nature_travaux}")
return "Type ou nature de travaux invalide", 400

# Récupération des autres données
pk_debut = request.form.get('pk_debut', type=int)
print(f"PK début: {pk_debut}")
pk_fin = request.form.get('pk_fin', type=int)
print(f"PK fin: {pk_fin}")
profondeur = request.form.get('profondeur', type=int)
print(f"Profondeur: {profondeur}")
date_debut_str = request.form.get('date_debut')
print(f"Date de début (chaîne): {date_debut_str}")
duree_travaux = request.form.get('duree_travaux', type=int)
print(f"Durée des travaux: {duree_travaux}")
pieces_jointes = request.form.getlist('pieces_jointes')
print(f"Pièces jointes: {pieces_jointes}")

# Conversion de la date de début
date_debut = datetime.datetime.strptime(date_debut_str, "%Y-%m-%d").date() if date_debut_str else None
print(f"Date de début (convertie): {date_debut}")

# Création des travaux
new_travaux = Travaux(
type_travaux=type_travaux_str,
Nature_travaux=nature_travaux_str,
pk_debut=pk_debut, pk_fin=pk_fin,
profondeur=profondeur, date_debut=date_debut,
duree_travaux=duree_travaux, demandeur_id=new_demandeur.id,
contractant_id=contractant.id if contractant else None
)
print(f"Nouveau travaux créé: {new_travaux}")

# Enregistrement dans la base de données
db.session.add(new_travaux)
db.session.commit()
print("Travaux enregistrés dans la base de données")
Résumé des changements
Validation des types : Vérification de chaque élément dans type_travaux et nature_travaux pour qu'ils soient valides.
Conversion des listes en chaînes : Les listes type_travaux et nature_travaux sont converties en chaînes séparées par des virgules pour correspondre aux champs dans la base de données.
Enregistrement des travaux : Ajout des données dans la base de données après validation et conversion.
Cela devrait résoudre l'erreur et permettre à votre formulaire de fonctionner correctement.







أنت قلت:
import datetime
from flask import Flask, jsonify, request, redirect, render_template
import json
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from sqlalchemy import Column, Integer, String, Boolean, Date, ForeignKey, Enum
from sqlalchemy.orm import relationship
import enum

app = Flask(__name__, static_url_path='/static')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///autorisation.db'
app.config['SECRET_KEY'] = '580594580594'
db = SQLAlchemy(app)
migrate = Migrate(app, db)

from sqlalchemy import Column, Integer, String, Date, Enum, ForeignKey
from sqlalchemy.orm import relationship
from enum import Enum as PyEnum


class Nature_travaux(PyEnum):
Sous_accotement = "sous accotement"
Sous_voirie = "sous voirie"
Sous_trottoir = "sous trottoir"
Sous_ouvrage_art = "sous ouvrage d'art"
Souterrain = "souterrain"
Operateurs_reseaux = "operateurs reseaux"
Aérien = "aérien"
Autres = "autres"

class Type_travaux(PyEnum):
Branchement_eau_potable = "Branchement d'eau potable"
Branchement_reseau_eaux_usees = "Branchement au reseau des eaux usees"
Assainissement_eaux_pluviales = "Assainissement eaux pluviales"
Assainissement_eaux_usees = "Assainissement eaux usees"
Telecommunication = "Télécommunications"
Raccordement_reseau_gaz = "Raccordement au reseau de gaz"
Raccordement_electricite = "Raccordement de l'electricite"
Autres = "autres"

class TypeDemandeur(PyEnum):
particulier = "Particulier"
service_public = "Service public"
maitre_oeuvre = "Maître d’œuvre"
entreprise = "Entreprise"


class Demandeur(db.Model):
__tablename__ = 'demandeurs'
id = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String, nullable=False)
prenom = Column(String, nullable=False)
date_Naissance = Column(Date, nullable=True)
lieuNaissance = Column(String, nullable=True)
sexe = Column(String, nullable=True)
adresse = Column(String, nullable=True)
telephone = Column(String, nullable=True)
fax = Column(String, nullable=True)
email = Column(String, nullable=True)
type_demandeur = Column(Enum(TypeDemandeur), nullable=False)
travaux = relationship('Travaux', backref='demandeur')

class Travaux(db.Model):
__tablename__ = 'travaux'
id = Column(Integer, primary_key=True, autoincrement=True)
Pièces_jointes = Column(String, nullable=True)
type_travaux = Column(Enum(Type_travaux), nullable=True)
Nature_travaux = Column(Enum(Nature_travaux), nullable=True) # Corrected to Nature_travaux
pk_debut = Column(Integer, nullable=True)
pk_fin = Column(Integer, nullable=True)
profondeur = Column(Integer, nullable=True)
date_debut = Column(Date, nullable=True)
duree_travaux = Column(Integer, nullable=True)
demandeur_id = Column(Integer, ForeignKey('demandeurs.id'), nullable=False)

def set_pieces_jointes(self, pieces):
self.Pièces_jointes = ",".join(pieces)

def get_pieces_jointes(self):
return self.Pièces_jointes.split(",") if self.Pièces_jointes else []
class Contractant(db.Model):
__tablename__ = 'contractant'
id = Column(Integer, primary_key=True, autoincrement=True)
NIF = Column(String, nullable=True)
nombres_ilots = Column(Integer, nullable=True)
nom = Column(String, nullable=False)
prenom = Column(String, nullable=False)
nom_bureau_etude = Column(String, nullable=True)
adresse = Column(String, nullable=True)
telephone = Column(String, nullable=True)
fax = Column(String, nullable=True)
email = Column(String, nullable=True)

@app.route('/')
def form():
return render_template('dash/forms.html')

@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom')
print(f"Nom du demandeur: {nom}")
prenom = request.form.get('demandeur_prenom')
print(f"Prénom du demandeur: {prenom}")
date_Naissance_str = request.form.get('demandeur_date_naissance')
print(f"Date de naissance (chaîne): {date_Naissance_str}")
lieuNaissance = request.form.get('demandeur_lieu_naissance')
print(f"Lieu de naissance: {lieuNaissance}")
sexe = request.form.get('demandeur_sexe')
print(f"Sexe: {sexe}")
adresse = request.form.get('demandeur_adresse')
print(f"Adresse: {adresse}")
telephone = request.form.get('demandeur_telephone')
print(f"Téléphone: {telephone}")
fax = request.form.get('demandeur_fax')
print(f"Fax: {fax}")
email = request.form.get('demandeur_email')
print(f"Email: {email}")

type_demandeur = request.form.get('optionsRadios')
print(f"Type de demandeur: {type_demandeur}")

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
print("Erreur: Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires")
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

if type_demandeur not in TypeDemandeur.__members__:
print(f"Erreur: Type de demandeur invalide: {type_demandeur}")
return "Type de demandeur invalide", 400

# Conversion de la date de naissance
date_Naissance = datetime.datetime.strptime(date_Naissance_str, "%Y-%m-%d").date() if date_Naissance_str else None
print(f"Date de naissance (convertie): {date_Naissance}")

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
print(f"Erreur: Demandeur déjà existant: {existing_demandeur}")
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom, date_Naissance=date_Naissance, lieuNaissance=lieuNaissance,
sexe=sexe, adresse=adresse, telephone=telephone, fax=fax,
email=email, type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Nouveau demandeur créé: {new_demandeur}")
db.session.add(new_demandeur)
db.session.commit()
print("Demandeur enregistré dans la base de données")

# Gestion du bénéficiaire si différent du demandeur
beneficiaire_nom = request.form.get('beneficiaire_nom')
print(f"Nom du bénéficiaire: {beneficiaire_nom}")
beneficiaire_prenom = request.form.get('beneficiaire_prenom')
print(f"Prénom du bénéficiaire: {beneficiaire_prenom}")
beneficiaire_adresse = request.form.get('beneficiaire_adresse')
print(f"Adresse du bénéficiaire: {beneficiaire_adresse}")
beneficiaire_telephone = request.form.get('beneficiaire_telephone')
print(f"Téléphone du bénéficiaire: {beneficiaire_telephone}")
beneficiaire_email = request.form.get('beneficiaire_email')
print(f"Email du bénéficiaire: {beneficiaire_email}")
beneficiaire_sexe = request.form.get('beneficiaire_sexe')
print(f"Sexe: {sexe}")
if beneficiaire_nom and beneficiaire_prenom and (beneficiaire_nom != nom or beneficiaire_prenom != prenom):
beneficiaire = Demandeur(
nom=beneficiaire_nom, prenom=beneficiaire_prenom,sex=beneficiaire_sexe,
adresse=beneficiaire_adresse, telephone=beneficiaire_telephone,
email=beneficiaire_email, type_demandeur=TypeDemandeur[type_demandeur]
)
print(f"Bénéficiaire créé: {beneficiaire}")
db.session.add(beneficiaire)
db.session.commit()
print("Bénéficiaire enregistré dans la base de données")

# Récupération des données du contractant
contractant_nom = request.form.get('contractant_nom')
print(f"Nom du contractant: {contractant_nom}")
contractant_prenom = request.form.get('contractant_prenom')
print(f"Prénom du contractant: {contractant_prenom}")
contractant_nif = request.form.get('contractant_nif')
print(f"NIF du contractant: {contractant_nif}")
contractant_adresse = request.form.get('contractant_adresse')
print(f"Adresse du contractant: {contractant_adresse}")
contractant_telephone = request.form.get('contractant_telephone')
contractant_fax = request.form.get('contractant_fax')
print(f"Téléphone du contractant: {contractant_telephone}")
contractant_email = request.form.get('contractant_email')
print(f"Email du contractant: {contractant_email}")
contractant_bureau_etude = request.form.get('contractant_bureau_etude')
print(f"Bureau d'étude du contractant: {contractant_bureau_etude}")


contractant = None
if contractant_nom and contractant_prenom:
contractant = Contractant(
nom=contractant_nom, prenom=contractant_prenom, NIF=contractant_nif,
adresse=contractant_adresse, telephone=contractant_telephone,fax=contractant_fax,
email=contractant_email, nom_bureau_etude=contractant_bureau_etude
)
print(f"Contractant créé: {contractant}")
db.session.add(contractant)
db.session.commit()
print("Contractant enregistré dans la base de données")
nature_travaux = request.form.getlist('nature_travaux[]')
print(f"nature_travaux: {nature_travaux}")
type_travaux = request.form.getlist('type_travaux[]')
print(f"type_travaux: {type_travaux}")
nature_travaux_str = ", ".join(nature_travaux)
print(f"nature_travaux_str: {nature_travaux_str}")
type_travaux_str = ", ".join(type_travaux) # Correction ici
print(f"type_travaux_str: {type_travaux_str}")

pk_debut = request.form.get('pk_debut', type=int)
print(f"PK début: {pk_debut}")
pk_fin = request.form.get('pk_fin', type=int)
print(f"PK fin: {pk_fin}")
profondeur = request.form.get('profondeur', type=int)
print(f"Profondeur: {profondeur}")
date_debut_str = request.form.get('date_debut')
print(f"Date de début (chaîne): {date_debut_str}")
duree_travaux = request.form.get('duree_travaux', type=int)
print(f"Durée des travaux: {duree_travaux}")
pieces_jointes = request.form.getlist('pieces_jointes')
print(f"Pièces jointes: {pieces_jointes}")

# Validation des types de travaux
if type_travaux not in Type_travaux.__members__ or nature_travaux not in Nature_travaux.__members__:
print(f"Erreur: Type ou nature de travaux invalide: {type_travaux}, {nature_travaux}")
return "Type ou nature de travaux invalide", 400

# Conversion de la date de début
date_debut = datetime.datetime.strptime(date_debut_str, "%Y-%m-%d").date() if date_debut_str else None
print(f"Date de début (convertie): {date_debut}")


new_travaux = Travaux(
type_travaux=type_travaux_str,
Nature_travaux=nature_travaux_str,
pk_debut=pk_debut, pk_fin=pk_fin,
profondeur=profondeur, date_debut=date_debut,
duree_travaux=duree_travaux, demandeur_id=new_demandeur.id,
contractant_id=contractant.id if contractant else None
)
print(f"Nouveau travaux créé: {new_travaux}")

# Gestion des pièces jointes
if pieces_jointes:
new_travaux.set_pieces_jointes(pieces_jointes)
print(f"Pièces jointes ajoutées: {pieces_jointes}")

db.session.add(new_travaux)
db.session.commit()
print("Travaux enregistrés dans la base de données")

# Redirection après succès
print("Redirection vers la page d'accueil")
return redirect(url_for('index'))

except Exception as e:
db.session.rollback()
print(f"Erreur lors de l'enregistrement : {str(e)}")
return f"Erreur lors de l'enregistrement : {str(e)}", 500




with open('moock_test.json') as f:
db_geocoding = json.load(f)



@app.route('/reverseGeocoding', methods=['GET'])
def reverse_geocoding():
lat = request.args.get('lat')
lon = request.args.get('lon')
location_key = f"{lat},{lon}"
if location_key in db_geocoding['reverseGeocoding']:
return jsonify(db_geocoding['reverseGeocoding'][location_key])
else:
return jsonify({'error': 'Coordinates not found'}), 404

if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=3000) :::Durée des travaux: 2
Pièces jointes: []
Erreur lors de l'enregistrement : unhashable type: 'list'
127.0.0.1 - - [03/Mar/2025 11:18:10] "POST /submit HTTP/1.1" 500 -
قال ChatGPT:
Le code que vous avez partagé semble être une partie d'une application Flask qui gère des informations liées à des travaux, des demandeurs, des bénéficiaires, et des contractants. Voici quelques observations et améliorations possibles pour résoudre certains problèmes et améliorer la structure du code :

1. Validation des Champs et Types d'Enum
La validation des champs et des types d'énumération (comme TypeDemandeur, Type_travaux, etc.) semble correcte, mais une petite amélioration pourrait être faite pour vérifier les valeurs dans les Enum et éviter les erreurs. Utilisez la méthode .value au lieu de comparer directement les membres de l'énumération pour simplifier le processus.

2. Gestion de la Date
Vous avez utilisé datetime.datetime.strptime() pour convertir la date en format datetime.date. Si la chaîne de date est vide ou invalide, vous pouvez gérer l'erreur de manière plus robuste en ajoutant une vérification de validité.

3. Gestion des Bénéficiaires
La partie où vous gérez un "bénéficiaire" semble incomplète. Je vais supposer que vous voulez ajouter des informations de bénéficiaire, mais il semble qu'une section soit manquante. Vous devriez également valider les informations du bénéficiaire de manière similaire à la validation du demandeur.

4. Optimisation de l'Enregistrement
Plutôt que de répéter le processus de validation et d'ajout de l'objet, vous pouvez extraire cette logique dans une fonction générique pour les entités comme Demandeur et Contractant.

Exemple Amélioré et Complété
Voici un exemple modifié en tenant compte de ces observations et améliorations :

python
نسخ
تحرير
import datetime
from flask import Flask, jsonify, request, redirect, render_template
import json
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from sqlalchemy import Column, Integer, String, Boolean, Date, ForeignKey, Enum
from sqlalchemy.orm import relationship
import enum

app = Flask(__name__, static_url_path='/static')

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///autorisation.db'
app.config['SECRET_KEY'] = '580594580594'
db = SQLAlchemy(app)
migrate = Migrate(app, db)

from sqlalchemy import Column, Integer, String, Date, Enum, ForeignKey
from sqlalchemy.orm import relationship
from enum import Enum as PyEnum

class Nature_travaux(PyEnum):
Sous_accotement = "sous accotement"
Sous_voirie = "sous voirie"
Sous_trottoir = "sous trottoir"
Sous_ouvrage_art = "sous ouvrage d'art"
Souterrain = "souterrain"
Operateurs_reseaux = "operateurs reseaux"
Aérien = "aérien"
Autres = "autres"

class Type_travaux(PyEnum):
Branchement_eau_potable = "Branchement d'eau potable"
Branchement_reseau_eaux_usees = "Branchement au reseau des eaux usees"
Assainissement_eaux_pluviales = "Assainissement eaux pluviales"
Assainissement_eaux_usees = "Assainissement eaux usees"
Telecommunication = "Télécommunications"
Raccordement_reseau_gaz = "Raccordement au reseau de gaz"
Raccordement_electricite = "Raccordement de l'electricite"
Autres = "autres"

class TypeDemandeur(PyEnum):
particulier = "Particulier"
service_public = "Service public"
maitre_oeuvre = "Maître d’œuvre"
entreprise = "Entreprise"

class Demandeur(db.Model):
__tablename__ = 'demandeurs'
id = Column(Integer, primary_key=True, autoincrement=True)
nom = Column(String, nullable=False)
prenom = Column(String, nullable=False)
date_Naissance = Column(Date, nullable=True)
lieuNaissance = Column(String, nullable=True)
sexe = Column(String, nullable=True)
adresse = Column(String, nullable=True)
telephone = Column(String, nullable=True)
fax = Column(String, nullable=True)
email = Column(String, nullable=True)
type_demandeur = Column(Enum(TypeDemandeur), nullable=False)
travaux = relationship('Travaux', backref='demandeur')

class Travaux(db.Model):
__tablename__ = 'travaux'
id = Column(Integer, primary_key=True, autoincrement=True)
Pièces_jointes = Column(String, nullable=True)
type_travaux = Column(Enum(Type_travaux), nullable=True)
Nature_travaux = Column(Enum(Nature_travaux), nullable=True) # Corrected to Nature_travaux
pk_debut = Column(Integer, nullable=True)
pk_fin = Column(Integer, nullable=True)
profondeur = Column(Integer, nullable=True)
date_debut = Column(Date, nullable=True)
duree_travaux = Column(Integer, nullable=True)
demandeur_id = Column(Integer, ForeignKey('demandeurs.id'), nullable=False)

def set_pieces_jointes(self, pieces):
self.Pièces_jointes = ",".join(pieces)

def get_pieces_jointes(self):
return self.Pièces_jointes.split(",") if self.Pièces_jointes else []

@app.route('/submit', methods=['POST'])
def submit():
try:
# Récupération des données du demandeur
nom = request.form.get('demandeur_nom')
prenom = request.form.get('demandeur_prenom')
date_Naissance_str = request.form.get('demandeur_date_naissance')
lieuNaissance = request.form.get('demandeur_lieu_naissance')
sexe = request.form.get('demandeur_sexe')
adresse = request.form.get('demandeur_adresse')
telephone = request.form.get('demandeur_telephone')
fax = request.form.get('demandeur_fax')
email = request.form.get('demandeur_email')
type_demandeur = request.form.get('optionsRadios')

# Validation des champs obligatoires
if not nom or not prenom or not type_demandeur:
return "Les champs 'nom', 'prenom' et 'type_demandeur' sont obligatoires", 400

if type_demandeur not in TypeDemandeur.__members__:
return "Type de demandeur invalide", 400

# Conversion de la date de naissance
date_Naissance = datetime.datetime.strptime(date_Naissance_str, "%Y-%m-%d").date() if date_Naissance_str else None

# Vérification si le demandeur existe déjà
existing_demandeur = Demandeur.query.filter_by(nom=nom, prenom=prenom).first()
if existing_demandeur:
return "Demandeur déjà existant", 400

# Création du nouveau demandeur
new_demandeur = Demandeur(
nom=nom, prenom=prenom, date_Naissance=date_Naissance, lieuNaissance=lieuNaissance,
sexe=sexe, adresse=adresse, telephone=telephone, fax=fax,
email=email, type_demandeur=TypeDemandeur[type_demandeur]
)
db.session.add(new_demandeur)
db.session.commit()

# Ajouter les travaux ou autres informations
# Récupérer et ajouter d'autres informations comme le bénéficiaire, travaux, etc.

return jsonify({"message": "Demandeur ajouté avec succès!"})

except Exception as e:
return jsonify({"error": str(e)}), 500
Améliorations :
Validation des Données : La validation des données (comme le type_demandeur) a été ajustée pour vérifier s'il existe dans les __members__ de l'énumération.
Gestion des Exceptions : La gestion des erreurs a été améliorée pour renvoyer des messages plus clairs.
Structure des Modèles : Vous pouvez envisager de factoriser les fonctions comme set_pieces_jointes() pour les autres entités afin d'éviter de dupliquer du code.
Bénéficiaire et Autres Données : Vous pouvez appliquer la même logique pour ajouter des bénéficiaires ou d'autres données nécessaires à l'enregistrement.
Avec cette structure, vous pourrez facilement gérer la création de demandeurs, la validation des entrées et la gestion des erreurs.
 
أعلى