commit c618d76f282f20f0e1fc1a90288fa9c102e5ec4f Author: LaurentP Date: Tue Nov 26 14:40:12 2024 +0100 Téléverser les fichiers vers "/" diff --git a/create_sessionAF_dialog.py b/create_sessionAF_dialog.py new file mode 100644 index 0000000..bae9334 --- /dev/null +++ b/create_sessionAF_dialog.py @@ -0,0 +1,207 @@ +# -*- coding: utf-8 -*- +""" +/*************************************************************************** + CreateSessionAFDialog + A QGIS plugin + Permet de créer une nouvelle session d'animation foncière + ------------------- + begin : 2015-10-02 + git sha : $Format:%H$ + copyright : (C) 2015 by CEN Savoie + email : a.lesconnec@cen-savoie.org + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ +""" + +import os +import psycopg2 +import psycopg2.extras +from PyQt5 import QtGui, uic +from PyQt5.QtCore import * +from PyQt5.QtGui import * +from PyQt5.QtWidgets import QDialog, QMessageBox +from functools import partial +import datetime +from time import localtime, strftime + +FORM_CLASS, _ = uic.loadUiType(os.path.join(os.path.dirname(__file__), 'create_sessionAF_dialog_base.ui')) + +class CreateSessionAFDialog(QDialog, FORM_CLASS): + def __init__(self, parent=None): + """Constructor.""" + super(CreateSessionAFDialog, self).__init__(parent) + self.setupUi(self) + + def InitFormulaire(self, tbl_site_id, rq_saf_geom, acces, host, port, bdd, user, mdp): + self.lst_saf_maj.blockSignals(True) + self.lst_saf_origin.blockSignals(True) + self.saf_utilisateur.setText(user) + aujourdhui = strftime("%Y-%m", localtime()) + self.saf_date.setText(aujourdhui) + k = 0 + nom = 'SAF_' + while k < len(tbl_site_id): + nom += tbl_site_id[k] + '_' + k = k + 1 + nom += aujourdhui + self.saf_name.setText(nom) + + global conn, cur + conn = psycopg2.connect("host=" + host + " port=" + port + " dbname=" + bdd + " user=" + user + " password=" + mdp) + cur = conn.cursor(cursor_factory = psycopg2.extras.DictCursor) + + with conn: + with conn.cursor() as cur: + # Initialisation de la liste de l'origine de la SAF + rq_saf_origines = "SELECT DISTINCT saf_origine_id, saf_origine_lib FROM animation_fonciere.d_saf_origines ORDER BY saf_origine_id" + cur.execute(rq_saf_origines) + res_saf_origines = cur.fetchall() + self.lst_saf_origin.clear() #Vidage de la combobox + i = 0 #Déclaration à 0 d'une variable pour boucler sur toutes les options de la requête identifiée plus haut + global tbl_saf_origin + self.tbl_saf_origin = [] + self.lst_saf_origin.blockSignals(True) + while i < len(res_saf_origines): #Boucle sur toutes les options + id = res_saf_origines[i][0] #Déclaration de la variable stockant l'identifiant + lib = res_saf_origines[i][1] #Déclaration de la variable stockant le libellé + self.lst_saf_origin.addItem(lib) + self.tbl_saf_origin.append(id) + i+=1 + self.lst_saf_origin.setCurrentIndex(-1) + self.lst_saf_origin.blockSignals(False) + self.saf_origin.setVisible(0) + self.saf_origin.setText('N.P.') + self.lst_saf_origin.currentIndexChanged.connect(self.chg_lst_saf_origin) + + # Initialisation de la liste des SAF modifiables + rq_saf_maj = """ + SELECT * + FROM + ( + SELECT DISTINCT + session_af_id, + session_af_lib, + st_distance(session_af.geom, ("""+rq_saf_geom+""")) as dist, + date_maj + FROM + animation_fonciere.session_af + + ORDER BY dist, date_maj DESC + LIMIT 10 + ) t1 + WHERE + dist < 5000""" + cur.execute(rq_saf_maj) + res_saf_maj = cur.fetchall() + self.lst_saf_maj.blockSignals(True) + if cur.rowcount > 0: + self.lst_saf_maj.clear() #Vidage de la combobox + i = 0 #Déclaration à 0 d'une variable pour boucler sur toutes les options de la requête identifiée plus haut + global tbl_saf_maj + self.tbl_saf_maj = [] + while i < len(res_saf_maj): #Boucle sur toutes les options + id = res_saf_maj[i][0] #Déclaration de la variable stockant l'identifiant + lib = res_saf_maj[i][1] #Déclaration de la variable stockant le libellé + self.lst_saf_maj.addItem(lib) + self.tbl_saf_maj.append(id) + i+=1 + self.lst_saf_maj.setCurrentIndex(-1) + self.lst_saf_maj.blockSignals(False) + self.saf_maj.setVisible(0) + self.saf_maj.setText('N.P.') + self.lst_saf_maj.setEnabled(True) + self.lst_saf_maj.currentIndexChanged.connect(self.chg_lst_saf_maj) + else: + self.lst_saf_maj.setCurrentIndex(-1) + self.saf_maj.setVisible(0) + self.saf_maj.setText('N.P.') + self.lst_saf_maj.setEnabled(False) + self.button_box.setEnabled(False) + self.lst_saf_maj.blockSignals(False) + self.lst_saf_origin.blockSignals(False) + + def chg_lst_saf_origin(self, index): + self.lst_saf_maj.blockSignals(True) + self.lst_saf_origin.blockSignals(True) + + if len(self.tbl_saf_origin)>0 and self.tbl_saf_origin[index] and index>-1: + self.saf_origin.setText(str(self.tbl_saf_origin[index])) + + self.lst_saf_maj.setCurrentIndex(-1) + self.saf_maj.setText('N.P.') + + for i in range(self.tbl_parcelle.rowCount()): + self.tbl_parcelle.showRow(i) + + self.button_box.setEnabled(True) + + self.lst_saf_maj.blockSignals(False) + self.lst_saf_origin.blockSignals(False) + + def chg_lst_saf_maj(self, index): + self.lst_saf_maj.blockSignals(True) + self.lst_saf_origin.blockSignals(True) + + if len(self.tbl_saf_maj)>0 and self.tbl_saf_maj[index] and index>-1: + self.saf_maj.setText(str(self.tbl_saf_maj[index])) + + self.lst_saf_origin.setCurrentIndex(-1) + self.saf_origin.setText('N.P.') + + with conn: + with conn.cursor() as cur: + rq_parc_saf = """ + SELECT DISTINCT + cad_site_id, cadastre_site.date_fin as date_fin_site, cadastre_cen.date_fin as date_fin_cen + FROM + animation_fonciere.rel_eaf_foncier + JOIN animation_fonciere.rel_saf_foncier USING (rel_eaf_foncier_id) + JOIN foncier.cadastre_site USING (cad_site_id) + JOIN cadastre.cadastre_cen USING (cad_cen_id) + WHERE + lot_bloque = 'f' AND rel_saf_foncier.session_af_id = """+str(self.tbl_saf_maj[index]) + cur.execute(rq_parc_saf) + res_parc_saf = cur.fetchall() + i = 0 #Déclaration à 0 d'une variable pour boucler sur toutes les options de la requête identifiée plus haut + self.tbl_parc_saf = [] + self.prob_saf = 'NON' + while i < len(res_parc_saf): #Boucle sur toutes les options + if res_parc_saf[i][1] != 'N.D.' or res_parc_saf[i][2] != 'N.D.': + self.prob_saf = 'OUI' + else: + id = res_parc_saf[i][0] #Déclaration de la variable stockant l'identifiant + self.tbl_parc_saf.append(id) + i+=1 + + if self.prob_saf == 'OUI': + QMessageBox.critical(None, "Attention", "Cette session comporte des alertes et doit être mise à jour") + self.lst_saf_origin.setCurrentIndex(-1) + self.saf_origin.setText('N.P.') + self.lst_saf_maj.setCurrentIndex(-1) + self.saf_maj.setText('N.P.') + self.button_box.setEnabled(False) + else : + for r in range(self.tbl_parcelle.rowCount()): + new_lot = 'NON' + for cad_site_id in self.tbl_parcelle.item(r, 2).text().split(','): + if cad_site_id not in self.tbl_parc_saf: + new_lot = 'OUI' + if new_lot == 'NON': + self.tbl_parcelle.hideRow(r) + else: + self.tbl_parcelle.showRow(r) + + self.button_box.setEnabled(True) + + self.lst_saf_maj.blockSignals(False) + self.lst_saf_origin.blockSignals(False) + + \ No newline at end of file