#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-
#attention la base fonctionne avec le bouton (sans mot de passe) pour un QCombobox, mais n'est par prévu pour fonctionner avec un QListWidget (sans mot de passe) dans ce cas, il faut coder en plus.
#ne pas supprimer de champs dans la base, sinon, les impressions des références vont déconner...
#BUG à régler
# mysql db en SSL + paramètre PORT qui ne sert à rien pour l'instant.
# bug visual: à priori c'est bon
# impression logos !!!
#CTRL + BUG--->> changement du visu en fenetre de commande
#2015-02-18: statusbar pour les CTRL+EXP CTRL+DEP + rajouter CTRL+BUG en status bar + registre
#2015-02-18: raccouric le statusbars en bas à droite
#test à vérifier:
#bug possible sur UPDATE fiche affaire avec accent double ou simple et salsh...et % ou " ??? chercher par update...
#BUG mettre un sablier pendant l'attente d'une recherche
#QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
#QtGui.QApplication.restoreOverrideCursor()
"""
#a taper en console:
C:\> assoc .py
.py = Python.File
C:\> ftype Python.File
Python.File = "C:\Program\Python27\python.exe" "%1" %*
"""
#### A VIRER
import sys
print "infos systeme"
print "version de python:"
print sys.version_info
print "sys.stdin.encoding"
print sys.stdin.encoding
print ""
print "sys.stdout.encoding"
print sys.stdout.encoding
print "taille entier maxi"
print sys.maxint
#### A VIRER
from PyQt4 import QtCore, QtGui
from PyQt4 import QtXml
from PyQt4 import QtHelp
#from PyQt4 import*
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
_fromUtf8 = lambda s: s
from math import *
from datetime import date, datetime
import csv
import ftplib # On importe le module FTP de Python
import zipfile #module dezip
import os.path #module dezip
import shutil #fonction dupliquer, move...
import os #module dezip
import glob #module dezip
import re
import sys
import copy
#SQLITE Initialisationh répertoire et import
import sqlite3
import MySQLdb
### j'importe ici mes fichiers Qtdesigner convertis en pyuic4
#sys.path.append("C:/pyth/ventilo") #definit le chemin de recherche quand python ne le trouve pas dans ses modules
sys.path.append("visuel_images/") #chemin relatif d'un repertoire situé en aval quand python ne le trouve pas dans ses modules
from fenetre_principale6 import * # Ton fichier converti avec pyuic4
from fenetre_connexion1 import * # Ton fichier converti avec pyuic4
from fenetre_version1 import * # Ton fichier converti avec pyuic4
from impression_references1 import * # Ton fichier converti avec pyuic4
#from os import chdir
#chdir("C:/pyth/ventilo/") #définit le répertoire courant dans lequel python va écrire ses fichiers par défaut
###VARIABLES GLOBALES###
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
GLOBAL_config_actuelle_finale = mon_setting.value('config_par_defaut/nom_config').toString()
except:
GLOBAL_config_actuelle_finale = "_"
##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE
global GLOBAL_mode_debuggage
GLOBAL_mode_debuggage = "non" #mettre cette valeur à "oui" ou "non": pour activer/desactiver TAPER CTRL+BUG
##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE##DEBUGGAGE
if GLOBAL_mode_debuggage == 'oui': print "GLOBAL_config_actuelle_finale tout tout debut"
if GLOBAL_mode_debuggage == 'oui': print unicode(GLOBAL_config_actuelle_finale).encode("cp850")
#GLOBAL_config_actuelle_finale = "_" #soit MD, JPO, VB; etc.... à mettre dans la base des registres et son équivalent windows
#GLOBAL_config_actuelle_finale = unicode("dada28", "iso-8859-1") #soit MD, JPO, VB; etc.... à mettre dans la base des registres et son équivalent windows
GLOBAL_mon_tuple_de_tuple_ORIGINAL = [] #GLOBAL_mon_tuple_de_tuple_ORIGINAL tuple de tuple des colonnes
GLOBAL_mon_tuple_de_tuple_des_configs = [] #GLOBAL_mon_tuple_de_tuple_des_configs: contient toutes les configs des utilisateurs
GLOBAL_list_table_et_commentaires_tables = [] #tableau à deux dimensions contenant le nom de chqeu atble et son commentaire associé
#où GLOBAL_list_table_et_commentaires_tables[0][1] est le mot de passe des petites bases modificables par l'utilisateur
GLOBAL_chemin_icone = "visuel_images/" #bug possible sur ubuntu linux à cause du slash antislash
GLOBAL_explorateur_de_fichier = "oui" #pour activer/desactiver TAPER CTRL+EXP
GLOBAL_deplacement_de_fichier = "non" #pour activer/desactiver TAPER CTRL+DEP
GLOBAL_QLW_hauteur_origine = 0
GLOBAL_QTE_boost2_hauteur_origine = 0
GLOBAL_QTE_boost2_hauteur_modifiee = "non"
GLOBAL_nom_programme = "Chapty v"
GLOBAL_version_programme = "100"
GLOBAL_date_version = " 15 janvier 2015"
GLOBAL_modif_unique_ou_multiple = "unique" #ne rien changer
GLOBAL_blabla = "Version n°%s: particularités \
\n - V100 | 15/01/2015 | Déplacements et modifications multiples débuggées \
\n - V97 | 10/07/2014 | Clic droit dans les masques de saisie de droite permettant d'agrandir/reduire la taille du champ \
\n - V97 | 10/07/2014 | Gestion du copier coller sur le presse papier \
\n - V96 | 08/07/2014 | Clic droit: dupliquer ligne avec création de l'arborescence associée sur le serveur de fichiers\
\n - V96 | 08/07/2014 | Création automatique de la sous arborescence et des suppressions \
\n - V95 | 04/07/2014 | Raccourci: CTRL + E + X + P: active/désactive la fonction 'Explorateur' \
\n - V95 | 04/07/2014 | Raccourci: CTRL + B + U + G: active/désactive tous les affaiaches en console, utile pour investiguer un BUG \
\n - V95 | 04/07/2014 | Raccourci: CTRL + D + E + P: active/désactive la fonction déplacement de fichier physiquement sur le serveur \
\n - V95 | 04/07/2014 | Double clic pour ouverture directe de l'explorateur \n - Clic droit pour passage en modification multiple " % (GLOBAL_version_programme)
mes_fonctions = 1
if mes_fonctions ==1: # ne sert à rien pour l'instant
from htmlentitydefs import name2codepoint as n2cp
def substitute_entity(match):
ent = match.group(3)
if match.group(1) == "#":
if match.group(2) == '':
return unichr(int(ent))
elif match.group(2) == 'x':
return unichr(int('0x'+ent, 16))
else:
cp = n2cp.get(ent)
if cp:
return unichr(cp)
else:
return match.group()
def decode_htmlentities(string):
entity_re = re.compile(r'&(#?)(x?)(\d{1,5}|\w{1,8});')
return entity_re.subn(substitute_entity, string)[0]
class QHeaderView_special(QtGui.QHeaderView):
#http://stackoverflow.com/questions/7697194/how-can-i-set-labels-of-qheaderview-in-pyqt
#http://www.qtcentre.org/archive/index.php/t-31250.html
def __init__(self, orientation , parent = None):
QtGui.QHeaderView.__init__(self, orientation , parent) #le 1 est un Qt.Orientation vertcail ou horizontal
self.setMovable(True)
self.setClickable(True)
def contextMenuEvent(self, event): #CLIC DROIT UNIQUEMENT
if GLOBAL_mode_debuggage == 'oui': print "tu avances"
self.emit(QtCore.SIGNAL("clic_droit_header_horiz"))
#QtCore.QObject.connect(self,QtCore.SIGNAL("sectionClicked(int)"),app,QtCore.SLOT("quit()"))
#QtCore.QObject.connect(ui_bdg.tableWidget1.horizontalHeader(),QtCore.SIGNAL("sectionClicked(int)"),self.menu_header_principal
"""
menu = QtGui.QMenu(self)
quitAction = menu.addAction("Quit")
afficher_toutes_colonnes = menu.addAction("Afficher toutes colonnes")
action = menu.exec_(self.mapToGlobal(event.pos()))
if action == afficher_toutes_colonnes:
if GLOBAL_mode_debuggage == 'oui': print "afficher toutes colonnes"
"""
class MyDoubleValidator(QtGui.QDoubleValidator):
def __init__(self, bottom, top, decimals, parent = None):
QtGui.QDoubleValidator.__init__(self, bottom, top, decimals, parent)
def validate(self, input, pos):
state, pos = QtGui.QDoubleValidator.validate(self, input, pos)
if input.isEmpty() or input == '.':
return QtGui.QValidator.Intermediate, pos
if state != QtGui.QValidator.Acceptable:
return QtGui.QValidator.Invalid, pos
return QtGui.QValidator.Acceptable, pos
"""
You then need to initialize an instance of this class and assign it to the widget, e.g. a lineEdit. E.g
min = 0
max = 1000
no_decimals = 10
aValidator = MyDoubleValidator(min, max, no_decimals, myLineEdit)
myLineEdit.setValidator(aValidator)
"""
class QLabel_boost(QtGui.QLabel):
def __init__(self, parent = None):
QtGui.QLabel.__init__(self, parent)
def mouseReleaseEvent(self, ev):
self.emit(QtCore.SIGNAL('clicked()'))
class QTextEdit_boost(QtGui.QTextEdit):
def __init__(self, parent = None):
QtGui.QTextEdit.__init__(self, parent)
def mouseDoubleClickEvent(self, ev):
widgetActuel = QtGui.QApplication.focusWidget()
ma_pos = widgetActuel.pos()
#http://web.univ-pau.fr/~puiseux/enseignement/python/tutoQt-zero/tuto-PyQt-zero.4.html#Des%20param%C3%A8tres%20dans%20les%20signaux%20et%20slots%20|region
self.emit(QtCore.SIGNAL('mon_cellDoubleclicked(QPoint*)'), ma_pos)
class QTextEdit_boost_zone_text(QtGui.QTextEdit):
def __init__(self, parent = None):
#QtGui.QTextEdit.__init__(self, parent) #ça ou bien la fonction super, qui marche aussi
#http://www.developpez.net/forums/d623601/autres-langages/python-zope/general-python/utilite-super/
super(QtGui.QTextEdit, self).__init__(parent) #la fonction super permet d'appeler une fonction de la classe mère. Cela est utile si la classe enfant redéfinit la même fonction (que celle de la classe mère) mais qu'on veut tout de même utiliser celle de la classe mère. Si la classe fille ne redéfinit pas la fonction de la classe mère, il n'y a pas besoin d'utiliser la fonction super.
self.setContextMenuPolicy(QtCore.Qt.NoContextMenu) #pas de menu de base "Qt", donc pas de problème pour le foutu "paste" dont je n'arrive pas à répcupérer le event
def mousePressEvent(self, event):
global GLOBAL_QTE_boost2_hauteur_origine
global GLOBAL_QTE_boost2_hauteur_modifiee
if event.button() == QtCore.Qt.RightButton:
print "clic droit QTextEdit_boost_zone_text"
widgetActuel = QtGui.QApplication.focusWidget()
if GLOBAL_QTE_boost2_hauteur_origine == 0:
GLOBAL_QTE_boost2_hauteur_origine = widgetActuel.size().height()
if widgetActuel.verticalScrollBar().isVisible() == True:
while widgetActuel.verticalScrollBar().isVisible() == True:
#widgetActuel.setMinimumHeight(widgetActuel.size().height()+5)
widgetActuel.setMinimumHeight(widgetActuel.size().height()+5)
GLOBAL_QTE_boost2_hauteur_modifiee = "oui"
else: #si on ne voit pas la barre scroll et que la hauteur d'origine a été modifiée, alors, on remet la hauteur d'origine
if GLOBAL_QTE_boost2_hauteur_modifiee == "oui":
widgetActuel.setMinimumHeight(GLOBAL_QTE_boost2_hauteur_origine)
elif event.button() == QtCore.Qt.LeftButton:
QtGui.QTextEdit.mousePressEvent(self, event)
def keyPressEvent(self, event): #ok ça marche pour le Ctrl +v : pas touche
if event.matches(QtGui.QKeySequence.Paste):
mon_clipboard = QtGui.QApplication.clipboard()
le_mimedata = mon_clipboard.mimeData()
if le_mimedata.hasImage() == True:
mon_clipboard.setText("Collage impossible")
else:
try:
mon_clipboard.setText(le_mimedata.text()) #c'est ici qu'on vire toutes les mises en forme
self.insertFromMimeData(mon_clipboard.mimeData())
text_brut = unicode(self.toPlainText()).encode('ISO-8859-1')
text_brut2 = text_brut.replace('\'', ' ')
text_brut2 = text_brut.replace('"', ' ')
text_brut2 = text_brut.replace('œ', 'oe')
text_brut2 = text_brut.replace('’', ' ') #marche pas 11/12/2014
text_brut2 = text_brut.replace('`', ' ') #marche pas 11/12/2014
self.setPlainText(text_brut2)
except:
texte_titre = "Erreur de copier_coller"
msg_debut = "Certains caractères venant d'être collés vont poser problème lors de la validation de la fiche. \
\n Vérifiez si les caractères suivants sont présents: \n 'e dans l'o, apostrophe, guillements doubles, etc... "
msg_total = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.setPlainText("")
##http://stackoverflow.com/questions/21089316/pyqt-qlineedit-and-paste-event
else:
QtGui.QTextEdit.keyPressEvent(self, event) #important, sinon, on ne peut plus écrire dans le Textedit car la fonction n'est plus appellée
class QDateEdit_boost_SCROLL(QtGui.QDateEdit):
def __init__(self, parent = None):
QtGui.QDateEdit.__init__(self, parent)
self.setDisplayFormat("dd/MM/yyyy")
def wheelEvent(self, event): #pas de réinjection du signal, donc signal du combobox bloqué. A la place on réinjecte le wheelevent su scroll area
if GLOBAL_mode_debuggage == 'oui': print "roulette date"
mon_form.qscrollArea_detail.wheelEvent(event)
class QComboBox_boost_SCROLL(QtGui.QComboBox):
def __init__(self, parent = None):
QtGui.QComboBox.__init__(self, parent)
def wheelEvent(self, event): #pas de réinjection du signal, donc signal du combobox bloqué. A la place on réinjecte le wheelevent su scroll area
if GLOBAL_mode_debuggage == 'oui': print "roulette"
mon_form.qscrollArea_detail.wheelEvent(event)
class QListWidget_boost_SCROLL(QtGui.QListWidget):
def __init__(self, parent = None):
QtGui.QListWidget.__init__(self, parent)
def wheelEvent(self, event):
if GLOBAL_mode_debuggage == 'oui': print "roulette QLW"
#if mon_form.qpush_valider_nouveau.isVisible() == True:
# QtGui.QListWidget.wheelEvent(self, event) #TIP TOP Au TOP: réinjection du signal event du propre objet mais pas besoin dans notres cas...
mon_form.qscrollArea_detail.wheelEvent(event) #on crée le signal roulette sur l'autre widget SCROLL
def mousePressEvent(self, event):
global GLOBAL_QLW_hauteur_origine
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "mousePressEvent"
if event.button() == QtCore.Qt.RightButton:
if GLOBAL_mode_debuggage == 'oui': print "clic droit"
widgetActuel = QtGui.QApplication.focusWidget()
if GLOBAL_mode_debuggage == 'oui': print "widgetActuel.size()"
if GLOBAL_mode_debuggage == 'oui': print widgetActuel.size()
if GLOBAL_QLW_hauteur_origine == 0:
GLOBAL_QLW_hauteur_origine = widgetActuel.size().height()
taille = 0
for num in range(widgetActuel.count()):
taille += widgetActuel.sizeHintForRow(num)
taille += widgetActuel.sizeHintForRow(0) #rajoute encore une ligne
if widgetActuel.size().height() < taille:
#widgetActuel.setMinimumSize(QtCore.QSize(widgetActuel.size().width(), 160))
widgetActuel.setMinimumSize(QtCore.QSize(widgetActuel.size().width(), taille))
else:
widgetActuel.setMinimumSize(QtCore.QSize(widgetActuel.size().width(),GLOBAL_QLW_hauteur_origine))
elif event.button() == QtCore.Qt.LeftButton:
if GLOBAL_mode_debuggage == 'oui': print "clic gauche"
QtGui.QListWidget.mousePressEvent(self, event)
class QMessageBox_derive():
def box_erreur(self,texte_titre,texte_avertissement):
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setInformativeText(texte_avertissement)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
class QDialog_surclasse(QtGui.QDialog):
def __init__(self, parent = None):
#QtGui.QDialog.__init__(self, parent) #le 1 est un Qt.Orientation vertcail ou horizontal
super(QDialog_surclasse, self).__init__() #évite le bug présupposé en linux
def closeEvent(self, event):
if GLOBAL_mode_debuggage == 'oui': print "coucou je ferme QDialog"
self.emit(QtCore.SIGNAL("fermeture_fenetre_bases"))
class Fenetre_SQL_ajout_modif_suppression():
def fermeture_petite_fenetre(self):
if GLOBAL_mode_debuggage == 'oui': print "la suite ici doudou"
#lors de la fermeture de la fenetre
#il faut récupérer le type_champ, nom_de_table, num_row_grid pour relancer ensuite le remplissage situé dans la fonction:
#SCROLL_remplissage_champs
mon_widget = mon_form.mon_grid_area.itemAtPosition(self.num_row_grid,1).widget()
mon_libelle = mon_form.mon_grid_area.itemAtPosition(self.num_row_grid,0).widget().text()
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "libelle: %s" % (mon_libelle)
if GLOBAL_mode_debuggage == 'oui': print "type widget: %s" % (mon_widget)
if GLOBAL_mode_debuggage == 'oui': print "nom base: %s" % (self.nom_de_table)
if GLOBAL_mode_debuggage == 'oui': print "num_ligne grid: %s" %(self.num_row_grid)
if type(mon_widget) == type(QComboBox_boost_SCROLL()) or type(mon_widget) == type(QListWidget_boost_SCROLL()):
mon_widget.clear()
#for chaque_item1 in self.mon_list_de_list_tables_annexes:
# mon_widget.addItem(chaque_item1)
#ma_liste = SCROLL_remplissage_des_QListWidget(self,nom_de_table,num_de_colonne_de_table)
ma_liste = mon_form.SCROLL_remplissage_des_QListWidget(self.nom_de_table,0)
for mon_text in ma_liste:
#monItem = QtGui.QListWidgetItem(mon_text)
mon_widget.addItem(mon_text)
def creation_fenetre(self,type_champ, nom_de_table, num_row_grid): #num row grid est la ligne correspondante du gridlayout
if GLOBAL_mode_debuggage == 'oui': print "\ndef creation_fenetre"
if GLOBAL_mode_debuggage == 'oui': print type_champ
if GLOBAL_mode_debuggage == 'oui': print nom_de_table
self.nom_de_table = nom_de_table #malin: on transforme le nom en self.nom pour l'utiliser ailleurs dans les autres def
self.num_row_grid = num_row_grid
self.ma_Bdg_dialog = QDialog_surclasse(MainWindow)
QtCore.QObject.connect(self.ma_Bdg_dialog,QtCore.SIGNAL("fermeture_fenetre_bases"),self.fermeture_petite_fenetre)
self.ma_Bdg_dialog.setWindowModality(QtCore.Qt.ApplicationModal) #fenetre modale: non_modal: setWindowModality(QtCore.Qt.NonModal)
self.ma_Bdg_dialog.setWindowTitle(self.nom_de_table) #nome de la fenetre
#exec("MainWindow.setWindowIcon(QtGui.QIcon(_fromUtf8('%s%s')))" % (chemin_icone, "/listen.png"))
self.ma_Bdg_dialog.setObjectName(_fromUtf8("self.ma_Bdg_dialog"))
self.ma_Bdg_dialog.resize(600, 500)
self.horizontalLayout = QtGui.QHBoxLayout(self.ma_Bdg_dialog)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
self.listWidget = QtGui.QListWidget(self.ma_Bdg_dialog)
self.listWidget.setObjectName(_fromUtf8("listWidget"))
self.horizontalLayout_2.addWidget(self.listWidget)
self.scrollArea = QtGui.QScrollArea(self.ma_Bdg_dialog)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName(_fromUtf8("scrollArea"))
self.scrollAreaWidgetContents = QtGui.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 400, 500))
self.scrollAreaWidgetContents.setObjectName(_fromUtf8("scrollAreaWidgetContents"))
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.verticalLayout_4 = QtGui.QVBoxLayout(self.scrollAreaWidgetContents)
self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
self.verticalLayout_3 = QtGui.QVBoxLayout()
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.verticalLayout_4.addLayout(self.verticalLayout_3)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.horizontalLayout_2.addWidget(self.scrollArea)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout.addLayout(self.verticalLayout)
self.buttonBox = QtGui.QDialogButtonBox(self.ma_Bdg_dialog)
self.buttonBox.setOrientation(QtCore.Qt.Vertical)
self.bouton_nouveau = QtGui.QPushButton("Nouveau")
self.buttonBox.addButton(self.bouton_nouveau,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_nouveau,QtCore.SIGNAL("clicked()"),self.element_nouveau) #(utiliser fonction lambda)
self.bouton_modifier = QtGui.QPushButton("Modifier")
self.buttonBox.addButton(self.bouton_modifier,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_modifier,QtCore.SIGNAL("clicked()"),self.element_modifier) #(utiliser fonction lambda)
self.bouton_supprimer = QtGui.QPushButton("Supprimer")
self.buttonBox.addButton(self.bouton_supprimer,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_supprimer,QtCore.SIGNAL("clicked()"),self.element_supprimer) #(utiliser fonction lambda)
self.bouton_valider_nouveau = QtGui.QPushButton("Valider Nouv")
self.buttonBox.addButton(self.bouton_valider_nouveau,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_valider_nouveau,QtCore.SIGNAL("clicked()"),self.element_valider_nouveau) #(utiliser fonction lambda)
self.bouton_valider_modif = QtGui.QPushButton("Valider Modif")
self.buttonBox.addButton(self.bouton_valider_modif,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_valider_modif,QtCore.SIGNAL("clicked()"),self.element_valider_modif) #(utiliser fonction lambda)
self.bouton_annuler = QtGui.QPushButton("Annuler")
self.buttonBox.addButton(self.bouton_annuler,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_annuler,QtCore.SIGNAL("clicked()"),self.element_annuler) #(utiliser fonction lambda)
self.horizontalLayout.addWidget(self.buttonBox)
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
self.bouton_nouveau.show()
self.bouton_modifier.show()
self.bouton_supprimer.show()
self.bouton_valider_nouveau.hide()
self.bouton_valider_modif.hide()
self.bouton_annuler.show()
self.ma_Bdg_dialog.show()
self.remplissage(type_champ)
def element_nouveau(self):
if GLOBAL_mode_debuggage == 'oui': print "element_nouveau"
QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
self.bouton_nouveau.hide()
self.bouton_modifier.hide()
self.bouton_supprimer.hide()
self.bouton_valider_nouveau.show()
self.bouton_valider_modif.hide()
self.bouton_annuler.show()
#gestion
self.mon_Qline.setEnabled(True)
self.listWidget.setEnabled(True)
self.mon_Qline.setText('')
def element_modifier(self):
if GLOBAL_mode_debuggage == 'oui': print "element_modifier"
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
self.bouton_nouveau.hide()
self.bouton_modifier.hide()
self.bouton_supprimer.hide()
self.bouton_valider_nouveau.hide()
self.bouton_valider_modif.show()
self.bouton_annuler.show()
#gestion
self.mon_Qline.setEnabled(True)
self.listWidget.setEnabled(False)
item_actuel = self.listWidget.currentItem()
text_ligne_item_actuel = item_actuel.text()
self.mon_Qline.setText(text_ligne_item_actuel)
def element_supprimer(self):
if GLOBAL_mode_debuggage == 'oui': print "element_supprimer"
#gestion
self.mon_Qline.setEnabled(False)
##################
#on vérifie que le lineedit n'est pas nul et qu'il n'y a pas de doublon avec la base
if self.mon_Qline.text() != "":
try:
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
##ENVOI EN UNICODE DE TOUTES LES VALEURS dans la base MySQL ET TOUT SE PASSE TRES BIEN !!!
if GLOBAL_mode_debuggage == 'oui': print "suppresion"
#exec(ma_requete1 = "insert into preferences_utilisateurs (nom_utilisateur)" % )
# http://stackoverflow.com/questions/775296/python-mysql-with-variables gestion des injection SQL grâce à la virgule
#cur.execute("delete from preferences_utilisateurs where (nom_utilisateur = %s)" ,(unicode(text_actuel)))
debut_requete = ("delete from %s where (%s=" % (self.nom_de_table, self.ma_structure_table[0][0]))
suite_requete = debut_requete + "%s)"
if GLOBAL_mode_debuggage == 'oui': print "suite_requete"
if GLOBAL_mode_debuggage == 'oui': print suite_requete
cur.execute(suite_requete, unicode(self.mon_Qline.text()))
cur.close()
id.commit()
id.close()
#on ajoute la nouvelle valeur à la liste de gauche des configs puis on la range puis on la sélectionne et on met le scroll dessus
#QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
#QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
monItem = QtGui.QListWidgetItem(self.mon_Qline.text())
blabla = self.mon_Qline.text()
#self.listWidget.removeItemWidget(monItem)
#self.listWidget.takeItem(self.listWidget.row(monItem))
mon_mes_items = self.listWidget.findItems(self.mon_Qline.text(), QtCore.Qt.MatchFlags())
for piti_item in mon_mes_items:
if GLOBAL_mode_debuggage == 'oui': print "piti_item.text()"
if GLOBAL_mode_debuggage == 'oui': print unicode(piti_item.text()).encode("CP850")
self.listWidget.takeItem(self.listWidget.row(piti_item))
#sortItems (self, Qt.SortOrder order = Qt.AscendingOrder)
self.listWidget.sortItems()
self.listWidget.setCurrentRow(-1)
#scrollToItem (self, QListWidgetItem item, QAbstractItemView.ScrollHint hint = QAbstractItemView.EnsureVisible)
self.mon_Qline.setText('')
#QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
texte_titre = "Suppression"
msg_debut = "La ligne:\n "
msg_debut2 = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
msg_variable = unicode(blabla, "iso-8859-1") # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg_fin = "\na bien été supprimée"
msg_fin2 = unicode(msg_fin, "iso-8859-1")
msg_total = msg_debut2 + msg_variable + msg_fin2
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.IntegrityError, e:
texte_titre = "Erreur"
msg_debut = "Erreur de suppression"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.OperationalError,e:
texte_titre = "Erreur de connection au serveur"
msg_debut = "Connexion impossible: \n Vérifier si la connection au serveur de base de données est bien établie"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif self.mon_Qline.text() == "":
texte_titre = "Pas de donnée !"
msg_total = "Vous devez rentrer une valeur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.element_annuler() #raz affichage
def element_valider_nouveau(self):
if GLOBAL_mode_debuggage == 'oui': print "element_valider_nouveau"
#on vérifie que le lineedit n'est pas nul et qu'il n'y a pas de doublon avec la base
if self.mon_Qline.text() != "":
try:
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
##ENVOI EN UNICODE DE TOUTES LES VALEURS dans la base MySQL ET TOUT SE PASSE TRES BIEN !!!
if GLOBAL_mode_debuggage == 'oui': print "insertion nouveau1"
#exec(ma_requete1 = "insert into preferences_utilisateurs (nom_utilisateur)" % )
# http://stackoverflow.com/questions/775296/python-mysql-with-variables gestion des injection SQL grâce à la virgule
#cur.execute("i nsert into preferences_utilisateurs (nom_utilisateur) values (%s)" ,( unicode(self.mon_Qline.text())))
"""
if GLOBAL_mode_debuggage == 'oui': print "self.nom_de_table"
if GLOBAL_mode_debuggage == 'oui': print self.nom_de_table
if GLOBAL_mode_debuggage == 'oui': print "self.ma_structure_table[0]"
if GLOBAL_mode_debuggage == 'oui': print self.ma_structure_table[0]
if GLOBAL_mode_debuggage == 'oui': print "unicode(self.mon_Qline.text())"
if GLOBAL_mode_debuggage == 'oui': print unicode(self.mon_Qline.text())
"""
debut_requete = ("insert into %s (%s) values " % (self.nom_de_table, self.ma_structure_table[0][0]))
suite_requete = debut_requete + "(%s)"
if GLOBAL_mode_debuggage == 'oui': print "suite_requete"
if GLOBAL_mode_debuggage == 'oui': print suite_requete
cur.execute(suite_requete, unicode(self.mon_Qline.text()))
cur.close()
id.commit()
id.close()
#on ajoute la nouvelle valeur à la liste de gauche des configs puis on la range puis on la sélectionne et on met le scroll dessus
QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
monItem = QtGui.QListWidgetItem(self.mon_Qline.text())
self.listWidget.addItem(monItem)
#sortItems (self, Qt.SortOrder order = Qt.AscendingOrder)
self.listWidget.sortItems()
self.listWidget.setCurrentItem(monItem)
#scrollToItem (self, QListWidgetItem item, QAbstractItemView.ScrollHint hint = QAbstractItemView.EnsureVisible)
self.listWidget.scrollToItem(monItem)
self.mon_Qline.setText('')
#QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
texte_titre = "Opération"
msg_debut = "Ligne ajoutée "
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.IntegrityError, e:
texte_titre = "Doublon impossible"
msg_debut = "Doublon impossible ! "
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.OperationalError,e:
texte_titre = "Erreur de connection au serveur"
msg_debut = "Connexion impossible: \n Vérifier si la connection au serveur de base de données est bien établie"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif self.mon_Qline.text() == "":
texte_titre = "Pas de donnée !"
msg_total = "Vous devez rentrer une valeur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.element_annuler() #raz affichage
def element_valider_modif(self):
if GLOBAL_mode_debuggage == 'oui': print "element_valider_modif"
#on vérifie que le lineedit n'est pas nul et qu'il n'y a pas de doublon avec la base
if self.mon_Qline.text() != "":
try:
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
##ENVOI EN UNICODE DE TOUTES LES VALEURS dans la base MySQL ET TOUT SE PASSE TRES BIEN !!!
if GLOBAL_mode_debuggage == 'oui': print "modification"
mon_ancien_Item = self.listWidget.currentItem()
ancien_blabla = mon_ancien_Item.text()
if GLOBAL_mode_debuggage == 'oui': print "ancien_blabla"
if GLOBAL_mode_debuggage == 'oui': print unicode(ancien_blabla).encode("CP850")
mon_nouveau_Item = QtGui.QListWidgetItem(self.mon_Qline.text())
nouveau_blabla = self.mon_Qline.text()
#on supprime l'ancien
for SelectedItem in self.listWidget.selectedItems():
self.listWidget.takeItem(self.listWidget.row(SelectedItem))
#exec(ma_requete1 = "insert into preferences_utilisateurs (nom_utilisateur)" % )
# http://stackoverflow.com/questions/775296/python-mysql-with-variables gestion des injection SQL grâce à la virgule
#cur.execute("delete from preferences_utilisateurs where (nom_utilisateur = %s)" ,(unicode(text_actuel)))
#cur.execute("UPDATE preferences_utilisateurs SET nom_utilisateur=%s, ordre_col_tableau_resultat=%s, ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" , \
#(nouveau_text, str(matrice_colonnes_resultat), str(nouvelle_matrice_colonnes_scroll),ancien_text))
#"UPDATE self.nom_de_table SET self.ma_structure_table[0][0]='nouveau_blabla' WHERE self.ma_structure_table[0][0]='ancien_blabla'"
#remise à jour toute la table "principale" avec la modification effectuée sur la petite table
#pour cela, il faut:
#1 prendre le nom de la table: self.nom_de_table (et donc s'assurer que les noms de table soient les mêmes que les noms de champ de "base_des_affaires1"
#2 chercher l'équivalence self.nom_de_table dans "base_des_affaires1" / premier champ / element[0] du split # ==> on en déduit le bon champ dans base_des_affaires1
# scanner toute la base "base_des_affaires1" et modifier (UPDATE)tous les élements rencontrés
#### premiere requete
A = ("update %s set %s=" % (self.nom_de_table, self.ma_structure_table[0][0]))
B = A + "%s"
C = (" WHERE %s=" % (self.ma_structure_table[0][0]))
D = C + "%s"
tot = B + D
if GLOBAL_mode_debuggage == 'oui': print "total"
if GLOBAL_mode_debuggage == 'oui': print tot
cur.execute(tot, (unicode(nouveau_blabla), unicode(ancien_blabla)))
cur.close()
######début seconde requete
cur2=id.cursor()
mon_libelle_col0 = mon_form.mon_grid_area.itemAtPosition(self.num_row_grid,0).widget().text()
for num_elem in range(len(mon_form.TRI_mon_list_de_list_de_parametres_de_tri)):
if mon_libelle_col0 == mon_form.TRI_mon_list_de_list_de_parametres_de_tri[num_elem][6]:
if GLOBAL_mode_debuggage == 'oui': print "va au dodo"
if GLOBAL_mode_debuggage == 'oui': print "champ a mettre a jour dans la base principale"
champ_mis_a_jour = mon_form.TRI_mon_list_de_list_de_parametres_de_tri[num_elem][0]
if GLOBAL_mode_debuggage == 'oui': print champ_mis_a_jour
A2 = ("update `%s` set `%s`=" % (mysql_Nom_de_table, champ_mis_a_jour))
B2 = A2 + "%s"
C2 = (" WHERE `%s`=" % (champ_mis_a_jour))
D2 = C2 + "%s"
tot2 = B2 + D2
if GLOBAL_mode_debuggage == 'oui': print "total2"
if GLOBAL_mode_debuggage == 'oui': print tot2
cur2.execute(tot2, (unicode(nouveau_blabla), unicode(ancien_blabla)))
cur2.close()
id.commit()
id.close()
#on ajoute la nouvelle valeur à la liste de gauche des configs puis on la range puis on la sélectionne et on met le scroll dessus
#QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
#QtCore.QObject.disconnect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
self.listWidget.addItem(mon_nouveau_Item)
self.listWidget.sortItems()
self.listWidget.setCurrentItem(mon_nouveau_Item)
self.listWidget.scrollToItem(mon_nouveau_Item)
texte_titre = "Modification effectuée"
msg_debut = "Ligne modifiée dans base des donneurs d'ordre\nLignes correspondantes également modifiées dans la base des affaires"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.IntegrityError, e:
if GLOBAL_mode_debuggage == 'oui': print e
texte_titre = "Erreur"
msg_debut = "Erreur de Modification"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.OperationalError,e:
texte_titre = "Erreur de connection au serveur"
msg_debut = "Connexion impossible: \n Vérifier si la connection au serveur de base de données est bien établie"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif self.mon_Qline.text() == "":
texte_titre = "Pas de donnée !"
msg_total = "Vous devez rentrer une valeur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.element_annuler() #raz affichage
def element_annuler(self):
if GLOBAL_mode_debuggage == 'oui': print "element_annuler"
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item) #action sur le listWidget de gauche
QtCore.QObject.connect(self.listWidget,QtCore.SIGNAL("itemClicked(QListWidgetItem*)"),self.selection_item) #action sur le listWidget de gauche
if self.bouton_nouveau.isHidden() == False and self.bouton_modifier.isHidden() == False and self.bouton_supprimer.isHidden() == False:
self.ma_Bdg_dialog.close()
else:
self.bouton_nouveau.show()
self.bouton_modifier.show()
self.bouton_supprimer.show()
self.bouton_valider_nouveau.hide()
self.bouton_valider_modif.hide()
self.bouton_annuler.show()
self.mon_Qline.setEnabled(False)
self.listWidget.setEnabled(True)
if self.mon_Qline.text() == "":
self.listWidget.setCurrentRow(0)
else:
mon_mes_items = self.listWidget.findItems(self.mon_Qline.text(), QtCore.Qt.MatchFlags())
for piti_item in mon_mes_items:
if GLOBAL_mode_debuggage == 'oui': print "piti_item.text()"
if GLOBAL_mode_debuggage == 'oui': print unicode(piti_item.text()).encode("CP850")
self.listWidget.setCurrentItem(piti_item)
self.listWidget.scrollToItem(piti_item)
"""
mon_ancien_Item = self.listWidget.currentItem()
ancien_blabla = mon_ancien_Item.text()
if GLOBAL_mode_debuggage == 'oui': print "ancien_blabla"
if GLOBAL_mode_debuggage == 'oui': print unicode(ancien_blabla).encode("CP850")
mon_nouveau_Item = QtGui.QListWidgetItem(self.mon_Qline.text())
nouveau_blabla = self.mon_Qline.text()
#on supprime l'ancien
for SelectedItem in self.listWidget.selectedItems():
self.listWidget.takeItem(self.listWidget.row(SelectedItem))
"""
def remplissage(self,type_champ):
if GLOBAL_mode_debuggage == 'oui': print "\ndef remplissage"
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
cur.execute("select * from %s ORDER BY 1 ASC" % self.nom_de_table)
#cur.execute("select * from %s order by affaire_QLE" % mysql_Nom_de_table)
self.mon_list_de_list_tables_annexes = list(cur.fetchall())
cur.close()
cur2=id.cursor()
cur2.execute("SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '%s'" % self.nom_de_table)
self.ma_structure_table = list(cur2.fetchall())
cur2.close()
id.commit()
id.close()
if GLOBAL_mode_debuggage == 'oui': print self.mon_list_de_list_tables_annexes #toutes la base est dedans
#if GLOBAL_mode_debuggage == 'oui': print "%d lignes\n" % cur.rowcount
if GLOBAL_mode_debuggage == 'oui': print "Remplissage Qscroll Area de fenetre"
nb_total_champs = len(self.mon_list_de_list_tables_annexes)
if GLOBAL_mode_debuggage == 'oui': print nb_total_champs
if GLOBAL_mode_debuggage == 'oui': print "self.ma_structure_table"
if GLOBAL_mode_debuggage == 'oui': print self.ma_structure_table
#on crée autant de QlineEdit qu'il y a de champs. Dans notres cas, il n'y en a qu'un
for elem in self.ma_structure_table:
self.mon_Qlabel = QtGui.QLabel()
self.mon_Qlabel.setText(elem[0]) #elem[0] est le nom du champ
self.verticalLayout_4.addWidget(self.mon_Qlabel)
self.mon_Qline = QtGui.QLineEdit()
self.verticalLayout_4.addWidget(self.mon_Qline)
self.mon_Qline.setEnabled(False)
self.mon_Qlabel_separat = QtGui.QLabel()
self.mon_Qlabel_separat.setText("---------------")
self.verticalLayout_4.addWidget(self.mon_Qlabel_separat)
spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout_4.addItem(spacerItem)
for elem in self.mon_list_de_list_tables_annexes:
monItem = QtGui.QListWidgetItem(elem[0])
self.listWidget.addItem(monItem)
#self.listWidget.setCurrentRow(0)
def selection_item(self):
try:
item_actuel = self.listWidget.currentItem()
text_ligne_item_actuel = item_actuel.text()
#if GLOBAL_mode_debuggage == 'oui': print "text_ligne_item_actuel"
#if GLOBAL_mode_debuggage == 'oui': print text_ligne_item_actuel
self.mon_Qline.setText(text_ligne_item_actuel)
except:
self.mon_Qline.setText('')
class Fenetre_CONFIG_UTILISATEUR_SQL_ajout_modif_suppression():
def creation_fenetre_config(self, table_liste_des_configs):
if GLOBAL_mode_debuggage == 'oui': print "\ndef creation_fenetre_config"
if GLOBAL_mode_debuggage == 'oui': print table_liste_des_configs
self.table_liste_des_configs = table_liste_des_configs #on passe la variable accessible dans toute la classe!!
self.dialogConfig = QtGui.QDialog(MainWindow)
self.dialogConfig.setWindowModality(QtCore.Qt.ApplicationModal) #fenetre modale: non_modal: setWindowModality(QtCore.Qt.NonModal)
self.dialogConfig.setWindowTitle("Gestion des configurations") #nom de la fenetre
#exec("MainWindow.setWindowIcon(QtGui.QIcon(_fromUtf8('%s%s')))" % (chemin_icone, "/listen.png"))
self.dialogConfig.setObjectName(_fromUtf8("self.dialogConfig"))
self.dialogConfig.resize(800, 600)
self.dialogConfig.setWindowTitle(QtGui.QApplication.translate("self.dialogConfig", "Enregistrement des parametres + Ordre des champs", None, QtGui.QApplication.UnicodeUTF8))
self.horizontalLayout = QtGui.QHBoxLayout(self.dialogConfig)
self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
self.verticalLayout = QtGui.QVBoxLayout()
self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
self.horizontalLayout_2 = QtGui.QHBoxLayout()
self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
self.verticalLayout_3 = QtGui.QVBoxLayout()
self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3"))
self.verticalLayout_4 = QtGui.QVBoxLayout()
self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4"))
self.lineEdit_info = QtGui.QLineEdit(self.dialogConfig)
self.lineEdit_info.setObjectName(_fromUtf8("lineEdit_info"))
self.lineEdit_info.setDisabled(True)
self.verticalLayout_4.addWidget(self.lineEdit_info)
self.horizontalLayout_Haut = QtGui.QHBoxLayout()
self.horizontalLayout_Haut.setObjectName(_fromUtf8("horizontalLayout_Haut"))
self.label_haut = QtGui.QLabel(self.dialogConfig)
self.label_haut.setObjectName(_fromUtf8("label_haut"))
self.label_haut.setText("Nom config:")
self.horizontalLayout_Haut.addWidget(self.label_haut)
self.lineEdit = QtGui.QLineEdit(self.dialogConfig)
self.lineEdit.setObjectName(_fromUtf8("lineEdit"))
#self.lineEdit.setDisabled(True)
self.horizontalLayout_Haut.addWidget(self.lineEdit)
self.verticalLayout_3.addLayout(self.horizontalLayout_Haut)
self.listConfig = QtGui.QListWidget(self.dialogConfig)
self.listConfig.setObjectName(_fromUtf8("listConfig"))
self.verticalLayout_3.addWidget(self.listConfig)
self.horizontalLayout_2.addLayout(self.verticalLayout_3)
self.tableColonnes = QtGui.QTableWidget(self.dialogConfig)
self.tableColonnes.setObjectName(_fromUtf8("self.tableColonnes"))
self.verticalLayout_4.addWidget(self.tableColonnes)
self.tableColonnes.setColumnCount(2)
self.tableColonnes.horizontalHeader().hide()
self.tableColonnes.verticalHeader().hide()
######
self.horizontalLayout_Bas = QtGui.QHBoxLayout()
self.horizontalLayout_Bas.setObjectName(_fromUtf8("horizontalLayout_Bas"))
self.label_bas = QtGui.QLabel(self.dialogConfig)
self.label_bas.setObjectName(_fromUtf8("label_bas"))
self.label_bas.setText("Config en cours:")
self.horizontalLayout_Bas.addWidget(self.label_bas)
self.line_edit_config_en_cours = QtGui.QLineEdit(self.dialogConfig)
self.line_edit_config_en_cours.setObjectName(_fromUtf8("line_edit_config_en_cours"))
self.line_edit_config_en_cours.setText(GLOBAL_config_actuelle_finale)
self.line_edit_config_en_cours.setReadOnly(True)
self.horizontalLayout_Bas.addWidget(self.line_edit_config_en_cours)
self.verticalLayout_3.addLayout(self.horizontalLayout_Bas)
######
self.horizontalLayout_2.addLayout(self.verticalLayout_4)
self.verticalLayout_2 = QtGui.QVBoxLayout()
self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2"))
spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout_2.addItem(spacerItem)
self.bouton_haut = QtGui.QPushButton(self.dialogConfig)
self.bouton_haut.setText("Haut")
self.bouton_haut.setObjectName(_fromUtf8("bouton_haut"))
self.verticalLayout_2.addWidget(self.bouton_haut)
self.bouton_bas = QtGui.QPushButton(self.dialogConfig)
self.bouton_bas.setText("Bas")
self.bouton_bas.setObjectName(_fromUtf8("bouton_bas"))
self.verticalLayout_2.addWidget(self.bouton_bas)
spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.verticalLayout_2.addItem(spacerItem1)
self.horizontalLayout_2.addLayout(self.verticalLayout_2)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout.addLayout(self.verticalLayout)
self.buttonBox = QtGui.QDialogButtonBox(self.dialogConfig)
self.buttonBox.setOrientation(QtCore.Qt.Vertical)
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), self.dialogConfig.reject)
#########################
self.bouton_nouveau = QtGui.QPushButton("Nouveau", self.dialogConfig)
self.buttonBox.addButton(self.bouton_nouveau,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_nouveau,QtCore.SIGNAL("clicked()"),self.element_nouveau)
self.bouton_valider_nouveau = QtGui.QPushButton("Valider Nouv", self.dialogConfig)
self.buttonBox.addButton(self.bouton_valider_nouveau,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_valider_nouveau,QtCore.SIGNAL("clicked()"),self.valider_nouveau)
self.bouton_modifier = QtGui.QPushButton("Modifier", self.dialogConfig)
self.buttonBox.addButton(self.bouton_modifier,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_modifier,QtCore.SIGNAL("clicked()"),self.element_modifier)
self.bouton_valider_modif = QtGui.QPushButton("Valider Modif", self.dialogConfig)
self.buttonBox.addButton(self.bouton_valider_modif,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_valider_modif,QtCore.SIGNAL("clicked()"),self.valider_modif)
self.bouton_supprimer = QtGui.QPushButton("Supprimer", self.dialogConfig)
self.buttonBox.addButton(self.bouton_supprimer,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_supprimer,QtCore.SIGNAL("clicked()"),self.supprimer)
#spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
#self.buttonBox.addButton(spacerItem2)
self.bouton_defaut = QtGui.QPushButton("Définir par \ndéfaut", self.dialogConfig)
self.buttonBox.addButton(self.bouton_defaut,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_defaut,QtCore.SIGNAL("clicked()"),self.element_par_defaut)
self.bouton_annuler = QtGui.QPushButton("Annuler", self.dialogConfig)
self.buttonBox.addButton(self.bouton_annuler,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_annuler,QtCore.SIGNAL("clicked()"),self.element_annuler)
self.bouton_fermer2 = QtGui.QPushButton("Fermer", self.dialogConfig)
self.buttonBox.addButton(self.bouton_fermer2,QtGui.QDialogButtonBox.ActionRole)
QtCore.QObject.connect(self.bouton_fermer2,QtCore.SIGNAL("clicked()"),self.element_fermer)
self.horizontalLayout.addWidget(self.buttonBox)
#QtCore.QObject.connect(self.listConfig,QtCore.SIGNAL("itemClicked(QListWidgetItem *)"),self.selection_item2) #action sur le listWidget de gauche
#QtCore.QObject.connect(self.listConfig,QtCore.SIGNAL("currentItemChanged(QListWidgetItem *,QListWidgetItem *)"),self.selection_item2) #action sur le listWidget de gauche
QtCore.QObject.connect(self.listConfig,QtCore.SIGNAL("itemSelectionChanged()"),self.selection_item2) #action sur le listWidget de gauche
QtCore.QObject.connect(self.bouton_haut,QtCore.SIGNAL("clicked()"),lambda self=self, haut_ou_bas="haut": self.element_bouton_haut_ou_bas(haut_ou_bas))
QtCore.QObject.connect(self.bouton_bas,QtCore.SIGNAL("clicked()"),lambda self=self, haut_ou_bas="bas": self.element_bouton_haut_ou_bas(haut_ou_bas))
self.affichage_initial()
self.dialogConfig.show()
self.remplissage_GLOBAL_mon_tuple_de_tuple_des_configs()
#######
"""
self.bouton_nouveau self.element_nouveau
self.bouton_valider_nouveau self.valider_nouveau
self.bouton_modifier self.element_modifer
self.bouton_valider_modif self.valider_modif
self.bouton_supprimer self.supprimer
self.bouton_defaut self.element_par_defaut
self.bouton_annuler self.element_annuler
self.bouton_fermer2 self.element_fermer
"""
def affichage_initial(self):
self.bouton_nouveau.show()
self.bouton_valider_nouveau.hide()
self.bouton_modifier.show()
self.bouton_valider_modif.hide()
self.bouton_supprimer.show()
self.bouton_defaut.show()
self.bouton_annuler.hide()
self.bouton_fermer2.show()
self.lineEdit.setEnabled(False)
self.listConfig.setEnabled(True)
self.tableColonnes.setEnabled(False)
self.bouton_haut.setEnabled(False)
self.bouton_bas.setEnabled(False)
if self.listConfig.currentRow() == -1:
self.bouton_modifier.setEnabled(False)
self.bouton_supprimer.setEnabled(False)
self.bouton_defaut.setEnabled(False)
def element_nouveau(self):
if GLOBAL_mode_debuggage == 'oui': print "element_nouveau"
self.bouton_nouveau.hide()
self.bouton_valider_nouveau.show()
self.bouton_modifier.hide()
self.bouton_valider_modif.hide()
self.bouton_supprimer.hide()
self.bouton_defaut.hide()
self.bouton_annuler.show()
self.bouton_fermer2.hide()
self.lineEdit.setEnabled(True)
self.listConfig.setEnabled(False)
self.tableColonnes.setEnabled(True)
self.bouton_haut.setEnabled(True)
self.bouton_bas.setEnabled(True)
self.lineEdit.setText('')
self.listConfig.setCurrentRow(-1)
self.selection_item2() #appelle la fonction selection_item2 pour la toute première initialisation
def element_modifier(self):
if GLOBAL_mode_debuggage == 'oui': print "element_nouveau"
self.bouton_nouveau.hide()
self.bouton_valider_nouveau.hide()
self.bouton_modifier.hide()
self.bouton_valider_modif.show()
self.bouton_supprimer.hide()
self.bouton_defaut.hide()
self.bouton_annuler.show()
self.bouton_fermer2.hide()
self.lineEdit.setEnabled(True)
self.listConfig.setEnabled(False)
self.tableColonnes.setEnabled(True)
self.bouton_haut.setEnabled(True)
self.bouton_bas.setEnabled(True)
def valider_nouveau(self):
if GLOBAL_mode_debuggage == 'oui': print "def element_valider_nouv_ou_modif_ou_enreg"
doublon = "non"
#on vérifie que le lineedit n'est pas nul et qu'il n'y a pas de doublon avec la base
if self.lineEdit.text() != "":
for elem in GLOBAL_mon_tuple_de_tuple_des_configs:
if GLOBAL_mode_debuggage == 'oui': print "elem[0]"
if GLOBAL_mode_debuggage == 'oui': print elem[0]
#GESTION DOUBLON
if (elem[0]) == (self.lineEdit.text()): #doublon trouvé
texte_titre = "Doublon interdit !"
msg_debut = "La configuration:\n "
msg_debut2 = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
msg_variable = unicode(elem[0], "iso-8859-1") # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg_fin = "\nexiste déjà"
msg_fin2 = unicode(msg_fin, "iso-8859-1")
msg_total = msg_debut2 + msg_variable + msg_fin2
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.element_annuler() #raz affichage
doublon = "oui"
if doublon == "non": # pas de doublon, on insère dans MySQL
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
##ENVOI EN UNICODE DE TOUTES LES VALEURS dans la base MySQL ET TOUT SE PASSE TRES BIEN !!!
if GLOBAL_mode_debuggage == 'oui': print "insertion nouveau2"
if GLOBAL_mode_debuggage == 'oui': print self.table_liste_des_configs
if GLOBAL_mode_debuggage == 'oui': print unicode(self.table_liste_des_configs)
if GLOBAL_mode_debuggage == 'oui': print repr( unicode(self.table_liste_des_configs))
if GLOBAL_mode_debuggage == 'oui': print unicode(self.lineEdit.text())
if GLOBAL_mode_debuggage == 'oui': print repr(unicode(self.lineEdit.text()))
# http://stackoverflow.com/questions/775296/python-mysql-with-variables gestion des injection SQL grâce à la virgule
cur.execute("insert into preferences_utilisateurs (nom_utilisateur) values (%s)" ,(unicode(self.lineEdit.text())))
cur.close()
id.commit()
id.close()
#on réactualise la liste de gauche des configs puis on retrouve sa valeur dans les champs et on lance "valider modif"
QtCore.QObject.disconnect(self.listConfig,QtCore.SIGNAL("itemSelectionChanged()"),self.selection_item2) #action sur le listWidget de gauche
#if GLOBAL_mode_debuggage == 'oui': print "self.lineEdit.text()"
#if GLOBAL_mode_debuggage == 'oui': print unicode(self.lineEdit.text()).encode("CP850")
self.remplissage_GLOBAL_mon_tuple_de_tuple_des_configs()
#if GLOBAL_mode_debuggage == 'oui': print "self.lineEdit.text()"
#if GLOBAL_mode_debuggage == 'oui': print unicode(self.lineEdit.text()).encode("CP850")
#list-of-QListWidgetItem findItems (self, QString text, Qt.MatchFlags flags)
#mon_mes_items = self.listConfig.findItems(self.lineEdit.text(), QtCore.Qt.MatchRegExp)
mon_mes_items = self.listConfig.findItems(self.lineEdit.text(), QtCore.Qt.MatchFlags())
for piti_item in mon_mes_items:
if GLOBAL_mode_debuggage == 'oui': print "piti_item.text()"
if GLOBAL_mode_debuggage == 'oui': print unicode(piti_item.text()).encode("CP850")
self.listConfig.setCurrentItem(piti_item)
self.listConfig.scrollToItem(piti_item)
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
if GLOBAL_mode_debuggage == 'oui': print "item nouveau avant moulinette modif"
if GLOBAL_mode_debuggage == 'oui': print unicode(self.listConfig.currentItem().text()).encode("CP850")
QtCore.QObject.connect(self.listConfig,QtCore.SIGNAL("itemSelectionChanged()"),self.selection_item2) #action sur le listWidget de gauche
self.valider_modif("nouveau")
#self.affichage_initial()
elif self.lineEdit.text() == "":
texte_titre = "Pas de titre !"
msg_total = "Vous devez rentrer une valeur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.element_annuler() #raz affichage
def valider_modif(self, nouv_ou_modif = "modif"):
if GLOBAL_mode_debuggage == 'oui': print "Valider _modif"
num_ligne = self.listConfig.currentRow()
if GLOBAL_mode_debuggage == 'oui': print unicode(self.listConfig.item(num_ligne).text()).encode("cp850")
doublon = "non"
#on vérifie que le lineedit n'est pas nul et qu'il n'y a pas de doublon avec la base
if self.lineEdit.text() != "" and self.listConfig.currentRow() != -1:
try:
### partie ordre des champs + UPDATE de tout le monde ###
if GLOBAL_mode_debuggage == 'oui': print "valider modif"
#marche à suivre:
#intervertir la matrice en retenant l'ordre uniquement
nouvelle_matrice_colonnes_scroll = []
nouvelle_matrice_colonnes_scroll.append(0)
for i in range(self.tableColonnes.rowCount()):
mon_num = self.tableColonnes.item(i,0).data(0).toString()
nouvelle_matrice_colonnes_scroll.append(int(mon_num))
if GLOBAL_mode_debuggage == 'oui': print "nouvelle_matrice_colonnes_scroll"
#if GLOBAL_mode_debuggage == 'oui': print nouvelle_matrice_colonnes_scroll
if nouv_ou_modif == "modif":
ancien_text = unicode(self.listConfig.item(num_ligne).text())
nouveau_text = unicode(self.lineEdit.text())
elif nouv_ou_modif == "nouveau":
ancien_text = unicode(self.listConfig.item(num_ligne).text())
nouveau_text = ancien_text
if GLOBAL_mode_debuggage == 'oui': print "ancien_text"
if GLOBAL_mode_debuggage == 'oui': print ancien_text
if GLOBAL_mode_debuggage == 'oui': print "nouveau_text"
if GLOBAL_mode_debuggage == 'oui': print nouveau_text
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#cur.execute("UPDATE preferences_utilisateurs SET nom_utilisateur=%s, ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" ,(nouveau_text, str(nouvelle_matrice_colonnes_scroll),ancien_text))
cur.execute("UPDATE preferences_utilisateurs SET nom_utilisateur=%s, ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" , \
(nouveau_text, str(nouvelle_matrice_colonnes_scroll),ancien_text))
cur.close()
id.commit()
id.close()
#on réactualise la liste de gauche des configs!
self.remplissage_GLOBAL_mon_tuple_de_tuple_des_configs()
texte_titre = "Enregistrement effectué"
msg_debut = "Configuration:\n "
msg_debut2 = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
msg_variable = nouveau_text # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg_fin = "\nOrdre des champs enregistrés"
msg_fin2 = unicode(msg_fin, "iso-8859-1")
msg_total = msg_debut2 + msg_variable + msg_fin2
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.affichage_initial()
except MySQLdb.IntegrityError, e:
texte_titre = "Doublon impossible"
msg_debut = "Doublon impossible ! "
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.affichage_initial()
elif self.lineEdit.text() == "":
texte_titre = "Pas de titre !"
msg_total = "Vous devez rentrer une valeur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.element_annuler() #raz affichage
def supprimer(self):
if GLOBAL_mode_debuggage == 'oui': print "supprimer"
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
##ENVOI EN UNICODE DE TOUTES LES VALEURS dans la base MySQL ET TOUT SE PASSE TRES BIEN !!!
ligne_aactu = self.listConfig.currentItem()
text_actuel = ligne_aactu.text()
cur.execute("delete from preferences_utilisateurs where (nom_utilisateur = %s)" ,(unicode(text_actuel)))
for i in range (self.tableColonnes.rowCount()):
self.tableColonnes.removeRow(0)
cur.close()
id.commit()
id.close()
self.lineEdit.setText('')
#on réactualise la liste de gauche des configs!
self.remplissage_GLOBAL_mon_tuple_de_tuple_des_configs()
def element_par_defaut(self):
global GLOBAL_config_actuelle_finale
ma_var_defaut = self.listConfig.currentItem().text()
GLOBAL_config_actuelle_finale = ma_var_defaut
self.line_edit_config_en_cours.setText(GLOBAL_config_actuelle_finale)
#statusBar dans mon_form
ma_var1 = 'Config: '
ma_var_tot = ma_var1 + GLOBAL_config_actuelle_finale
mon_form.mon_Qlabel_status_bar.setText(ma_var_tot)
#qmessagebox
texte_titre = "Config en cours !"
msg_debut = "Configuration en cours:\n "
msg_debut2 = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code Notepad est en ANSI ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
msg_variable = unicode(GLOBAL_config_actuelle_finale) # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
#rechargement des fenetres
mon_form.initialisation_et_chargement()
if GLOBAL_mode_debuggage == 'oui': print "zaza38"
msg_total = msg_debut2 + msg_variable
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('config_par_defaut/nom_config', GLOBAL_config_actuelle_finale)
#GLOBAL_config_actuelle_finale = unicode("dada28", "iso-8859-1")
#on vire toutes les lignes de la Bdg recherche s'il y en a
mon_form.effacer()
def element_annuler(self):
self.affichage_initial()
def element_fermer(self):
if GLOBAL_mode_debuggage == 'oui': print "element_fermer"
self.dialogConfig.close()
def element_bouton_haut_ou_bas(self,haut_ou_bas):
if GLOBAL_mode_debuggage == 'oui': print "def element_bouton_haut_ou_bas"
if GLOBAL_mode_debuggage == 'oui': print haut_ou_bas
if GLOBAL_mode_debuggage == 'oui': print self.tableColonnes.currentRow()
if self.tableColonnes.currentRow() == -1 or self.tableColonnes.currentRow() == None:
if GLOBAL_mode_debuggage == 'oui': print "ligne non selectionnee"
else:
if haut_ou_bas == "haut":
self.moveUp()
elif haut_ou_bas == "bas":
self.moveDown()
def moveDown(self):
row = self.tableColonnes.currentRow()
column = self.tableColonnes.currentColumn()
if row < self.tableColonnes.rowCount()-1:
self.tableColonnes.insertRow(row+2)
for i in range(self.tableColonnes.columnCount()):
self.tableColonnes.setItem(row+2,i,self.tableColonnes.takeItem(row,i))
self.tableColonnes.setCurrentCell(row+2,column)
self.tableColonnes.removeRow(row)
self.tableColonnes.resizeRowsToContents()
def moveUp(self):
row = self.tableColonnes.currentRow()
column = self.tableColonnes.currentColumn()
if row > 0:
self.tableColonnes.insertRow(row-1)
for i in range(self.tableColonnes.columnCount()):
self.tableColonnes.setItem(row-1,i,self.tableColonnes.takeItem(row+1,i))
self.tableColonnes.setCurrentCell(row-1,column)
self.tableColonnes.removeRow(row+1)
self.tableColonnes.resizeRowsToContents()
def remplissage_GLOBAL_mon_tuple_de_tuple_des_configs(self):
global GLOBAL_mon_tuple_de_tuple_des_configs
if GLOBAL_mode_debuggage == 'oui': print "\ndef remplissage_GLOBAL_mon_tuple_de_tuple_des_configs"
#if GLOBAL_mode_debuggage == 'oui': print self.table_liste_des_configs
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
cur.execute("select * from %s ORDER BY 1 ASC" % self.table_liste_des_configs)
#cur.execute("select * from %s order by affaire_QLE" % mysql_Nom_de_table)
#cur.execute("SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '%s'" % mysql_Nom_de_table)
GLOBAL_mon_tuple_de_tuple_des_configs = list(cur.fetchall())
cur.close()
id.commit()
id.close()
#if GLOBAL_mode_debuggage == 'oui': print GLOBAL_mon_tuple_de_tuple_des_configs #toutes la base est dedans
#if GLOBAL_mode_debuggage == 'oui': print "%d lignes\n" % cur.rowcount
if GLOBAL_mode_debuggage == 'oui': print "Remplissage Qscroll Area de fenetre"
nb_total_champs = len(GLOBAL_mon_tuple_de_tuple_des_configs)
#if GLOBAL_mode_debuggage == 'oui': print nb_total_champs
self.listConfig.clear()
for elem in GLOBAL_mon_tuple_de_tuple_des_configs:
monItem = QtGui.QListWidgetItem(elem[0])
self.listConfig.addItem(monItem)
if GLOBAL_config_actuelle_finale != "" or GLOBAL_config_actuelle_finale != "_":
#http://stackoverflow.com/questions/4629584/pyqt4-how-do-you-iterate-all-items-in-a-qlistwidget
mon_mes_items = self.listConfig.findItems(GLOBAL_config_actuelle_finale, QtCore.Qt.MatchFlags())
for piti_item in mon_mes_items:
self.listConfig.setCurrentItem(piti_item)
self.listConfig.scrollToItem(piti_item)
def selection_item2(self):
if self.listConfig.currentRow() != -1:
self.bouton_modifier.setEnabled(True)
self.bouton_supprimer.setEnabled(True)
self.bouton_defaut.setEnabled(True)
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - num_ligne_item_actuel"
#if GLOBAL_mode_debuggage == 'oui': print monqlistwidgetitem.text()
#if GLOBAL_mode_debuggage == 'oui': print GLOBAL_mon_tuple_de_tuple_des_configs
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - self.tableColonnes.rowCount()"
if GLOBAL_mode_debuggage == 'oui': print self.tableColonnes.rowCount()
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - GLOBAL_mon_tuple_de_tuple_ORIGINAL"
#if GLOBAL_mode_debuggage == 'oui': print len(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
#if GLOBAL_mode_debuggage == 'oui': print GLOBAL_mon_tuple_de_tuple_ORIGINAL
#on actualise le text dans le lineEdit du haut ou réciproquement
try:
mon_text_actuel = self.listConfig.currentItem().text()
self.lineEdit.setText(mon_text_actuel)
except:
mon_text_actuel = self.lineEdit.text()
for i in range (self.tableColonnes.rowCount()):
self.tableColonnes.removeRow(0)
correspondance = "non"
for elem in GLOBAL_mon_tuple_de_tuple_des_configs:
if elem[0] == mon_text_actuel and elem[3] != None:
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - correspondance ok"
correspondance = "oui"
if elem[1] == "":
self.lineEdit_info.setText('Liste non enregistrée')
else:
self.lineEdit_info.setText('Liste enregistrée')
ligne_config_actuelle = self.listConfig.currentRow()
if correspondance == "non" or ligne_config_actuelle == -1:
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - correspondance: non ou bien ligne a -1"
self.lineEdit_info.setText('Liste non enregistrée')
self.tableColonnes.clear()
i=0
for element in (GLOBAL_mon_tuple_de_tuple_ORIGINAL):
#if element[5] != None:
self.tableColonnes.insertRow(self.tableColonnes.rowCount()) #insere ligne à la dernière ligne
self.tableColonnes.setItem(self.tableColonnes.rowCount()-1,0,QtGui.QTableWidgetItem((unicode(i))))
self.tableColonnes.setItem(self.tableColonnes.rowCount()-1,1,QtGui.QTableWidgetItem((element[6])))
i=i+1
self.tableColonnes.removeRow(0) #suppression de la première ligne INDEX
elif correspondance == "oui" and ligne_config_actuelle != -1:
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - correspondance: oui"
list_ordre_de_transposition = eval(GLOBAL_mon_tuple_de_tuple_des_configs[ligne_config_actuelle][3])
if GLOBAL_mode_debuggage == 'oui': print ("selection_item2 - ligne_config_actuelle: %s" % (ligne_config_actuelle))
if GLOBAL_mode_debuggage == 'oui': print "selection_item2 - list_ordre_de_transposition- taille: %s" % (len(list_ordre_de_transposition))
if GLOBAL_mode_debuggage == 'oui': print list_ordre_de_transposition
mon_transpose = Transposition_selon_ordre()
#mon_transpose.transpose_list_multiple(self,debut_list_taille_quelconque,list_ordre_simple)
matrice_transposee = mon_transpose.transpose_list_multiple(GLOBAL_mon_tuple_de_tuple_ORIGINAL,list_ordre_de_transposition,mon_text_actuel)
#matrice_transposee contient en 0 le GLOBAL_mon_tuple_de_tuple_ORIGINAL dans le bon ordre, et en 1 le list_ordre_de_transposition rallongé ou raccourci
self.tableColonnes.clear()
i=0
for element in (matrice_transposee[0]):
#if element[5] != None:
self.tableColonnes.insertRow(self.tableColonnes.rowCount()) #insere ligne à la dernière ligne
self.tableColonnes.setItem(self.tableColonnes.rowCount()-1,0,QtGui.QTableWidgetItem(unicode(matrice_transposee[1][i])))
self.tableColonnes.setItem(self.tableColonnes.rowCount()-1,1,QtGui.QTableWidgetItem((element[6])))
i=i+1
self.tableColonnes.removeRow(0) #suppression de la première ligne INDEX
monheaderH = self.tableColonnes.horizontalHeader()
monheaderH.hide()
monheaderV = self.tableColonnes.verticalHeader()
monheaderV.hide()
self.tableColonnes.resizeColumnsToContents()
self.tableColonnes.resizeRowsToContents()
#empêche l'édition du tableau - éditable
self.tableColonnes.setItemDelegate(QtGui.QItemDelegate(self.tableColonnes))
toto = QtGui.QAbstractItemView.NoEditTriggers
self.tableColonnes.setEditTriggers(toto)
#sélection de la ligne au lieu de la cellule cliquée
titi = QtGui.QAbstractItemView.SelectRows
self.tableColonnes.setSelectionBehavior(titi)
#désactive la sélection multiple
self.tableColonnes.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) #désactive la sélection multiple
class Ui_MainWindow_surclasse(Ui_MainWindow): #surclasse? le fichier Mainwindow.form en provenance de Qt
#MainWindow = QtGui.QMainWindow()
#mon_form = Ui_MainWindow_surclasse() # Ton interface,
#mon_form.setupUi2(MainWindow)
def close_Event(self, event):
if GLOBAL_mode_debuggage == 'oui': print "je ferme directement"
def setupUi2(self,Form):
"""Ajoutons ce qu'il manque à la fenêtre"""
self.ma_fenetreMain = Form #promotion: permet de monter d'un cran la fenetre et de l'utiliser ailleurs
Ui_MainWindow.setupUi(self, self.ma_fenetreMain) # on charge la fenetre en provenance de modélisation via Qt
QtCore.QObject.connect(self.qpush_rechercher,QtCore.SIGNAL("clicked()"),self.rechercher)
QtCore.QObject.connect(self.qpush_effacer,QtCore.SIGNAL("clicked()"),self.effacer)
QtCore.QObject.connect(self.qpush_nouveau,QtCore.SIGNAL("clicked()"),self.FICHE_nouveau)
QtCore.QObject.connect(self.qpush_modifier,QtCore.SIGNAL("clicked()"),self.FICHE_modifier)
QtCore.QObject.connect(self.qpush_supprimer,QtCore.SIGNAL("clicked()"),self.FICHE_supprimer)
QtCore.QObject.connect(self.lineEdit_rapide,QtCore.SIGNAL("textEdited(const QString&)"),self.recherche_rapide)
self.ma_fenetreMain.closeEvent = self.close_Event
QtCore.QObject.connect(self.CBBX_archives_ou_affaires,QtCore.SIGNAL("currentIndexChanged(int)"),self.pre_recherche_rapide)
self.lineEdit_rapide.setToolTip("Recherche rapide ne tenant pas compte du tableau de paramètres de tri")
self.lineEdit_rapide.setStatusTip("youpi defure")
QtCore.QObject.connect(self.lineEdit_rapide,QtCore.SIGNAL("returnPressed()"),self.pre_recherche_rapide)
self.qpush_valider_nouveau = QtGui.QPushButton(self.groupBox)
self.qpush_valider_nouveau.setText(QtGui.QApplication.translate("MainWindow", "Valider nouveau", None, QtGui.QApplication.UnicodeUTF8))
self.qpush_valider_nouveau.setObjectName(_fromUtf8("qpush_modifier"))
self.verticalLayout_8.addWidget(self.qpush_valider_nouveau)
#QtCore.QObject.connect(self.qpush_valider_nouveau,QtCore.SIGNAL("clicked()"),self.FICHE_valider_nouveau_ou_modif('nouveau'))
QtCore.QObject.connect(self.qpush_valider_nouveau,QtCore.SIGNAL("clicked()"),self.FICHE_valider_nouveau_ou_modif)
self.qpush_valider_modif = QtGui.QPushButton(self.groupBox)
self.qpush_valider_modif.setText(QtGui.QApplication.translate("MainWindow", "Valider modif", None, QtGui.QApplication.UnicodeUTF8))
self.qpush_valider_modif.setObjectName(_fromUtf8("qpush_modifier"))
self.verticalLayout_8.addWidget(self.qpush_valider_modif)
QtCore.QObject.connect(self.qpush_valider_modif,QtCore.SIGNAL("clicked()"),self.FICHE_valider_modif)
self.qpush_annuler = QtGui.QPushButton(self.groupBox)
self.qpush_annuler.setText(QtGui.QApplication.translate("MainWindow", "Annuler", None, QtGui.QApplication.UnicodeUTF8))
self.qpush_annuler.setObjectName(_fromUtf8("qpush_modifier"))
self.verticalLayout_8.addWidget(self.qpush_annuler)
QtCore.QObject.connect(self.qpush_annuler,QtCore.SIGNAL("clicked()"),self.FICHE_annuler)
#visu
self.qpush_nouveau.show()
self.qpush_modifier.show()
self.qpush_supprimer.show()
self.qpush_valider_nouveau.hide()
self.qpush_valider_modif.hide()
self.qpush_annuler.hide()
#tableau résultat
QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("cellDoubleClicked(int,int)"),self.ouvrir_explorateur)
# QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("cellClicked(int,int)"),self.RESULTAT_cell_clickee)
# QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("currentCellChanged(int,int,int,int)"),self.RESULTAT_cell_clickee)
#q radio par défaut
self.type_de_recherche.addItem("valident toutes")
self.type_de_recherche.addItem("valident au moins une")
self.type_de_recherche.addItem("valident ligne 1 ET ( x OU y OU z OU ...)")
self.type_de_recherche.addItem("valident ligne 1 ET 2 ET ( x OU y OU z OU ...)")
#TABLEAU DES PARAMETRES
self.qtableWidget_param.setColumnCount(5)
self.qtableWidget_param.setColumnWidth(1,110)
self.qtableWidget_param.setColumnWidth(2,50)
self.qtableWidget_param.setColumnWidth(3,30)
self.qtableWidget_param.setColumnWidth(4,30)
#tableau de tri
monheaderview = self.qtableWidget_param.horizontalHeader()
monheaderview.setResizeMode(0, QtGui.QHeaderView.Stretch)
monheaderview.setResizeMode(1, QtGui.QHeaderView.Fixed)
monheaderview.setResizeMode(2, QtGui.QHeaderView.Stretch)
monheaderview.setResizeMode(3, QtGui.QHeaderView.Fixed)
monheaderview.setResizeMode(4, QtGui.QHeaderView.Fixed)
mon_header = self.qtableWidget_param.horizontalHeader()
mon_header.hide()
mon_header2 = self.qtableWidget_param.verticalHeader()
mon_header2.hide()
#ma_barre_policy_vertical = QtCore.Qt.ScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
#form.tableWidget_resultat1.setVerticalScrollBarPolicy(ma_barre_policy_vertical)
###imprimer
#menu barre du haut
#menu
self.actionImprimer = QtGui.QMenu()
self.actionImprimer.setEnabled(True)
self.actionImprimer.setTitle(_fromUtf8("Imprimer"))
#QtCore.QObject.connect(self.actionImprimer, QtCore.SIGNAL(_fromUtf8('triggered(QAction *)')), self.MENU_BAR_fonction_imprimer) #très malin, c'esl Qmenu et non pas le Qaction qui créé le signal!!!
self.menubar.addMenu(self.actionImprimer)
separateur_debug = QtGui.QAction(self.menubar)
QtCore.QObject.connect(separateur_debug, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fonction_activer_debug)
separateur_debug.setSeparator(True)
self.menubar.addAction(separateur_debug)
#separateur_debug.setShortcut('Ctrl+D+E+B+U+G')
separateur_debug.setShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_B,QtCore.Qt.CTRL + QtCore.Qt.Key_U,QtCore.Qt.CTRL + QtCore.Qt.Key_G))
explorateur_fichier = QtGui.QAction(self.menubar)
QtCore.QObject.connect(explorateur_fichier, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fonction_activer_explorateur_fichier)
explorateur_fichier.setSeparator(True)
self.menubar.addAction(explorateur_fichier)
#explorateur_fichier.setShortcut('Ctrl+D+E+B+U+G')
explorateur_fichier.setShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_E,QtCore.Qt.CTRL + QtCore.Qt.Key_X,QtCore.Qt.CTRL + QtCore.Qt.Key_P))
deplacement_fichier = QtGui.QAction(self.menubar)
QtCore.QObject.connect(deplacement_fichier, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fonction_activer_deplacement_de_fichier)
deplacement_fichier.setSeparator(True)
self.menubar.addAction(deplacement_fichier)
#explorateur_fichier.setShortcut('Ctrl+D+E+B+U+G')
deplacement_fichier.setShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_D,QtCore.Qt.CTRL + QtCore.Qt.Key_E,QtCore.Qt.CTRL + QtCore.Qt.Key_P))
#sous-menu actionImprimer
connexions = QtGui.QAction(unicode("Tableaux de références","iso-8859-1"), self.actionImprimer)
connexions.setEnabled(True)
QtCore.QObject.connect(connexions, QtCore.SIGNAL(_fromUtf8('triggered()')), self.impression_references)
self.actionImprimer.addAction(connexions)
connexions = QtGui.QAction(unicode("Tableaux utilisateurs","iso-8859-1"), self.actionImprimer)
connexions.setEnabled(True)
QtCore.QObject.connect(connexions, QtCore.SIGNAL(_fromUtf8('triggered()')), self.impression_utilisateurs)
self.actionImprimer.addAction(connexions)
connexions = QtGui.QAction(unicode("Tableaux à l'identique","iso-8859-1"), self.actionImprimer)
connexions.setEnabled(True)
QtCore.QObject.connect(connexions, QtCore.SIGNAL(_fromUtf8('triggered()')), self.impression_a_l_identique)
self.actionImprimer.addAction(connexions)
##parametre
#menu actionParametres
self.actionParametres = QtGui.QMenu()
self.actionParametres.setEnabled(True)
mon_titre = "Paramètres"
mon_titre2 = unicode(mon_titre, "iso-8859-1")
self.actionParametres.setTitle(mon_titre2)
#QtCore.QObject.connect(self.actionParametres, QtCore.SIGNAL(_fromUtf8('triggered(QAction *)')), self.MENU_BAR_fonction_parametres) #très malin, c'esl Qmenu et non pas le Qaction qui créé le signal!!!
self.menubar.addMenu(self.actionParametres)
#sous-menu actionParametres
self.selection_config = QtGui.QMenu()
self.selection_config.setEnabled(True)
self.selection_config.setTitle(unicode("Configurations","iso-8859-1"))
QtCore.QObject.connect(self.selection_config, QtCore.SIGNAL(_fromUtf8('triggered(QAction *)')), self.actions_du_sous_menu)
#très malin, c'esl Qmenu et non pas le Qaction qui créé le signal!!!
self.actionParametres.addMenu(self.selection_config)
self.SOUS_MENU_BAR_configurations()
connexions = QtGui.QAction("Connexions", self.actionParametres)
connexions.setEnabled(True)
QtCore.QObject.connect(connexions, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fenetre_gestion_connexions)
self.actionParametres.addAction(connexions)
##point d'interrogation
#menu action_pt_interrogation
self.action_pt_interrogation = QtGui.QMenu()
self.action_pt_interrogation.setEnabled(True)
mon_titre = "?"
mon_titre2 = unicode(mon_titre, "iso-8859-1")
self.action_pt_interrogation.setTitle(mon_titre2)
#QtCore.QObject.connect(self.action_pt_interrogation, QtCore.SIGNAL(_fromUtf8('triggered(QAction *)')), self.MENU_BAR_fonction_parametres) #très malin, c'esl Qmenu et non pas le Qaction qui créé le signal!!!
self.menubar.addMenu(self.action_pt_interrogation)
#sous-menu action_pt_interrogation
connexions = QtGui.QAction("A propos", self.action_pt_interrogation)
connexions.setEnabled(True)
QtCore.QObject.connect(connexions, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fenetre_version)
self.action_pt_interrogation.addAction(connexions)
##autres
#statusBar dans mon_form
ma_var1 = 'Config: '
ma_var_tot = ma_var1 + GLOBAL_config_actuelle_finale
self.mon_Qlabel_status_bar = QtGui.QLabel()
self.mon_Qlabel_status_bar.setObjectName("mon_status_config")
self.mon_Qlabel_status_bar.setText(ma_var_tot)
self.statusbar.addPermanentWidget(self.mon_Qlabel_status_bar) #removeWidget()
#self.statusbar.showMessage('nom de la config')
self.mon_Qlabel_status_bar2 = QtGui.QLabel()
self.mon_Qlabel_status_bar2.setText(unicode("Lignes trouvées: ", "iso-8859-1"))
self.statusbar.addPermanentWidget(self.mon_Qlabel_status_bar2)
#self.statusbar.showMessage('nom de la config')
self.mon_Qlabel_status_bar3 = QtGui.QLabel()
self.mon_Qlabel_status_bar3.setText(unicode("Affaire: "))
self.statusbar.addWidget(self.mon_Qlabel_status_bar3)
#archives check box
self.CBBX_archives_ou_affaires.hide()
self.label_recherche_sur.hide()
self.CBBX_archives_ou_affaires.addItem("Affaires et concours seuls")
self.CBBX_archives_ou_affaires.setItemData(0, "Affaires et concours seuls", QtCore.Qt.ToolTipRole)
self.CBBX_archives_ou_affaires.addItem("Affaires archivées seules")
self.CBBX_archives_ou_affaires.setItemData(1, "Affaires archivées seules", QtCore.Qt.ToolTipRole)
self.CBBX_archives_ou_affaires.addItem("Tout y compris archives")
self.CBBX_archives_ou_affaires.setItemData(2, "Tout y compris archives", QtCore.Qt.ToolTipRole)
#clic droit dans qtableWidget_resultat
self.qtableWidget_resultat.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
self.action_droit_unique = QtGui.QAction(unicode('Mode sélection unique (mode par défaut)',"iso-8859-1"), self.qtableWidget_resultat)
#exec("action10.setIcon(QtGui.QIcon(_fromUtf8('%s%s')))" % (chemin_icone, "/Circ1.png"))
QtCore.QObject.connect(self.action_droit_unique, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fonction_action_droit_unique)
self.qtableWidget_resultat.addAction(self.action_droit_unique)
self.action_droit_unique.setEnabled(False)
self.action_droit_multiple = QtGui.QAction(unicode('Mode modification multiple',"iso-8859-1"), self.qtableWidget_resultat)
#exec("action10.setIcon(QtGui.QIcon(_fromUtf8('%s%s')))" % (chemin_icone, "/Circ1.png"))
QtCore.QObject.connect(self.action_droit_multiple, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fonction_action_droit_multiple)
self.qtableWidget_resultat.addAction(self.action_droit_multiple)
self.action_droit_multiple.setEnabled(True)
separateur_debug = QtGui.QAction(self.qtableWidget_resultat)
separateur_debug.setSeparator(True)
self.qtableWidget_resultat.addAction(separateur_debug)
self.action_dupliquer_ligne = QtGui.QAction(unicode('Dupliquer cette affaire',"iso-8859-1"), self.qtableWidget_resultat)
#exec("action10.setIcon(QtGui.QIcon(_fromUtf8('%s%s')))" % (chemin_icone, "/Circ1.png"))
QtCore.QObject.connect(self.action_dupliquer_ligne, QtCore.SIGNAL(_fromUtf8('triggered()')), self.fonction_action_dupliquer_ligne)
self.qtableWidget_resultat.addAction(self.action_dupliquer_ligne)
self.action_dupliquer_ligne.setEnabled(True)
#combobox type de tri
QtCore.QObject.connect(self.type_de_recherche,QtCore.SIGNAL("currentIndexChanged(int)"),self.coloriage_de_qtableWidget_param)
self.qtableWidget_resultat.setAlternatingRowColors(True) #coloriage alternatif des lignes
#presse papier clipboard
#self.mon_clipboard = QtGui.QApplication.clipboard()
#QtCore.QObject.connect(self.mon_clipboard,QtCore.SIGNAL("dataChanged()"),self.gestion_clipboard)
#INITIALISATION ET CHARGEMENT
self.initialisation_et_chargement()
if GLOBAL_mode_debuggage == 'oui': print "zaza39"
def fonction_action_dupliquer_ligne(self):
print "dupliquer ligne en mysql"
self.FICHE_valider_nouveau_ou_modif(nouveau_ou_modif = "duplique")
"""
def gestion_clipboard(self):
le_mimedata = self.mon_clipboard.mimeData()
if le_mimedata.hasImage() == True:
self.mon_clipboard.setText("collage impossible")
else:
self.mon_clipboard.setText(le_mimedata.text())
"""
def coloriage_de_qtableWidget_param(self):
#COULEUR
noir = QtGui.QColor("black")
blanc = QtGui.QColor("white")
rouge = QtGui.QColor("red")
gris_clair = QtGui.QColor(173,216,230) #bleu acier
violet_pale = QtGui.QColor(216,191,216) #vert
mapalette_origine = QtGui.QPalette()
mapalette_origine.setColor(QtGui.QPalette.Text, noir)
mapalette_origine.setColor(QtGui.QPalette.Base, blanc)
mapalette_nouveau = QtGui.QPalette()
mapalette_nouveau.setColor(QtGui.QPalette.Text, noir)
mapalette_nouveau.setColor(QtGui.QPalette.Base, gris_clair)
mapalette_modif = QtGui.QPalette()
mapalette_modif.setColor(QtGui.QPalette.Text, noir)
mapalette_modif.setColor(QtGui.QPalette.Base, violet_pale)
mapalette_suppr = QtGui.QPalette()
mapalette_suppr.setColor(QtGui.QPalette.Text, noir)
mapalette_suppr.setColor(QtGui.QPalette.Base, rouge)
QCB = QtGui.QComboBox()
QDE = QtGui.QDateEdit()
QLE = QtGui.QLineEdit()
QTE = QTextEdit_boost_zone_text()
nb_lignes = self.qtableWidget_param.rowCount() # on recupère tous les itemsen deuicème colonne du SCROLL tableau grid
for num_ligne in range(nb_lignes):
if (num_ligne == 0 and (self.type_de_recherche.currentIndex() == 2 or self.type_de_recherche.currentIndex() == 3)) or \
(num_ligne == 1 and self.type_de_recherche.currentIndex() == 3):
for num_colonne in range(3):
mon_widget = self.qtableWidget_param.cellWidget(num_ligne,num_colonne)
if type(mon_widget) == type(QCB) or \
type(mon_widget) == type(QCB) or \
type(mon_widget) == type(QDE) or \
type(mon_widget) == type(QLE) or \
type(mon_widget) == type(QTE):
mon_widget.setPalette(mapalette_modif)
else:
for num_colonne in range(3):
mon_widget = self.qtableWidget_param.cellWidget(num_ligne,num_colonne)
mon_widget.setPalette(mapalette_origine)
def fonction_activer_deplacement_de_fichier(self):
print "deplacement_de_fichier"
global GLOBAL_deplacement_de_fichier
if GLOBAL_deplacement_de_fichier == "oui":
GLOBAL_deplacement_de_fichier = "non"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/deplacement_fichier', unicode("non"))
titre = _fromUtf8("Option deplacement de fichiers")
texte_avertissement = _fromUtf8("Deplacement de fichiers NON ACTIF")
QtGui.QMessageBox.warning(None, titre,texte_avertissement, QtGui.QMessageBox.Ok)
elif GLOBAL_deplacement_de_fichier == "non":
GLOBAL_deplacement_de_fichier = "oui"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/deplacement_fichier', unicode("oui"))
titre = _fromUtf8("Option deplacement de fichiers")
texte_avertissement = _fromUtf8("Deplacement de fichiers ACTIF")
QtGui.QMessageBox.warning(None, titre,texte_avertissement, QtGui.QMessageBox.Ok)
def fonction_activer_explorateur_fichier(self):
print "explorateur fichier"
global GLOBAL_explorateur_de_fichier
if GLOBAL_explorateur_de_fichier == "oui":
GLOBAL_explorateur_de_fichier = "non"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/explorateur_fichier', unicode("non"))
titre = _fromUtf8("Explorateur de fichier")
texte_avertissement = _fromUtf8("Explorateur de fichier NON ACTIF")
QtGui.QMessageBox.warning(None, titre,texte_avertissement, QtGui.QMessageBox.Ok)
elif GLOBAL_explorateur_de_fichier == "non":
GLOBAL_explorateur_de_fichier = "oui"
GLOBAL_explorateur_de_fichier = "oui"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/explorateur_fichier', unicode("oui"))
titre = _fromUtf8("Explorateur de fichier")
texte_avertissement = _fromUtf8("Explorateur de fichier ACTIF")
QtGui.QMessageBox.warning(None, titre,texte_avertissement, QtGui.QMessageBox.Ok)
def fonction_activer_debug(self):
print "bug-debug"
global GLOBAL_mode_debuggage
if GLOBAL_mode_debuggage == "oui":
GLOBAL_mode_debuggage = "non"
titre = _fromUtf8("Mode Normal - mode debuggage")
texte_avertissement = _fromUtf8("MODE NORMAL ACTIF")
QtGui.QMessageBox.warning(None, titre,texte_avertissement, QtGui.QMessageBox.Ok)
elif GLOBAL_mode_debuggage == "non":
GLOBAL_mode_debuggage = "oui"
titre = _fromUtf8("Mode Normal - mode debuggage")
texte_avertissement = _fromUtf8("MODE DEBUGGAGE ACTIF")
QtGui.QMessageBox.warning(None, titre,texte_avertissement, QtGui.QMessageBox.Ok)
def fonction_action_droit_unique(self):
global GLOBAL_modif_unique_ou_multiple
if GLOBAL_mode_debuggage == 'oui': print "def fonction_action_droit_unique"
if self.qtableWidget_resultat.rowCount() > 0:
GLOBAL_modif_unique_ou_multiple = "unique"
self.action_droit_unique.setEnabled(False)
self.action_droit_multiple.setEnabled(True)
self.qpush_valider_nouveau.setText(QtGui.QApplication.translate("MainWindow", "Valider nouveau", None, QtGui.QApplication.UnicodeUTF8))
#on reconnecte la relation tableau resultat et SCROLL de droite
QtCore.QObject.disconnect(self.qtableWidget_resultat,QtCore.SIGNAL("cellClicked(int,int)"),self.RESULTAT_cell_clickee)
QtCore.QObject.disconnect(self.qtableWidget_resultat,QtCore.SIGNAL("currentCellChanged(int,int,int,int)"),self.RESULTAT_cell_clickee)
QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("cellClicked(int,int)"),self.RESULTAT_cell_clickee)
QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("currentCellChanged(int,int,int,int)"),self.RESULTAT_cell_clickee)
noir = QtGui.QColor("black")
blanc = QtGui.QColor("white")
gris = QtGui.QColor("gray")
gris_clair = QtGui.QColor(173,216,230) #bleu acier
mapalette_modif_unique = QtGui.QPalette()
mapalette_modif_unique.setColor(QtGui.QPalette.Text, noir)
mapalette_modif_unique.setColor(QtGui.QPalette.Base, blanc)
for num_ligne in range(1,self.mon_grid_area.rowCount()):
mon_widget_col_1 = self.mon_grid_area.itemAtPosition(num_ligne,1).widget()
mon_label_col_0 = self.mon_grid_area.itemAtPosition(num_ligne,0).widget()
mon_widget_col_1.setPalette(mapalette_modif_unique)
mon_widget_col_1.setEnabled(False)
#active la sélection unique
self.qtableWidget_resultat.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) #désactive la sélection multiple
self.qtableWidget_resultat.setCurrentCell(self.qtableWidget_resultat.currentRow(),0)
self.qtableWidget_resultat.scrollToItem(self.qtableWidget_resultat.currentItem())
self.FICHE_annuler()
def fonction_action_droit_multiple(self):
global GLOBAL_modif_unique_ou_multiple
if GLOBAL_mode_debuggage == 'oui': print "def fonction_action_droit_multiple"
if self.qtableWidget_resultat.rowCount() > 0:
GLOBAL_modif_unique_ou_multiple = "multiple"
self.action_droit_unique.setEnabled(True)
self.action_droit_multiple.setEnabled(False)
self.qpush_valider_nouveau.setText(QtGui.QApplication.translate("MainWindow", "Valider Modif Multiple", None, QtGui.QApplication.UnicodeUTF8))
self.FICHE_nouveau() #on simule un clic sur nouveau
self.qtableWidget_resultat.setEnabled(True)
#le nom dans le mainwindow
exec("MainWindow.setWindowTitle(_fromUtf8('%s_%s - %s'))" % (GLOBAL_nom_programme, GLOBAL_version_programme, "mode multiple"))
#active la sélection multiple
self.qtableWidget_resultat.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) #active la sélection multiple
#on déconnecte la relation tableau resultat et SCROLL de droite
QtCore.QObject.disconnect(self.qtableWidget_resultat,QtCore.SIGNAL("cellClicked(int,int)"),self.RESULTAT_cell_clickee)
QtCore.QObject.disconnect(self.qtableWidget_resultat,QtCore.SIGNAL("currentCellChanged(int,int,int,int)"),self.RESULTAT_cell_clickee)
noir = QtGui.QColor("black")
blanc = QtGui.QColor("white")
gris = QtGui.QColor("gray")
gris_clair = QtGui.QColor(173,216,230) #bleu acier
mapalette_modif_multiple = QtGui.QPalette()
#mapalette_modif_multiple.setColor(QtGui.QPalette.Text, blanc)
mapalette_modif_multiple.setColor(QtGui.QPalette.Base, gris)
for num_ligne in range(1,self.mon_grid_area.rowCount()):
mon_widget_col_1 = self.mon_grid_area.itemAtPosition(num_ligne,1).widget()
mon_label_col_0 = self.mon_grid_area.itemAtPosition(num_ligne,0).widget()
mon_widget_col_1.setPalette(mapalette_modif_multiple)
mon_widget_col_1.setEnabled(False)
####message
#qmessagebox
texte_titre = "Mode modification multiple"
msg_debut = unicode("Attention, lors de la validation, tous les champs que vous aurez dégrisés en cliquant sur les libellés des champs du tableau de droite seront modifiés sur le serveur ! ", "iso-8859-1")
msg_total = msg_debut
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
#ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
###
def pre_recherche_rapide(self):
if GLOBAL_mode_debuggage == 'oui': print "zaza rapide enter"
if self.lineEdit_rapide.text() != "":
self.rechercher() # on relance le boton rechercher
def impression_references(self):
global mon_dialog_pre_imprim
mon_dialog_pre_imprim = QtGui.QDialog(MainWindow)
impression = Fenetre_pre_impression_references()
impression.setupUi_reference(mon_dialog_pre_imprim)
mon_dialog_pre_imprim.setWindowModality(QtCore.Qt.NonModal) #fenetre non modale
mon_dialog_pre_imprim.show()
def impression_utilisateurs(self):
if GLOBAL_mode_debuggage == 'oui': print "impression_utilisateurs"
printer = QtGui.QPrinter()
printer.setPageMargins(10,10,10,10,0) #0 pour unité millimetre
document=QtGui.QTextDocument()
dialog = QtGui.QPrintDialog(printer)
dialog.setModal(True)
dialog.setWindowTitle("Coucou titre" )
#on crée un curseur a l'endroit du curseur actuel
cursor = QtGui.QTextCursor(document)
#http://www.unixgarden.com/index.php/gnu-linux-magazine/qt-4-4-textes-enrichis-et-documents-structures
#http://pyqt.sourceforge.net/Docs/PyQt4/qtextcursor.html#MoveOperation-enum
################## TABLEAU #########"
#on crée un block pour le tableau
cursor.beginEditBlock()
#Creation du format du tableau qui sera imprimer
tableFormat = QtGui.QTextTableFormat()
tableFormat.setAlignment(QtCore.Qt.AlignHCenter)
#tableFormat.setAlignment(QtCore.Qt.AlignLeft)
tableFormat.setBackground(QtGui.QColor("#ffffff")) #blanc
tableFormat.setCellPadding(5)
tableFormat.setCellSpacing(0)
#tableFormat.setWidth(2000)
#tableFormat.setLeftMargin(10) #marge dans le browser, grrrr
#tableFormat.setRightMargin(10) #marge dans le browser, grrrr
mon_list_de_QTextLength = []
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,11)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
tableFormat.setColumnWidthConstraints(mon_list_de_QTextLength)
#tableFormat.setPageBreakPolicy(tableFormat.PageBreak_AlwaysAfter) #page break - saut de page!!!! vis à vis du tableu: on lui indique d'insérer un saut de page toujours après le tableau!!
tableFormat.setPageBreakPolicy(tableFormat.PageBreak_Auto)
#Creation du tableau qui sera imprimé avec le nombre de colonne
#et de ligne que contient le tableau mis en parametre
#exec("ui.tableWidget%s = QtGui.QTableWidget(ui.tab%s)" % (numero_circuit, numero_circuit))
#QTextTable * tableau = cursor.insertTable(tableau_a_imprimer->rowCount()+1, tableau_a_imprimer->columnCount(), tableFormat);
nb_ligne = mon_form.qtableWidget_resultat.rowCount()
if GLOBAL_mode_debuggage == 'oui': print "nb_ligne"
if GLOBAL_mode_debuggage == 'oui': print type(nb_ligne)
if GLOBAL_mode_debuggage == 'oui': print nb_ligne
nb_colonne = 9
#tableFormat.setPageBreakPolicy(tableFormat.PageBreak_Auto)
tableau = cursor.insertTable(1, nb_colonne, tableFormat) #ici, tableau est un QTextTable
frame = cursor.currentFrame()
frameFormat = frame.frameFormat()
frameFormat.setBorder(0)
frame.setFrameFormat(frameFormat)
#Format des HEADER du tableau
format_entete_tableau = QtGui.QTextCharFormat()
format_entete_tableau.setFontPointSize(13)
mon_QFont = QtGui.QFont()
mon_QFont.setWeight(99) # gras ou moins gras
format_entete_tableau.setFont(mon_QFont)
format_entete_tableau.setFontItalic(True)
#format_entete_tableau.setFontWeight(QFont::Bold);
#on ecrit les HEADERS du tableaux CIRCUIT dans le tableau a imprimer
Header = 1
if Header == 1:
list_text = []
list_text.append("Nom de l'affaire")
list_text.append("Donneur d'ordre")
list_text.append("Responsable donneur d'ordre")
list_text.append("Commentaires")
list_text.append("Missions")
list_text.append("Contenu mission")
list_text.append("Montant H.T. des honoraires")
list_text.append("Prochaine échéance")
list_text.append("Type d'échéance")
for col in range(nb_colonne):
#http://pyqt.sourceforge.net/Docs/PyQt4/qtexttablecellformat.html#details
cellule = tableau.cellAt(0,col) #cellule
cellCursor = cellule.firstCursorPosition() #cellCursor est un QTextCursor
mon_blockformat = cellCursor.blockFormat()
mon_alignement = QtCore.Qt.AlignHCenter
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat.setAlignment(mon_alignement)
cellCursor.setBlockFormat(mon_blockformat)
cellCursor.insertText(unicode(list_text[col], "iso-8859-1"),format_entete_tableau)
#impression des données CIRCUIT dans le tableau
cursor.insertText("\n")
matrice_colonne_a_imprimer = []
matrice_colonne_a_imprimer.append(1)
matrice_colonne_a_imprimer.append(18)
matrice_colonne_a_imprimer.append(21)
matrice_colonne_a_imprimer.append(22)
matrice_colonne_a_imprimer.append(23)
matrice_colonne_a_imprimer.append(33)
matrice_colonne_a_imprimer.append(24)
matrice_colonne_a_imprimer.append(25)
matrice_colonne_a_imprimer.append(26)
for row in range(1,(nb_ligne+1)):
tableau.insertRows(row,1)
for col in range(len(matrice_colonne_a_imprimer)):
#http://pyqt.sourceforge.net/Docs/PyQt4/qtexttablecellformat.html#details
cell = tableau.cellAt(row,col) #cellule est un QTextTableCell
#cell.setLeftPadding(0) #marche pas
cellCursor = cell.firstCursorPosition()
for num_header in range(mon_form.qtableWidget_resultat.columnCount()):
if num_header == matrice_colonne_a_imprimer[col]:
exec("ma_cellule = mon_form.qtableWidget_resultat.item(%s,%s).data(0).toString()" % (row-1,matrice_colonne_a_imprimer[col]))
#if GLOBAL_mode_debuggage == 'oui': print "mon_widget"
#if GLOBAL_mode_debuggage == 'oui': print type(ma_cellule)
#if GLOBAL_mode_debuggage == 'oui': print unicode(ma_cellule).encode("cp850")
mon_blockformat = cellCursor.blockFormat()
if col >= 3:
mon_alignement = QtCore.Qt.AlignHCenter
else:
mon_alignement = QtCore.Qt.AlignLeft
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat.setAlignment(mon_alignement)
cellCursor.setBlockFormat(mon_blockformat)
cellCursor.insertText(ma_cellule)
#cellCursor.insertText(ma_cellule.text())
#doudouille
#http://stackoverflow.com/questions/5187484/how-to-center-text-in-qtexttable
#fin de l'edition
cursor.endEditBlock()
cursor.movePosition(cursor.End)
############################################################
############################################################
############################################################
if dialog.exec_() == True:
printer.setOrientation(QtGui.QPrinter.Landscape) #grosse astuce, il faut définir l'orienttaion après que la fenetre de config soit fermée, sinon, ça prend en compte le paramètre de config impirmante de base
#impression de notre editor dans le QPrinter initialisé au début de la fonction
document.print_(printer)
print "printer.copyCount()"
printer.copyCount()
def impression_a_l_identique(self):
print "impression_a_l_identique"
printer = QtGui.QPrinter()
printer.setPageMargins(10,10,10,10,0) #0 pour unité millimetre
document=QtGui.QTextDocument()
dialog = QtGui.QPrintDialog(printer)
dialog.setModal(True)
dialog.setWindowTitle("Coucou titre" )
#on crée un curseur a l'endroit du curseur actuel
cursor = QtGui.QTextCursor(document)
#http://www.unixgarden.com/index.php/gnu-linux-magazine/qt-4-4-textes-enrichis-et-documents-structures
#http://pyqt.sourceforge.net/Docs/PyQt4/qtextcursor.html#MoveOperation-enum
################## TABLEAU #########"
#on crée un block pour le tableau
cursor.beginEditBlock()
#Creation du format du tableau qui sera imprimer
tableFormat = QtGui.QTextTableFormat()
tableFormat.setAlignment(QtCore.Qt.AlignHCenter)
#tableFormat.setAlignment(QtCore.Qt.AlignLeft)
tableFormat.setBackground(QtGui.QColor("#ffffff")) #blanc
tableFormat.setCellPadding(5)
tableFormat.setCellSpacing(0)
#tableFormat.setWidth(2000)
#tableFormat.setLeftMargin(10) #marge dans le browser, grrrr
#tableFormat.setRightMargin(10) #marge dans le browser, grrrr
nb_colonnes_tableau = mon_form.qtableWidget_resultat.columnCount()
grand_list_list = []
somme_largeur_colonnes = 0
for col in range(nb_colonnes_tableau):
if mon_form.qtableWidget_resultat.isColumnHidden(col) == False: #si colonne visible
somme_largeur_colonnes = somme_largeur_colonnes + mon_form.qtableWidget_resultat.columnWidth(col)
for col in range(nb_colonnes_tableau):
if mon_form.qtableWidget_resultat.isColumnHidden(col) == False: #si colonne visible
piti_list = [] #en 0: logical, #en 1: visual, #en 2: la taille en brut, #en3: la taille en %, #en 4 , le texte
#en 0: logical
piti_list.append(col)
#en 1: visual
num_colVL = mon_form.qtableWidget_resultat.visualColumn(col)
piti_list.append(num_colVL)
#en 2: la taille en brut
piti_list.append(mon_form.qtableWidget_resultat.columnWidth(col))
#en3: la taille en %,
piti_list.append(QtGui.QTextLength(2,int(100*mon_form.qtableWidget_resultat.columnWidth(col)/somme_largeur_colonnes))) #type, largeur type: 0:variable ,1:fixe ,2:percentage
#en 4 , le texte
piti_list.append(mon_form.qtableWidget_resultat.horizontalHeaderItem(col).text())
grand_list_list.append(piti_list)
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "grand_list_list"
if GLOBAL_mode_debuggage == 'oui': print grand_list_list
grand_list_reclasse = sorted(grand_list_list, key=lambda au_pif: au_pif[1]) #on classe suivant l'élement 1
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "grand_list_reclasse"
if GLOBAL_mode_debuggage == 'oui': print grand_list_reclasse
mon_list_de_QTextLength = []
for elem in grand_list_reclasse:
mon_list_de_QTextLength.append(elem[3])
tableFormat.setColumnWidthConstraints(mon_list_de_QTextLength) ################ NE PAS OUBLIER
#tableFormat.setPageBreakPolicy(tableFormat.PageBreak_AlwaysAfter) #page break - saut de page!!!! vis à vis du tableu: on lui indique d'insérer un saut de page toujours après le tableau!!
tableFormat.setPageBreakPolicy(tableFormat.PageBreak_Auto)
#Creation du tableau qui sera imprimé avec le nombre de colonne
#et de ligne que contient le tableau mis en parametre
#exec("ui.tableWidget%s = QtGui.QTableWidget(ui.tab%s)" % (numero_circuit, numero_circuit))
#QTextTable * tableau = cursor.insertTable(tableau_a_imprimer->rowCount()+1, tableau_a_imprimer->columnCount(), tableFormat);
nb_ligne = mon_form.qtableWidget_resultat.rowCount()
if GLOBAL_mode_debuggage == 'oui': print "nb_ligne"
if GLOBAL_mode_debuggage == 'oui': print type(nb_ligne)
if GLOBAL_mode_debuggage == 'oui': print nb_ligne
nb_colonne = len(grand_list_list)
#tableFormat.setPageBreakPolicy(tableFormat.PageBreak_Auto)
tableau = cursor.insertTable(1, nb_colonne, tableFormat) #ici, tableau est un QTextTable
frame = cursor.currentFrame()
frameFormat = frame.frameFormat()
frameFormat.setBorder(0)
frame.setFrameFormat(frameFormat)
#Format des HEADER du tableau
format_entete_tableau = QtGui.QTextCharFormat()
format_entete_tableau.setFontPointSize(13)
mon_QFont = QtGui.QFont()
mon_QFont.setWeight(99) # gras ou moins gras
format_entete_tableau.setFont(mon_QFont)
format_entete_tableau.setFontItalic(True)
#format_entete_tableau.setFontWeight(QFont::Bold);
#on ecrit les HEADERS du tableaux CIRCUIT dans le tableau a imprimer
Header = 1
if Header == 1:
#list_text = []
#for col in range(nb_colonne):
# list_text.append("Nom de l'affaire")
col = 0
for elem in grand_list_reclasse:
#http://pyqt.sourceforge.net/Docs/PyQt4/qtexttablecellformat.html#details
cellule = tableau.cellAt(0,col) #cellule
cellCursor = cellule.firstCursorPosition() #cellCursor est un QTextCursor
mon_blockformat = cellCursor.blockFormat()
mon_alignement = QtCore.Qt.AlignHCenter
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat.setAlignment(mon_alignement)
cellCursor.setBlockFormat(mon_blockformat)
cellCursor.insertText(unicode(elem[4], "iso-8859-1"),format_entete_tableau)
col = col + 1
#impression des données CIRCUIT dans le tableau
cursor.insertText("\n")
for row in range(1,(nb_ligne+1)):
tableau.insertRows(row,1)
col = 0
#for col in range(len(matrice_colonne_a_imprimer)):
for elem in grand_list_reclasse: #elem: #en 0: logical, #en 1: visual, #en 2: la taille en brut, #en3: la taille en %, #en 4 , le texte
#http://pyqt.sourceforge.net/Docs/PyQt4/qtexttablecellformat.html#details
cell = tableau.cellAt(row,col) #cellule est un QTextTableCell
#cell.setLeftPadding(0) #marche pas
cellCursor = cell.firstCursorPosition()
for num_header in range(mon_form.qtableWidget_resultat.columnCount()):
if num_header == elem[0]:
exec("ma_cellule = mon_form.qtableWidget_resultat.item(%s,%s).data(0).toString()" % (row-1,elem[0]))
if GLOBAL_mode_debuggage == 'oui': print "mon_widget"
if GLOBAL_mode_debuggage == 'oui': print type(ma_cellule)
if GLOBAL_mode_debuggage == 'oui': print unicode(ma_cellule).encode("cp850")
mon_blockformat = cellCursor.blockFormat()
mon_alignement = QtCore.Qt.AlignHCenter
#mon_alignement = QtCore.Qt.AlignLeft
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat.setAlignment(mon_alignement)
cellCursor.setBlockFormat(mon_blockformat)
cellCursor.insertText(ma_cellule)
#cellCursor.insertText(ma_cellule.text())
#doudouille
#http://stackoverflow.com/questions/5187484/how-to-center-text-in-qtexttable
col = col + 1
#fin de l'edition
cursor.endEditBlock()
cursor.movePosition(cursor.End)
############################################################
############################################################
############################################################
if dialog.exec_() == True:
printer.setOrientation(QtGui.QPrinter.Landscape) #grosse astuce, il faut définir l'orienttaion après que la fenetre de config soit fermée, sinon, ça prend en compte le paramètre de config impirmante de base
#impression de notre editor dans le QPrinter initialisé au début de la fonction
document.print_(printer)
print "printer.copyCount()"
printer.copyCount()
def concat_chemin(self, type_concours_affaire_etc, nom_affaire):
#if GLOBAL_mode_debuggage == 'oui': print "double_clic"
#if GLOBAL_mode_debuggage == 'oui': print "type_concours_affaire_etc"
#if GLOBAL_mode_debuggage == 'oui': print unicode(type_concours_affaire_etc).encode("CP850")
#if GLOBAL_mode_debuggage == 'oui': print "nom_affaire"
#if GLOBAL_mode_debuggage == 'oui': print unicode(nom_affaire).encode("CP850")
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
reg_con_chemin_affaires = mon_setting.value('chemins/chemin_affaires').toString()
reg_con_chemin_archives = mon_setting.value('chemins/chemin_archives').toString()
#if GLOBAL_mode_debuggage == 'oui': print "reg_con_chemin_affaires"
#if GLOBAL_mode_debuggage == 'oui': print reg_con_chemin_affaires
#Avancement:
#concours
#étude
#chantier
#concours à archiver
#concours archivé
#affaire à archiver
#affaire archivée
#expertise
#expertise à archiver
#expertise archivée
#pas_de_mdp
if type_concours_affaire_etc == "concours": ##YES!!!! à copier pour les autres cas!
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires)) #rajoute ou enleve les slash backslash suivant MAC, linux ou windows
debut_chemin = os.path.join(str(debut_chemin), "Concours") #concatène le chemin
elif type_concours_affaire_etc == "étude":
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_en_cours")
elif type_concours_affaire_etc == "chantier":
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_en_cours")
elif type_concours_affaire_etc == "concours à archiver":
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires))
debut_chemin = os.path.join(str(debut_chemin), "Concours")
elif type_concours_affaire_etc == "concours archivé":
debut_chemin = os.path.normcase(str(reg_con_chemin_archives))
debut_chemin = os.path.join(str(debut_chemin), "Concours_perdus")
elif type_concours_affaire_etc == "affaire à archiver":
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_en_cours")
elif type_concours_affaire_etc == "affaire archivée":
debut_chemin = os.path.normcase(str(reg_con_chemin_archives))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_archivees")
elif type_concours_affaire_etc == "expertise":
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_en_cours")
elif type_concours_affaire_etc == "expertise à archiver":
debut_chemin = os.path.normcase(str(reg_con_chemin_affaires))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_en_cours")
elif type_concours_affaire_etc == "expertise archivée":
debut_chemin = os.path.normcase(str(reg_con_chemin_archives))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_archivees")
elif type_concours_affaire_etc == "sans suite":
debut_chemin = os.path.normcase(str(reg_con_chemin_archives))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_archivees")
else: #si rien n'est précisé, alors archive
debut_chemin = os.path.normcase(str(reg_con_chemin_archives))
debut_chemin = os.path.join(str(debut_chemin), "Affaires_archivees")
if debut_chemin[-1:] == "/" or debut_chemin[-1:] == "\\":
debut_chemin = debut_chemin[:-1] #on vire le dernier slash ou antishlash s'il y en a un
chemin = os.path.join(str(debut_chemin), str(nom_affaire))
if GLOBAL_mode_debuggage == 'oui': print "chemin concat"
if GLOBAL_mode_debuggage == 'oui': print chemin
return chemin
def ouvrir_explorateur(self,ligne,col):
if GLOBAL_explorateur_de_fichier == "oui":
try:
type_concours_affaire_etc = self.qtableWidget_resultat.item(ligne,15).data(0).toString()
nom_affaire = self.qtableWidget_resultat.item(ligne,1).data(0).toString()
chemin = self.concat_chemin(type_concours_affaire_etc, nom_affaire)
##############
import subprocess
#import sys
#path = 'C:\\pyth\\ventilo\\help_files\\images\\' #double pour échapper le caractère
#path = unicode("C:\\pyth\\compilation moteur", "ISO-8859-1") #double pour échapper le caractère
if sys.platform == 'darwin': #mac
#chemin = unicode("/media/echogre1/Archives/Affaires", "ISO-8859-1") #pas sûr que ça fonctionne...
if GLOBAL_mode_debuggage == 'oui': print "mac"
subprocess.check_call(['open', '--', chemin])
elif sys.platform == 'linux2': #linux
#chemin = unicode("/media/echogre1/Archives/Affaires", "ISO-8859-1") #double pour échapper le caractère
if GLOBAL_mode_debuggage == 'oui': print "linux"
subprocess.check_call(['gnome-open',chemin]) ##ça marche !!!
elif sys.platform == 'windows' or 'win32' or 'win64' or 'cygwin': #pas sûr pour win64 et cygwin...
#chemin = unicode("\\\\Sme\\echogre1\\Archives\\Affaires", "ISO-8859-1") #encodage inutile ????
if GLOBAL_mode_debuggage == 'oui': print "windows"
#subprocess.check_call(['explorer', path])
#subprocess.Popen(r'explorer /e,"C:\pyth\ventilo\help_files\images\"') # YESSSS !!!!!!le paramètre /e permet d'ouvrir avec le splitter + ne pas mettre le /select
subprocess.Popen(r'explorer /e,%s'%(chemin)) # YESSSS !!!!!!le paramètre /e permet d'ouvrir avec le splitter + ne pas mettre le /select
except:
#qmessagebox
if GLOBAL_mode_debuggage == 'oui': print "nom_affaire"
if GLOBAL_mode_debuggage == 'oui': print nom_affaire
texte_titre = "Config en cours !"
msg_debut = unicode("Affaire: \n ", "iso-8859-1")
msg_debut2 = unicode(nom_affaire, "iso-8859-1")
msg_debut3 = unicode("\nImpossible d'ouvrir l'explorateur. Affaire non trouvée, ou bien mauvaise concordance entre le nom de l'affaire sur la base, et dans les fichiers Echologos\n", "iso-8859-1")
msg_total = msg_debut + msg_debut2 + msg_debut3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
def fenetre_gestion_connexions(self):
if GLOBAL_mode_debuggage == 'oui': print "def fenetre_gestion_connexions"
ma_fenetre_connection = QtGui.QDialog(MainWindow)
connection = Fenetre_connexion()
connection.setupUi2(ma_fenetre_connection)
if GLOBAL_mode_debuggage == 'oui': print "zaza40"
ma_fenetre_connection.show()
def fenetre_version(self):
if GLOBAL_mode_debuggage == 'oui': print "def fenetre_gestion_connexions"
ma_fenetre_version = QtGui.QDialog(MainWindow)
version = Fenetre_version()
version.setupUi2(ma_fenetre_version)
if GLOBAL_mode_debuggage == 'oui': print "zaza41"
ma_fenetre_version.show()
def actions_du_sous_menu(self, action):
if GLOBAL_mode_debuggage == 'oui': print "actions_du_sous_menu"
if GLOBAL_mode_debuggage == 'oui': print type(action)
ma_config = unicode(action.text())
if GLOBAL_mode_debuggage == 'oui': print ma_config
if action == self.param_action1: #Sauvegarder visuel
if GLOBAL_mode_debuggage == 'oui': print "sauvegarder le visuel"
self.sauvegarder_le_visuel()
elif action == self.param_action2: #Gestion des configs
config = Fenetre_CONFIG_UTILISATEUR_SQL_ajout_modif_suppression()
config.creation_fenetre_config("preferences_utilisateurs")
def sauvegarder_le_visuel(self):
if GLOBAL_mode_debuggage == 'oui': print "sauvegarde du visuel pour la config en cours"
if GLOBAL_config_actuelle_finale != "_":
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "GLOBAL_config_actuelle_finale"
if GLOBAL_mode_debuggage == 'oui': print unicode(GLOBAL_config_actuelle_finale).encode("cp850")
### partie matrice_colonnes_resultat debut ###
nb_colonne_resultat = self.qtableWidget_resultat.columnCount()
if GLOBAL_mode_debuggage == 'oui': print "nb_colonne_resultat"
if GLOBAL_mode_debuggage == 'oui': print nb_colonne_resultat
if GLOBAL_mode_debuggage == 'oui': print type(self.qtableWidget_resultat)
mon_header = self.qtableWidget_resultat.horizontalHeader()
matrice_colonnes_resultat = []
t=0
for num_col in range(mon_header.count()):
if self.qtableWidget_resultat.isColumnHidden(num_col) == False: #colonne visible
visible = "oui"
colonne_largeur = self.qtableWidget_resultat.columnWidth(num_col)
else:
visible = "non"
colonne_largeur = 100
# ajouter dans matrice_colonnes_resultat
#colonne_nom = self.qtableWidget_resultat.horizontalHeaderItem(num_col).text()
visual_index = mon_header.visualIndex(num_col)
#BUG VISUAL
mon_list = []
mon_list.append(num_col) #logicalIndex !
mon_list.append(visual_index) #visual_index !
mon_list.append(colonne_largeur) #largeur colonne
mon_list.append(visible) #visible 01
matrice_colonnes_resultat.append(mon_list)
if GLOBAL_mode_debuggage == 'oui': print "matrice_colonnes_resultat"
if GLOBAL_mode_debuggage == 'oui': print matrice_colonnes_resultat
### partie matrice_colonnes_resultat fin ###
## partie matrice_ordre_parametres_de_tri debut ##
#on crée matrice_ordre_parametres_de_tri comme ceci:
#0: nb_lignes dans la colonne list_ordre_tri_0
#1,2,3,4,5,6: le numero de ligne correspondant pour les Order by 1 à 3 et ASC DESC
#7 num ligne toutes les conditions ou bien une des conditions
#8 et
# 9 nb de lignes de TRI dans le tableau
#ligne 10 à 25 maxi: LIST de stockage du numéro de ligne en colonne 0, en colonne 1 et text? en colonne 2
matrice_ordre_parametres_de_tri = []
matrice_ordre_parametres_de_tri.append(self.ordre_de_tri_1.count()) # 0 on prend en compte la ligne vide mais cela ne gène pas si on fait pareil à l'importation
#if GLOBAL_mode_debuggage == 'oui': print "self.TRI_mon_list_de_list_de_parametres_de_tri"
#if GLOBAL_mode_debuggage == 'oui': print self.TRI_mon_list_de_list_de_parametres_de_tri
trouve_1 = 0
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6] == self.ordre_de_tri_1.currentText():
matrice_ordre_parametres_de_tri.append(self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]) #1
trouve_1 = 1
if trouve_1 == 0:
matrice_ordre_parametres_de_tri.append('') #1
matrice_ordre_parametres_de_tri.append(self.asc_desc_1.currentIndex()) #2
trouve_2 = 0
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6] == self.ordre_de_tri_2.currentText():
matrice_ordre_parametres_de_tri.append(self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]) #3
trouve_2 = 1
if trouve_2 == 0:
matrice_ordre_parametres_de_tri.append('') #3
matrice_ordre_parametres_de_tri.append(self.asc_desc_2.currentIndex()) #4
trouve_3 = 0
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6] == self.ordre_de_tri_3.currentText():
matrice_ordre_parametres_de_tri.append(self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]) #5
trouve_3 = 1
if trouve_3 == 0:
matrice_ordre_parametres_de_tri.append('') #3
matrice_ordre_parametres_de_tri.append(self.asc_desc_3.currentIndex()) #6
matrice_ordre_parametres_de_tri.append(self.type_de_recherche.currentIndex()) # 7
matrice_ordre_parametres_de_tri.append("") # 8 vide
matrice_ordre_parametres_de_tri.append(self.qtableWidget_param.rowCount()) # 9 Nombre de lignes
for ligne_tri in range(self.qtableWidget_param.rowCount()):
piti_list=[]
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6] == self.qtableWidget_param.cellWidget(ligne_tri,0).currentText():
piti_list.append(self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]) #1
piti_list.append(self.qtableWidget_param.cellWidget(ligne_tri,1).currentIndex())
monQLE = QtGui.QLineEdit()
monQDE = QtGui.QDateEdit()
monQCB = QtGui.QComboBox()
#piti_list.append(self.qtableWidget_param.cellWidget(ligne_tri,2).currentIndex())
if type(monQLE) == type(self.qtableWidget_param.cellWidget(ligne_tri,2)):
piti_list.append(unicode(self.qtableWidget_param.cellWidget(ligne_tri,2).displayText()))
elif type(monQCB) == type(self.qtableWidget_param.cellWidget(ligne_tri,2)):
piti_list.append(unicode(self.qtableWidget_param.cellWidget(ligne_tri,2).currentText()))
elif type(monQDE) == type(self.qtableWidget_param.cellWidget(ligne_tri,2)):
piti_list.append(unicode(self.qtableWidget_param.cellWidget(ligne_tri,2).date().toString(QtCore.Qt.ISODate)))
matrice_ordre_parametres_de_tri.append(piti_list) # 10 à 25 maxi
if GLOBAL_mode_debuggage == 'oui': print "matrice_ordre_parametres_de_tri"
if GLOBAL_mode_debuggage == 'oui': print matrice_ordre_parametres_de_tri
## partie matrice_ordre_parametres_de_tri fin ##
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
nb_ligne_modifiees = cur.execute("UPDATE preferences_utilisateurs SET ordre_parametres_de_tri=%s, ordre_col_tableau_resultat=%s WHERE (nom_utilisateur=%s)", \
(unicode(matrice_ordre_parametres_de_tri), str(matrice_colonnes_resultat), unicode(GLOBAL_config_actuelle_finale)))
cur.close()
cur=id.cursor()
test_select = cur.execute("SELECT * FROM preferences_utilisateurs WHERE (nom_utilisateur=%s)", \
(unicode(GLOBAL_config_actuelle_finale)))
nombre_trouve = len(list(cur.fetchall()))
cur.close()
id.commit()
id.close()
#if GLOBAL_mode_debuggage == 'oui': print "test_select"
#if GLOBAL_mode_debuggage == 'oui': print test_select
if nombre_trouve == 0:
texte_titre = "Attention !"
msg_total = "Paramètres non enregistrés. Vérifiez que la config en cours existe bien ou n'a pas été renommée récemment"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
else:
if nb_ligne_modifiees == 0:
texte_titre = "Paramètres visuels"
msg_total = "Paramètres visuels déjà enregistrés (tableau de tri et tableau de résultat)"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
else:
texte_titre = "Paramètres visuels"
msg_total = "Paramètres visuels enregistrés pour les deux tableaux de gauche (tableau de tri et tableau de résultat)"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
else:
texte_titre = "Pas de config définie"
msg_total = "Vous devez d'abord créer une config"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
#enregistrer le self.splitter et le self.splitter_2 et le Qmainwindow taille position
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('visuel/splitter', mon_form.splitter.saveState())
mon_setting.setValue('visuel/splitter_2', mon_form.splitter_2.saveState())
mon_setting.setValue('visuel/dimension_main_window', MainWindow.saveGeometry())
def SOUS_MENU_BAR_configurations(self):
self.param_action1 = QtGui.QAction(unicode("Sauvegarder visuel","iso-8859-1"), self.selection_config)
self.param_action2 = QtGui.QAction(unicode("Gestion des configs","iso-8859-1"), self.selection_config)
self.selection_config.addAction(self.param_action1)
self.selection_config.addAction(self.param_action2)
#########################"
def initialisation_et_chargement(self):
global GLOBAL_explorateur_de_fichier
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
GLOBAL_explorateur_de_fichier = str(mon_setting.value('chemins/explorateur_fichier').toString())
if GLOBAL_explorateur_de_fichier == "":
GLOBAL_explorateur_de_fichier = "oui"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/explorateur_fichier', unicode("oui"))
except:
GLOBAL_explorateur_de_fichier = "oui"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/explorateur_fichier', unicode("oui"))
global GLOBAL_deplacement_de_fichier
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
GLOBAL_deplacement_de_fichier = str(mon_setting.value('chemins/deplacement_fichier').toString())
if GLOBAL_deplacement_de_fichier == "":
GLOBAL_deplacement_de_fichier = "non"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/deplacement_fichier', unicode("non"))
except:
GLOBAL_deplacement_de_fichier = "non"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('chemins/deplacement_fichier', unicode("non"))
erreur_ou_pas = self.GLOBAL_gestion_variable_et_tableaux_globaux()
if erreur_ou_pas == "erreur1": #permet le nouveal appel de la fonction
self.GLOBAL_gestion_variable_et_tableaux_globaux()
self.SCROLL_remplissage_champs()
self.RESULTAT_preparation_tableau()
self.TRI_ordre_des_tris()
##self.colonnes_visibles_et_taille_dans_resultat = [[0,200],[1,50],[5,100],[22,100]]
if GLOBAL_config_actuelle_finale != "_": #si une config existe
# self.TRI_creation_ligne_dans_tableau_parametres_de_tri()
self.TRI_chargement_des_lignes_utilisateur() #on crée toutes les lignes enregsitrées par l'utilisateur
else: #pas de config, on initialise en mettant une ligne par defaut
self.TRI_creation_ligne_dans_tableau_parametres_de_tri() #création d'une ligne
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
qbite_splitter_1 = mon_setting.value('visuel/splitter')
qbite_splitter_2 = mon_setting.value('visuel/splitter_2')
self.splitter.restoreState(qbite_splitter_1.toByteArray())
self.splitter_2.restoreState(qbite_splitter_2.toByteArray())
except:
toto = 2
if GLOBAL_mode_debuggage == 'oui': print "zoubida5"
self.coloriage_de_qtableWidget_param()
def GLOBAL_gestion_variable_et_tableaux_globaux(self):
try:
global GLOBAL_mon_tuple_de_tuple_ORIGINAL, GLOBAL_list_table_et_commentaires_tables, GLOBAL_config_actuelle_finale
if GLOBAL_mode_debuggage == 'oui': print "GLOBAL_config_actuelle_finaleZZZ"
if GLOBAL_mode_debuggage == 'oui': print unicode(GLOBAL_config_actuelle_finale).encode("cp850")
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#cur.execute("select * from %s order by affaire_QLE" % mysql_Nom_de_table)
cur.execute("SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '%s'" % mysql_Nom_de_table)
mon_pre_tuple_de_tuple = list(cur.fetchall())
cur.close()
cur2=id.cursor()
cur2.execute("SELECT * FROM information_schema.tables WHERE TABLE_TYPE = 'BASE TABLE'")
ma_structure_de_premier_rang = list(cur2.fetchall())
cur2.close()
#if GLOBAL_mode_debuggage == 'oui': print "ma_structure_de_premier_rang"
#if GLOBAL_mode_debuggage == 'oui': print ma_structure_de_premier_rang
mon_tableau2D = []
for ma_ligne in ma_structure_de_premier_rang:
mon_micro_tableau = []
mon_micro_tableau.append(ma_ligne[2])
mon_micro_tableau.append(ma_ligne[20])
mon_tableau2D.append(mon_micro_tableau)
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "mon_tableau2D"
if GLOBAL_mode_debuggage == 'oui': print mon_tableau2D
GLOBAL_list_table_et_commentaires_tables = mon_tableau2D
ma_matrice = []
for elem in mon_pre_tuple_de_tuple:
ma_liste = []
champ_propre_tout_seul = []
ma_liste = elem[5].split('#')
champ_propre_tout_seul = (ma_liste[0].split('#-#'))
monlist_elem = list(elem)
monlist_elem.append(champ_propre_tout_seul[0])
ma_matrice.append(tuple(monlist_elem))
GLOBAL_mon_tuple_de_tuple_ORIGINAL = ma_matrice
#grâce à la fonction ci-dessus, on rajoute en dernière colonne le commentaire tout seul !
#if GLOBAL_mode_debuggage == 'oui': print "\nGLOBAL_mon_tuple_de_tuple_ORIGINAL avec derniere colonne commentaire"
#if GLOBAL_mode_debuggage == 'oui': print GLOBAL_mon_tuple_de_tuple_ORIGINAL
#TRANSPOSITION DES MATRICES
if GLOBAL_config_actuelle_finale == "_": #si aucune config n'est encore définie alors on fixe les 3 matrices idem à ORIGINAL
self.TRI_mon_list_de_list_de_parametres_de_tri = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
self.TRI_mon_list_de_list_de_parametres_de_tri.sort(key=lambda x: x[6])
self.RESULTAT_mon_list_de_list_de_colonne = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
self.SCROLL_AREA_mon_list_de_list_de_champs = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
elif GLOBAL_config_actuelle_finale != "_": #dans ce cas on récupère le nom de la config et on va choper les matrices d'invertion correspondantes
if GLOBAL_mode_debuggage == 'oui': print "GLOBAL_config_actuelle_finaleTT"
if GLOBAL_mode_debuggage == 'oui': print unicode(GLOBAL_config_actuelle_finale).encode("cp850")
#mon_ftp = class_FTP_ou_SFTP() \ id=mon_ftp.FTP_ou_SFTP()
cur2=id.cursor()
#cur2.execute("select * from preferences_utilisateurs where nom_utilisateur = %s" % (repr(str(GLOBAL_config_actuelle_finale))))
cur2.execute("select * from preferences_utilisateurs where nom_utilisateur = %s order by nom_utilisateur", (unicode(GLOBAL_config_actuelle_finale)))
self.ordre_Tri_Resultat_Scroll = list(cur2.fetchall())
cur2.close()
if len(self.ordre_Tri_Resultat_Scroll) == 0:
texte_titre = "Problème de config"
msg_debut = "Votre config par défaut est introuvable et a été supprimée par une personne tierce, retour sur configuration initiale"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
GLOBAL_config_actuelle_finale = "_"
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('config_par_defaut/nom_config', str(GLOBAL_config_actuelle_finale))
mon_form.setupUi2(MainWindow) #rechargment complet du tableau
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "relance de la fonction"
return "erreur1" # le return bloque la suite de la fonction: on sort ici
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "self.ordre_Tri_Resultat_Scroll"
#on envoie l'invertion de matrice sur tous les champs
#la fonction EVAL sert à transformer un string en list et revient à faire: mon_string[1:-1].split(',')
#tableau
nom_utilisateur = copy.copy(GLOBAL_config_actuelle_finale)
#utiliset copy.deepcopy() quand on veut copier des list
#http://au-bon-laboureur.blogspot.fr/2009/03/python-et-la-copie-de-listes-attention.html
if GLOBAL_mode_debuggage == 'oui': print "nom_utilisateur"
if GLOBAL_mode_debuggage == 'oui': print unicode(nom_utilisateur).encode("cp850")
if GLOBAL_mode_debuggage == 'oui': print type(nom_utilisateur)
###fenetre de SCROLL AREA avec tous les champs
if self.ordre_Tri_Resultat_Scroll[0][3] is not None:
if GLOBAL_mode_debuggage == 'oui': print "Fonction not none 3 "
if GLOBAL_mode_debuggage == 'oui': print "taille GLOBAL_mon_tuple_de_tuple_ORIGINAL"
if GLOBAL_mode_debuggage == 'oui': print len(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
if GLOBAL_mode_debuggage == 'oui': print "taille eval(self.ordre_Tri_Resultat_Scroll[0][3])"
if GLOBAL_mode_debuggage == 'oui': print len(eval(self.ordre_Tri_Resultat_Scroll[0][3]))
mon_invertion = Transposition_selon_ordre()
matrice2D = mon_invertion.transpose_list_multiple(GLOBAL_mon_tuple_de_tuple_ORIGINAL,eval(self.ordre_Tri_Resultat_Scroll[0][3]),nom_utilisateur)
self.SCROLL_AREA_mon_list_de_list_de_champs = copy.deepcopy(matrice2D[0])
self.TRI_mon_list_de_list_de_parametres_de_tri = copy.deepcopy(matrice2D[0])
self.TRI_mon_list_de_list_de_parametres_de_tri.sort(key=lambda x: x[6])
#si on détecte une différence dans la taille (administrateur: ajout ou suppr de champ dans la base Mysql), alors on relance la fonction atcuelle
if len(eval(self.ordre_Tri_Resultat_Scroll[0][3])) != len(GLOBAL_mon_tuple_de_tuple_ORIGINAL):
if GLOBAL_mode_debuggage == 'oui': print "nouvel appel de self.GLOBAL_gestion_variable_et_tableaux_globaux"
return "erreur1" # le return bloque la suite de la fonction: on sort ici
else:
if GLOBAL_mode_debuggage == 'oui': print "Fonction None 3 "
self.SCROLL_AREA_mon_list_de_list_de_champs = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
self.TRI_mon_list_de_list_de_parametres_de_tri = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
self.TRI_mon_list_de_list_de_parametres_de_tri.sort(key=lambda x: x[6])
###fenetre de RESULTAT des parametres
if GLOBAL_mode_debuggage == 'oui': print "self.ordre_Tri_Resultat_Scroll"
if GLOBAL_mode_debuggage == 'oui': print self.ordre_Tri_Resultat_Scroll[0][2]
if self.ordre_Tri_Resultat_Scroll[0][2] is not None:
if GLOBAL_mode_debuggage == 'oui': print "Fonction not none 2 "
self.RESULTAT_mon_list_de_list_de_colonne = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
self.RESULTAT_colonnes_visibles_et_taille = copy.deepcopy(self.ordre_Tri_Resultat_Scroll[0][2])
else:
if GLOBAL_mode_debuggage == 'oui': print "Fonction None 2 "
self.RESULTAT_mon_list_de_list_de_colonne = copy.deepcopy(GLOBAL_mon_tuple_de_tuple_ORIGINAL)
"""
###fenetre de TRI des parametres: (pour info l'ordre d'apparition est géré au dessus dans ###fenetre de SCROLL AREA avec tous les champs
if self.ordre_Tri_Resultat_Scroll[0][1] is not None:
if GLOBAL_mode_debuggage == 'oui': print "Fonction not none 1 "
#BUG possible: vérifier de très très près ce qu'il se passe en cas d'utilisation du transpose_list_multiple avec les ajouts/supppr de colonne dans
#mon_invertion = Transposition_selon_ordre()
else:
if GLOBAL_mode_debuggage == 'oui': print "Fonction None 1"
"""
id.commit()
id.close()
except MySQLdb.OperationalError,e:
if GLOBAL_mode_debuggage == 'oui': print "e"
if GLOBAL_mode_debuggage == 'oui': print e
texte_titre = "Erreur de connection au serveur_"
msg_debut = "Connexion impossible: \n Vérifier si la connection au serveur de base de données est bien établie"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
def TRI_chargement_des_lignes_utilisateur(self):
try:
if GLOBAL_mode_debuggage == 'oui': print "self.ordre_Tri_Resultat_Scroll[0][1][9]"
if GLOBAL_mode_debuggage == 'oui': print self.ordre_Tri_Resultat_Scroll[0][1][9]
tableau = list(eval(self.ordre_Tri_Resultat_Scroll[0][1]))
if GLOBAL_mode_debuggage == 'oui': print tableau
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "self.ordre_de_tri_1.count()"
if GLOBAL_mode_debuggage == 'oui': print self.ordre_de_tri_1.count()
if GLOBAL_mode_debuggage == 'oui': print "int(tableau[0])"
if GLOBAL_mode_debuggage == 'oui': print int(tableau[0])
if self.ordre_de_tri_1.count() < int(tableau[0]):
self.TRI_creation_ligne_dans_tableau_parametres_de_tri()
texte_titre = unicode("Table modifiée", "iso-8859-1")
msg = unicode("Des champs de table ont été supprimés, vous devez refaire toutes vos lignes de tri", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setInformativeText(msg)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
else:
for ligne_supp in range(self.qtableWidget_param.rowCount()):
self.qtableWidget_param.removeRow(0)
if self.ordre_de_tri_1.count() > int(tableau[0]) : #pas grave, des lignes on été ajoutées ou modifiées
self.TRI_creation_ligne_dans_tableau_parametres_de_tri()
texte_titre = unicode("Table modifiée", "iso-8859-1")
msg = unicode("Des champs de table ont été ajoutés. Vous devez réenregistrer vos paramètres visuels et réenregistrer votre config en cours via modif/valider_modif pour que ce message ne s'affiche plus", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setInformativeText(msg)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
if GLOBAL_mode_debuggage == 'oui': print "hop valeur"
#1
for ligne in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][0] == tableau[1]:
if GLOBAL_mode_debuggage == 'oui': print "youpi reded"
ligne_item = self.ordre_de_tri_1.findText(self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][6])
self.ordre_de_tri_1.setCurrentIndex(ligne_item)
#3
for ligne in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][0] == tableau[3]:
if GLOBAL_mode_debuggage == 'oui': print "youpi reded"
ligne_item = self.ordre_de_tri_2.findText(self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][6])
self.ordre_de_tri_2.setCurrentIndex(ligne_item)
#5
for ligne in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][0] == tableau[5]:
if GLOBAL_mode_debuggage == 'oui': print "youpi reded"
ligne_item = self.ordre_de_tri_3.findText(self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][6])
self.ordre_de_tri_3.setCurrentIndex(ligne_item)
self.asc_desc_1.setCurrentIndex(int(tableau[2]))
self.asc_desc_2.setCurrentIndex(int(tableau[4]))
self.asc_desc_3.setCurrentIndex(int(tableau[6]))
self.type_de_recherche.setCurrentIndex(int(tableau[7]))
monQLE = QtGui.QLineEdit()
monQDE = QtGui.QDateEdit()
monQCB = QtGui.QComboBox()
for ligne_tri in range(int(tableau[9])):
self.TRI_creation_ligne_dans_tableau_parametres_de_tri() #création d'une ligne pour remplissage + fonction simulation clic
piti_tableau = list(tableau[10+ligne_tri])
if GLOBAL_mode_debuggage == 'oui': print "piti_tableau"
if GLOBAL_mode_debuggage == 'oui': print piti_tableau
for ligne in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][0] == piti_tableau[0]:
if GLOBAL_mode_debuggage == 'oui': print "youpi rededsasa"
ligne_item = self.qtableWidget_param.cellWidget(ligne_tri,0).findText(self.TRI_mon_list_de_list_de_parametres_de_tri[ligne][6])
self.qtableWidget_param.cellWidget(ligne_tri,0).setCurrentIndex(ligne_item)
#on simule un clic avec la fonction ci-dessous
self.TRI_change_texte_col0_vers_col1_et_col2(ligne_item) #on simule un clic sur la dernièreligne, et sur un champ précis
self.qtableWidget_param.cellWidget(ligne_tri,1).setCurrentIndex(int(piti_tableau[1]))
if type(self.qtableWidget_param.cellWidget(ligne_tri,2)) == type(monQLE):
self.qtableWidget_param.cellWidget(ligne_tri,2).setText(unicode(piti_tableau[2]))
elif type(self.qtableWidget_param.cellWidget(ligne_tri,2)) == type(monQDE):
self.qtableWidget_param.cellWidget(ligne_tri,2).setText(unicode(piti_tableau[2]))
elif type(self.qtableWidget_param.cellWidget(ligne_tri,2)) == type(monQCB):
ligne_item = self.qtableWidget_param.cellWidget(ligne_tri,2).findText(unicode(piti_tableau[2]))
if ligne_item == -1:
"""
texte_titre = unicode("Table de tri", "iso-8859-1")
exec('''msg_debut= unicode("Votre ancien choix dans le tableau de tri en ligne n°%s et colonne n°3 n'est plus possible. Il a été modifié ou supprimé par un administrateur. Vous devez le rédéfinir et réenregistrer vos paramètres visuels", "iso-8859-1")''' % (self.qtableWidget_param.rowCount()))
msg_suite = u"\nAncien choix: " + unicode(piti_tableau[2])
msg_total = msg_debut + msg_suite
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setInformativeText(msg_total)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
self.qtableWidget_param.cellWidget(ligne_tri,2).setCurrentIndex(0)
"""
self.qtableWidget_param.cellWidget(ligne_tri,2).addItem(unicode(piti_tableau[2]))
self.qtableWidget_param.cellWidget(ligne_tri,2).setCurrentIndex(self.qtableWidget_param.cellWidget(ligne_tri,2).count()-1)
else:
self.qtableWidget_param.cellWidget(ligne_tri,2).setCurrentIndex(ligne_item)
except:
self.TRI_creation_ligne_dans_tableau_parametres_de_tri()
def TRI_change_texte_col0_vers_col1_et_col2(self, champ_selection = -1): #tres important, le paramètres INT du QcomboBox est transmis par le connect
#def TRI_change_texte_col0_vers_col1_et_col2(self,int): #tres important, le paramètres INT du QcomboBox est transmis par le connect
#en appellant la fonction sans parenthese dans le connect:
#QtCore.QObject.connect(self.qcombo_choix_colonne0,QtCore.SIGNAL("currentIndexChanged(int)"),self.TRI_change_texte_col0_vers_col1_et_col2)
# je ne m'en sers pas, mais c'est bon à savoir
#NE PAS SE SERVIR DES NOMS MAIS UNIQUEMENT DES INDEX SINON LA SUPPRESSION DE LIGNE FAUSSE TOUT
#on essaie de récupérer l'objet sous le pointeur de la souris
#si ça marche pas, alors lors de la création d'une ligne, on se place à la dernière ligne, et en colonne zéro
try:
widgetActuel = QtGui.QApplication.focusWidget()
ma_pos = widgetActuel.pos()
mon_index = self.qtableWidget_param.indexAt(ma_pos)
indice_ligne = mon_index.row()
indice_colonne = mon_index.column()
recup_text= widgetActuel.currentText() #sert à rien pour la suite
recup_index= widgetActuel.currentIndex()
if GLOBAL_mode_debuggage == 'oui': print "clic manuel pris en compte"
except:
if GLOBAL_mode_debuggage == 'oui': print "clic simulation dans ligne de tri"
nb_ligne = self.qtableWidget_param.rowCount()
indice_ligne = nb_ligne-1
indice_colonne = 0
#recup_text= widgetActuel.currentText()
recup_index= 0
if champ_selection != -1: #permet de passer en argument l'index du champ sélectionné par simulatin de clic
recup_index = champ_selection
if GLOBAL_mode_debuggage == 'oui': print "indice_ligne"
if GLOBAL_mode_debuggage == 'oui': print indice_ligne
if GLOBAL_mode_debuggage == 'oui': print "indice_colonne"
if GLOBAL_mode_debuggage == 'oui': print indice_colonne
voisine_de_droite = self.qtableWidget_param.cellWidget(indice_ligne,indice_colonne+1)
type_champ = self.TRI_mon_list_de_list_de_parametres_de_tri[recup_index][0].split('#') #+ un pour sauter la clé primaire en 1ère ligne)
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "type_champ"
if GLOBAL_mode_debuggage == 'oui': print type_champ
if GLOBAL_mode_debuggage == 'oui': print "sdzou"
#QLE QTE QCB QDE QLW
self.var_contient = "contient"
self.var_contient_pas = "ne contient pas"
self.var_commence_par = "commence par"
self.var_finit_par = "finit par"
self.var_identique_a = "identique à"
self.var_different_de = "différent de"
self.var_egal_a = "est égal à"
self.var_inf_a = "est inférieur à"
self.var_sup_a = "est supérieur à"
self.var_est = "est"
self.var_n_est_pas = "n'est pas"
self.var_avant = "se trouve avant"
self.var_apres = "se trouve après"
if type_champ[1] == "QLE":
if GLOBAL_mode_debuggage == 'oui': print "QLE"
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_contient)
voisine_de_droite.addItem(self.var_contient_pas)
voisine_de_droite.addItem(self.var_commence_par)
voisine_de_droite.addItem(self.var_finit_par)
voisine_de_droite.addItem(self.var_identique_a)
voisine_de_droite.addItem(self.var_different_de)
monline_edit = QtGui.QLineEdit()
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,monline_edit)
QtCore.QObject.connect(monline_edit,QtCore.SIGNAL('returnPressed()'),self.rechercher)
if GLOBAL_mode_debuggage == 'oui': print "QLE2"
type_de_donnees = self.TRI_mon_list_de_list_de_parametres_de_tri[recup_index][1]
if GLOBAL_mode_debuggage == 'oui': print "type_de_donnees[:5]"
if GLOBAL_mode_debuggage == 'oui': print type_de_donnees[:5]
if type_de_donnees[:3] == "int": # SI C'EST UN INT, on crée un Qline Edit avec validateur sur la colonne décalé de deux à droite
monline_edit = QtGui.QLineEdit()
QtCore.QObject.connect(monline_edit,QtCore.SIGNAL('returnPressed()'),self.rechercher)
if GLOBAL_mode_debuggage == 'oui': print "split_type_donnees"
if GLOBAL_mode_debuggage == 'oui': print split_type_donnees
split_type_donnees = type_de_donnees.split("(")
split_de_split = split_type_donnees[1].split(")")
if GLOBAL_mode_debuggage == 'oui': print "split_de_split"
if GLOBAL_mode_debuggage == 'oui': print split_de_split
taille_maxi = int(split_de_split[0])
if GLOBAL_mode_debuggage == 'oui': print "taille_maxi"
if GLOBAL_mode_debuggage == 'oui': print taille_maxi
monline_edit.setMaxLength(taille_maxi)
monline_edit.setValidator(QtGui.QIntValidator(0, 999999999, monline_edit))
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,monline_edit)
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_egal_a)
voisine_de_droite.addItem(self.var_inf_a)
voisine_de_droite.addItem(self.var_sup_a)
elif type_de_donnees[:5] == "float": #forcément un pourcentage
monline_edit = QtGui.QLineEdit()
QtCore.QObject.connect(monline_edit,QtCore.SIGNAL('returnPressed()'),self.rechercher)
min = 0.00
max = 99.99
no_decimals = 2
if GLOBAL_mode_debuggage == 'oui': print "dee"
monline_edit.setMaxLength(len(str(max)))
if GLOBAL_mode_debuggage == 'oui': print "mpl"
aValidator = MyDoubleValidator(min, max, no_decimals, monline_edit)
if GLOBAL_mode_debuggage == 'oui': print "mpl2"
monline_edit.setValidator(aValidator)
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,monline_edit)
if GLOBAL_mode_debuggage == 'oui': print "mpl3"
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_egal_a)
voisine_de_droite.addItem(self.var_inf_a)
voisine_de_droite.addItem(self.var_sup_a)
if GLOBAL_mode_debuggage == 'oui': print "mpl4"
elif type_champ[1] == "QTE":
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_contient)
voisine_de_droite.addItem(self.var_contient_pas)
voisine_de_droite.addItem(self.var_commence_par)
voisine_de_droite.addItem(self.var_finit_par)
voisine_de_droite.addItem(self.var_identique_a)
voisine_de_droite.addItem(self.var_different_de)
monline_edit2 = QtGui.QLineEdit()
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,monline_edit2)
QtCore.QObject.connect(monline_edit2,QtCore.SIGNAL('returnPressed()'),self.rechercher)
elif type_champ[1] == "QCB":
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_contient)
voisine_de_droite.addItem(self.var_contient_pas)
voisine_de_droite.addItem(self.var_commence_par)
voisine_de_droite.addItem(self.var_finit_par)
voisine_de_droite.addItem(self.var_identique_a)
voisine_de_droite.addItem(self.var_different_de)
try: # si on arrive à récupérer le type de champs 2, alors c'est un Qpush Button, donc connection MysqL nécessaire,
#sinon on récepuère les champs commentaires
type_champ[2]
#COmbobox avec champs en base Mysql
#On remplit les list Widget en passant le type de table en paramètre, et on remplit la liste
#if GLOBAL_mode_debuggage == 'oui': print "type_champ[4]"
#if GLOBAL_mode_debuggage == 'oui': print type_champ[4]
#if GLOBAL_mode_debuggage == 'oui': print "(type_champ[5])"
#if GLOBAL_mode_debuggage == 'oui': print int(type_champ[5])
ma_liste_des_items = self.SCROLL_remplissage_des_QListWidget(type_champ[4],int(type_champ[5])) #type_champ[4]: nom de table ------ type_champ[5] numéro de colonne dans la table
if GLOBAL_mode_debuggage == 'oui': print "ma_liste_des_items"
if GLOBAL_mode_debuggage == 'oui': print ma_liste_des_items
moncombox = QtGui.QComboBox()
for chaque_item1 in ma_liste_des_items:
moncombox.addItem(chaque_item1)
moncombox.setEditable(True)
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,moncombox)
except: #COmbobox avec champs en commentaires du champ
maliste = self.TRI_mon_list_de_list_de_parametres_de_tri[recup_index][5].split('#')
ma_liste_commentaire = maliste[0].split('#-#')
taille_maliste = len(ma_liste_commentaire)
moncombox = QtGui.QComboBox()
for i in range(1,taille_maliste):
moncombox.addItem(ma_liste_commentaire[i])
moncombox.setEditable(True)
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,moncombox)
elif type_champ[1] == "QDE":
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_est)
voisine_de_droite.addItem(self.var_n_est_pas)
voisine_de_droite.addItem(self.var_avant)
voisine_de_droite.addItem(self.var_apres)
mondateedit = QtGui.QDateEdit()
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,mondateedit)
elif type_champ[1] == "QLW": #QListWidget: on la remplit en se connectant aux différentes bases
voisine_de_droite.clear()
voisine_de_droite.addItem(self.var_contient)
voisine_de_droite.addItem(self.var_contient_pas)
voisine_de_droite.addItem(self.var_commence_par)
voisine_de_droite.addItem(self.var_finit_par)
voisine_de_droite.addItem(self.var_identique_a)
voisine_de_droite.addItem(self.var_different_de)
ma_liste_des_items = self.SCROLL_remplissage_des_QListWidget(type_champ[4],int(type_champ[5])) #type_champ[4]: nom de table ------ type_champ[5] numéro de colonne dans la table
moncombox = QtGui.QComboBox()
for chaque_item1 in ma_liste_des_items:
moncombox.addItem(chaque_item1)
self.qtableWidget_param.setCellWidget(indice_ligne,indice_colonne+2,moncombox)
if GLOBAL_mode_debuggage == 'oui': print "zuzu"
self.coloriage_de_qtableWidget_param()
def TRI_creation_ligne_dans_tableau_parametres_de_tri(self):
#NE PAS SE SERVIR DES NOMS MAIS UNIQUEMENT DES INDEX SINON LA SUPPRESSION DE LIGNE FAUSSE TOUT
nb_ligne = self.qtableWidget_param.rowCount()
if GLOBAL_mode_debuggage == 'oui': print "nb_ligne_dans_tableau"
if GLOBAL_mode_debuggage == 'oui': print nb_ligne
if nb_ligne <= 15:
self.qtableWidget_param.insertRow(nb_ligne)
#colonne0 QComboBox
if GLOBAL_mode_debuggage == 'oui': print "Remplissage ligne du tableau param"
nb_total_champs = len(self.TRI_mon_list_de_list_de_parametres_de_tri)
mon_comboBox_col_0 = QtGui.QComboBox()
mon_comboBox_col_0.setMaxVisibleItems(nb_total_champs)
#on remplit la colonne zéro
for row in range (nb_total_champs): #on prend pas le zero qui est l'index
maliste = self.TRI_mon_list_de_list_de_parametres_de_tri[row][6]
exec('''mon_label = (u"%s")''' % (maliste))
mon_comboBox_col_0.addItem(mon_label)
#colonne0 QComboBox
self.qtableWidget_param.setCellWidget(nb_ligne,0,mon_comboBox_col_0)
QtCore.QObject.connect(mon_comboBox_col_0,QtCore.SIGNAL('currentIndexChanged(int)'),self.TRI_change_texte_col0_vers_col1_et_col2)
#colonne1 QComboBox
qcombo_choix_col_1_ligne = QtGui.QComboBox()
self.qtableWidget_param.setCellWidget(nb_ligne,1,qcombo_choix_col_1_ligne)
#colonne2 QLineEdit
mon_qLineEdit_ligne = QtGui.QLineEdit()
self.qtableWidget_param.setCellWidget(nb_ligne,2,mon_qLineEdit_ligne)
#colonne3 qpushbutton PLUS
bouton_plus_ligne = QtGui.QPushButton()
bouton_plus_ligne.setText('+')
bouton_plus_ligne.setContentsMargins(10, 10, 10, 10) # MARCHE PAS mais pas grave
self.qtableWidget_param.setCellWidget(nb_ligne,3,bouton_plus_ligne)
QtCore.QObject.connect(bouton_plus_ligne,QtCore.SIGNAL('clicked()'),self.TRI_creation_ligne_dans_tableau_parametres_de_tri)
#colonne3 qpushbutton MOINS
bouton_moins_ligne = QtGui.QPushButton()
bouton_moins_ligne.setText('-')
self.qtableWidget_param.setCellWidget(nb_ligne,4,bouton_moins_ligne)
QtCore.QObject.connect(bouton_moins_ligne,QtCore.SIGNAL('clicked()'),self.TRI_suppression_ligne_dans_tableau_parametres_de_tri)
else:
mon_titre = "Attention"
mon_avertissement = "Le nombre de critères de tri \n est limité à 15"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
mabox = QMessageBox_derive()
mabox.box_erreur(mon_titre,mon_avertissement)
self.TRI_change_texte_col0_vers_col1_et_col2()
self.coloriage_de_qtableWidget_param()
def TRI_suppression_ligne_dans_tableau_parametres_de_tri(self):
widgetActuel = QtGui.QApplication.focusWidget() #recupère le widget sélectionné
ma_pos = widgetActuel.pos()
mon_index = self.qtableWidget_param.indexAt(ma_pos)
nb_ligne = self.qtableWidget_param.rowCount()
if nb_ligne > 1:
self.qtableWidget_param.removeRow(mon_index.row())
self.coloriage_de_qtableWidget_param()
def TRI_ordre_des_tris(self):
if GLOBAL_mode_debuggage == 'oui': print "Remplissage des 3 ordres de tri"
nb_total_champs = len(self.TRI_mon_list_de_list_de_parametres_de_tri)
self.ordre_de_tri_1.setMaxVisibleItems(nb_total_champs)
self.ordre_de_tri_2.setMaxVisibleItems(nb_total_champs)
self.ordre_de_tri_3.setMaxVisibleItems(nb_total_champs)
#http://www.fileformat.info/info/unicode/block/arrows/utf8test.htm
#self.ordre_de_tri_1.addItem(unichr(int("0026", 16)))
#self.ordre_de_tri_1.addItem(u"\u21E7")
#on remplit la colonne zéro
###
exec("self.asc_desc_1.addItem(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))), '')" % (GLOBAL_chemin_icone, "arrow_top.png"))
exec("self.asc_desc_1.addItem(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))), '')" % (GLOBAL_chemin_icone, "arrow_down.png"))
exec("self.asc_desc_2.addItem(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))), '')" % (GLOBAL_chemin_icone, "arrow_top.png"))
exec("self.asc_desc_2.addItem(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))), '')" % (GLOBAL_chemin_icone, "arrow_down.png"))
exec("self.asc_desc_3.addItem(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))), '')" % (GLOBAL_chemin_icone, "arrow_top.png"))
exec("self.asc_desc_3.addItem(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))), '')" % (GLOBAL_chemin_icone, "arrow_down.png"))
self.ordre_de_tri_1.clear()
self.ordre_de_tri_2.clear()
self.ordre_de_tri_3.clear()
self.ordre_de_tri_1.addItem("")
self.ordre_de_tri_2.addItem("")
self.ordre_de_tri_3.addItem("")
for row in range (nb_total_champs): #on prend pas le zero qui est l'index
maliste = self.TRI_mon_list_de_list_de_parametres_de_tri[row][6]
exec('''mon_label = (u"%s")''' % (maliste))
self.ordre_de_tri_1.addItem(mon_label)
self.ordre_de_tri_1.setItemData(row, mon_label, QtCore.Qt.ToolTipRole)
self.ordre_de_tri_2.addItem(mon_label)
self.ordre_de_tri_2.setItemData(row, mon_label, QtCore.Qt.ToolTipRole)
self.ordre_de_tri_3.addItem(mon_label)
self.ordre_de_tri_3.setItemData(row, mon_label, QtCore.Qt.ToolTipRole)
def RESULTAT_preparation_tableau(self):
# ##clic droit dans header des colonnes
#self.qtableWidget_resultat.setHorizontalHeader(QtGui.QHeaderView(QtCore.Qt.Horizontal,self.qtableWidget_resultat))
nb_total_champs = len(self.RESULTAT_mon_list_de_list_de_colonne)
self.mon_QHeaderView_special = QHeaderView_special(QtCore.Qt.Horizontal, self.qtableWidget_resultat)
self.qtableWidget_resultat.setSortingEnabled(True)
self.qtableWidget_resultat.setHorizontalHeader(self.mon_QHeaderView_special)
QtCore.QObject.connect(self.qtableWidget_resultat.horizontalHeader(),QtCore.SIGNAL("clic_droit_header_horiz"),self.RESULTAT_menu_header_principal_de_tableau_resultat)
self.qtableWidget_resultat.setColumnCount(nb_total_champs)
for index in range(nb_total_champs): #on prend également le zero avec l'index de la base
#QLE QTE QCB QDE
maliste = self.RESULTAT_mon_list_de_list_de_colonne[index][6]
exec('''mon_label = (u"%s")''' % (maliste))
item = QtGui.QTableWidgetItem()
item.setText(mon_label)
item.setTextAlignment(0) #0:aligné à gauche / 1:aligné centre / 2:aligné droite
#?if GLOBAL_mode_debuggage == 'oui': print unicode(item.text()).encode("cp850")
self.qtableWidget_resultat.setHorizontalHeaderItem(index, item)#rien
self.qtableWidget_resultat.showColumn(index)
self.qtableWidget_resultat.horizontalHeader().show()
self.qtableWidget_resultat.setSortingEnabled(True) #active tri sur colonne
self.qtableWidget_resultat.resizeColumnsToContents()
#self.qtableWidget_resultat.setAlternatingRowColors(True)
#sélection de la ligne au lieu de la cellule cliquée
titi = QtGui.QAbstractItemView.SelectRows
self.qtableWidget_resultat.setSelectionBehavior(titi)
#empêche l'édition du tableau - éditable
self.qtableWidget_resultat.setItemDelegate(QtGui.QItemDelegate(self.qtableWidget_resultat))
toto = QtGui.QAbstractItemView.NoEditTriggers
self.qtableWidget_resultat.setEditTriggers(toto)
#désactive la sélection multiple
self.qtableWidget_resultat.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) #désactive la sélection multiple
# ##clic droit dans header des colonnes
# mon_QHeaderView_special = QHeaderView_special(QtCore.Qt.Horizontal, self.qtableWidget_resultat)
# mon_QHeaderView_special.setMovable(True)
# self.qtableWidget_resultat.setHorizontalHeader(mon_QHeaderView_special)
# QtCore.QObject.connect(self.qtableWidget_resultat.horizontalHeader(),QtCore.SIGNAL("clic_droit_header_horiz"),self.RESULTAT_menu_header_principal_de_tableau_resultat)
try:
toto = self.RESULTAT_colonnes_visibles_et_taille
dada = 2
except:
dada = 8
#if GLOBAL_mode_debuggage == 'oui': print "dada"
#if GLOBAL_mode_debuggage == 'oui': print dada
if GLOBAL_config_actuelle_finale != "_" and dada !=8:
if GLOBAL_mode_debuggage == 'oui': print "config perso"
self.colonnes_visibles_et_taille_dans_resultat = copy.deepcopy((eval(self.RESULTAT_colonnes_visibles_et_taille)))
taille_du_list_perso = len(self.colonnes_visibles_et_taille_dans_resultat)
if GLOBAL_mode_debuggage == 'oui': print "taille_du_list_perso" #logicalIndex en 0, visual_index en 1, taille en 2, visible ou pas en 3
if GLOBAL_mode_debuggage == 'oui': print taille_du_list_perso
for element in range (taille_du_list_perso):
self.qtableWidget_resultat.setColumnWidth(self.colonnes_visibles_et_taille_dans_resultat[element][0], self.colonnes_visibles_et_taille_dans_resultat[element][2])
self.qtableWidget_resultat.showColumn(self.colonnes_visibles_et_taille_dans_resultat[element][0])
for element in range(taille_du_list_perso):
mon_visual = self.mon_QHeaderView_special.visualIndex(int(self.colonnes_visibles_et_taille_dans_resultat[element][0]))
self.mon_QHeaderView_special.moveSection(mon_visual, self.colonnes_visibles_et_taille_dans_resultat[element][1])
#BUG VISUAL
sup_ou_ajout_de_champ_de_table = "non"
for element in range(taille_du_list_perso):
try:
if self.colonnes_visibles_et_taille_dans_resultat[element][3] == "non":
self.qtableWidget_resultat.hideColumn(self.colonnes_visibles_et_taille_dans_resultat[element][0])
elif self.colonnes_visibles_et_taille_dans_resultat[element][3] == "oui":
self.qtableWidget_resultat.showColumn(self.colonnes_visibles_et_taille_dans_resultat[element][0])
except:
self.qtableWidget_resultat.showColumn(self.colonnes_visibles_et_taille_dans_resultat[element][0])
sup_ou_ajout_de_champ_de_table = "oui"
if sup_ou_ajout_de_champ_de_table == "oui": #message d'erreur car les colonnes ne retourvent plus les index en cas de rajout modif de table
texte_titre = "configuration mal définie"
msg = "Vous devez sauvegarder vos paramètres visuels via /paramètres/enregistrer le visuel"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Critical)
ma_boite.setInformativeText(msg)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
#self.mon_QHeaderView_special.()
#QHeaderView.moveSection (self, int from, int to)
#QHeaderView.moveSection (from ancien_visual , to visual_index)
#int logicalIndex (self, int visualIndex)
#if GLOBAL_mode_debuggage == 'oui': print doudou
def RESULTAT_cell_clickee(self,ligne,col):
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "ligne"
if GLOBAL_mode_debuggage == 'oui': print ligne
if GLOBAL_mode_debuggage == 'oui': print "col"
if GLOBAL_mode_debuggage == 'oui': print col
if self.qtableWidget_resultat.currentRow() != -1:
#self.resultat_clic_recherche
#ref_index = self.qtableWidget_resultat.item(ligne,0).data(0).toString() pas besoin de toString(), on chope direct le data(0)
ref_index = self.qtableWidget_resultat.item(ligne,0).data(0)
if GLOBAL_mode_debuggage == 'oui': print "ref_index ligne differente de un"
if GLOBAL_mode_debuggage == 'oui': print ref_index
ligne_scroll_QLW = -1
for elem in self.resultat_clic_recherche:
if ref_index == elem[0]:
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "youpi"
if GLOBAL_mode_debuggage == 'oui': print elem
debut_mon_nom = unicode("Affaire: ", "iso-8859-1")
fin_mon_nom = unicode(elem[1], "iso-8859-1")
fin_mon_nom2 = unicode(elem[2], "iso-8859-1")
total_mon_nom = debut_mon_nom + fin_mon_nom
total_mon_nom2 = debut_mon_nom + fin_mon_nom + unicode(" - ") + fin_mon_nom2
self.mon_Qlabel_status_bar3.setText(total_mon_nom2)
exec("MainWindow.setWindowTitle(_fromUtf8('%s_%s - %s'))" % (GLOBAL_nom_programme, GLOBAL_version_programme, total_mon_nom))
#Si Nouveau-Modif-Annuler sont visibles, alors on effectue les actions ci-dessous, sinon, on ne fait rien
#if self.qpush_nouveau.isVisible() == True and self.qpush_modifier.isVisible() == True and self.qpush_supprimer.isVisible() == True:
self.ligne_cliquee_avant_modif = elem #a utiliser pour vérifier si une modif a été effectuée entre temps
if self.ordre_Tri_Resultat_Scroll[0][3] is not None:
list_ordre = eval(self.ordre_Tri_Resultat_Scroll[0][3])
else:
list_ordre = []
for num in range(elem): #elem contient la ligne avec les valeurs
list_ordre.append(num)
#####
if GLOBAL_mode_debuggage == 'oui': print "insertion de tous les blabla quand clic sur ligne"
try:
for num_ligne in range(1,self.mon_grid_area.rowCount()):
mon_widget = self.mon_grid_area.itemAtPosition(num_ligne,1).widget()
mon_libelle = self.mon_grid_area.itemAtPosition(num_ligne,0).widget().text()
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print "insertion dans %s" % (mon_libelle)
#if GLOBAL_mode_debuggage == 'oui': print "type widget: %s" % (mon_widget)
#if GLOBAL_mode_debuggage == 'oui': print (elem[list_ordre[num_ligne]])
#bug, mais normalement ça marche
if type(mon_widget) == type(QComboBox_boost_SCROLL()):
trouve_qcb = 0
for num_cbbx in range(mon_widget.count()): #nettoyage des champs qui n'existent plus
qfont_detecte = mon_widget.itemData(num_cbbx, QtCore.Qt.FontRole) #pas de bug, mais se poser la question pour les Qlistwidget....
if qfont_detecte.typeName() == "QFont":
if GLOBAL_mode_debuggage == 'oui': print "qfont_detecte.typeName()"
if GLOBAL_mode_debuggage == 'oui': print qfont_detecte.typeName()
if GLOBAL_mode_debuggage == 'oui': print "italique gras youpi"
convertionok = qfont_detecte.Font
if GLOBAL_mode_debuggage == 'oui': print "convertionok"
if GLOBAL_mode_debuggage == 'oui': print qfont_detecte.toString()
monQFont = QtGui.QFont()
monQFont.setItalic(True) #italique
monQFont.setBold(True) #gras
pour_comparer = QtCore.QVariant(monQFont).toString()
if qfont_detecte.toString() == pour_comparer:
mon_widget.removeItem(num_cbbx)
for num_cbbx in range(mon_widget.count()):
if mon_widget.itemText(num_cbbx) == (elem[list_ordre[num_ligne]]):
mon_widget.setCurrentIndex(num_cbbx)
trouve_qcb = 1
if (elem[list_ordre[num_ligne]]) is None: #gestion des champs "null" (ou None) dans la base mysql
mon_widget.setCurrentIndex(num_cbbx)
trouve_qcb = 1
if trouve_qcb == 0: #BUG possible mais normalement ok #si on rencontre une ligne qui a été supprimée via les peties bases #BUG possible: vérifier le fonctionnement
mon_widget.addItem(elem[list_ordre[num_ligne]])
mon_widget.setCurrentIndex(mon_widget.count()-1)
##combo.setItemData(rowIndex, QVariant(myCustomFont), Qt.FontRole)
#mon_widget.setItemData(mon_widget.count()-1, QtCore.Qt.AlignRight, QtCore.Qt.TextAlignmentRole)
monQFont = QtGui.QFont()
monQFont.setItalic(True) #italique
monQFont.setBold(True) #gras
mon_widget.setItemData(mon_widget.count()-1, monQFont, QtCore.Qt.FontRole) #bug pasbug: à developper égalment pour les list view???
###mode nouveau###
if self.qpush_valider_nouveau.isVisible() == True:
mon_widget.setCurrentIndex(0)
elif type(mon_widget) == type(QtGui.QLineEdit()):
#if GLOBAL_mode_debuggage == 'oui': print "type de la donnee"
#if GLOBAL_mode_debuggage == 'oui': print type(elem[list_ordre[num_ligne]])
try:
if type(elem[list_ordre[num_ligne]]) is long or type(elem[list_ordre[num_ligne]]) is int or type(elem[list_ordre[num_ligne]]) is float:
mon_widget.setText(str(elem[list_ordre[num_ligne]]))
else:
mon_widget.setText(elem[list_ordre[num_ligne]])
if self.qpush_valider_nouveau.isVisible() == True:
mon_widget.setText('')
except:
mon_widget.setText('')
elif type(mon_widget) == type(QTextEdit_boost_zone_text()):
if type(elem[list_ordre[num_ligne]]) is long or type(elem[list_ordre[num_ligne]]) is int or type(elem[list_ordre[num_ligne]]) is float:
mon_widget.setPlainText(str(elem[list_ordre[num_ligne]]))
else:
try:
dudu = elem[list_ordre[num_ligne]]
mon_widget.setPlainText(elem[list_ordre[num_ligne]])
except:
mon_widget.setPlainText('')
if self.qpush_valider_nouveau.isVisible() == True:
mon_widget.setPlainText('')
elif type(mon_widget) == type(QDateEdit_boost_SCROLL()):
try:
mon_widget.setDate(elem[list_ordre[num_ligne]])
except:
monQDate = QtCore.QDate()
zouzou = monQDate.fromString("19000101", "yyyyMMdd")
mon_widget.setDate(zouzou)
if self.qpush_valider_nouveau.isVisible() == True:
monQDate = QtCore.QDate()
zouzou = monQDate.fromString("19000101", "yyyyMMdd")
mon_widget.setDate(zouzou)
elif type(mon_widget) == type(QListWidget_boost_SCROLL()):
ligne_scroll_QLW = ligne_scroll_QLW + 1
#mon_widget.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
"""
self.qpush_nouveau.show()
self.qpush_modifier.show()
self.qpush_supprimer.show()
self.qpush_valider_nouveau.hide()
self.qpush_valider_modif.hide()
self.qpush_annuler.hide()
"""
exec("ma_liste_origine_QLW = copy.deepcopy(self.ma_liste_des_items_QLW_%s)" % ligne_scroll_QLW)
mon_widget.clear()
for item_origine in ma_liste_origine_QLW:
mon_widget.addItem(item_origine)
###mode lecture###
if self.qpush_modifier.isVisible() == True:
for num_clw in range(mon_widget.count()):
mon_widget.setItemSelected(mon_widget.item(num_clw),False)
mon_widget.setItemHidden(mon_widget.item(num_clw),True)
###mode lecture###
if elem[list_ordre[num_ligne]] is not None and self.qpush_modifier.isVisible() == True:
mon_split = elem[list_ordre[num_ligne]].split('##')
for piti_split in mon_split:
mon_qlistwidgetitem = QtGui.QListWidgetItem()
mon_qlistwidgetitem.setText(piti_split)
trouve_clw = 0
for num_clw in range(mon_widget.count()):
if mon_qlistwidgetitem.text() == mon_widget.item(num_clw).text():
mon_widget.setItemSelected(mon_widget.item(num_clw),True)
mon_widget.setItemHidden(mon_widget.item(num_clw),False)
trouve_clw = 1
if (elem[list_ordre[num_ligne]]) is None or elem[list_ordre[num_ligne]] == "Null": #gestion des champs "null" (ou None) dans la base mysql
trouve_clw = 1
if trouve_clw == 0 : #BUG possible mais normalement ok #si on rencontre une ligne qui a été supprimée via les peties bases #BUG possible: vérifier le fonctionnement
monQFont = QtGui.QFont()
monQFont.setItalic(True) #italique
monQFont.setBold(True) #gras
mon_qlistwidgetitem.setFont(monQFont)
mon_widget.addItem(mon_qlistwidgetitem)
mon_widget.setItemSelected(mon_qlistwidgetitem,True)
mon_widget.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
###mode modif###
elif self.qpush_valider_modif.isVisible() == True:
mon_widget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
if elem[list_ordre[num_ligne]] is None or elem[list_ordre[num_ligne]] == "Null":
for num_clw in range(mon_widget.count()):
mon_widget.setItemSelected(mon_widget.item(num_clw),False)
mon_widget.setItemHidden(mon_widget.item(num_clw),False) #visible
else:
mon_split = elem[list_ordre[num_ligne]].split('##')
for piti_split in mon_split:
mon_qlistwidgetitem = QtGui.QListWidgetItem()
mon_qlistwidgetitem.setText(piti_split)
trouve_clw = 0
for num_clw in range(mon_widget.count()):
if mon_qlistwidgetitem.text() == mon_widget.item(num_clw).text():
mon_widget.setItemSelected(mon_widget.item(num_clw),True)
#mon_list_widgetQLW_pipo = mon_widget.findItems(mon_widget.item(num_clw).text(),QtCore.Qt.MatchFlags())
#mon_widget.setItemSelected(mon_list_widgetQLW_pipo[0],True)
trouve_clw = 1
mon_widget.setItemHidden(mon_widget.item(num_clw),False) #visible
if trouve_clw == 0 : #BUG possible mais normalement ok #si on rencontre une ligne qui a été supprimée via les peties bases #BUG possible: vérifier le fonctionnement
monQFont = QtGui.QFont()
monQFont.setItalic(True) #italique
monQFont.setBold(True) #gras
mon_qlistwidgetitem.setFont(monQFont)
mon_widget.addItem(mon_qlistwidgetitem)
mon_widget.setItemSelected(mon_qlistwidgetitem,True)
#mon_widget.findItems(mon_widget.item(num_clw).text(),QtCore.Qt.MatchFlags())
###mode nouveau###
elif self.qpush_valider_nouveau.isVisible() == True:
if GLOBAL_mode_debuggage == 'oui': print "mode nouveau"
#se servir de ça ??? SCROLL_remplissage_des_QListWidget pas sûr...
if elem[list_ordre[num_ligne]] is not None:
mon_split = elem[list_ordre[num_ligne]].split('##')
for piti_split in mon_split:
mon_qlistwidgetitem = QtGui.QListWidgetItem()
mon_qlistwidgetitem.setText(piti_split)
trouve_clw = 0
for num_clw in range(mon_widget.count()):
if GLOBAL_mode_debuggage == 'oui': print unicode(mon_qlistwidgetitem.text()).encode("CP850")
if GLOBAL_mode_debuggage == 'oui': print unicode(mon_widget.item(num_clw).text()).encode("CP850")
if mon_qlistwidgetitem.text() == mon_widget.item(num_clw).text():
mon_widget.setItemSelected(mon_widget.item(num_clw),False)
mon_widget.setItemHidden(mon_widget.item(num_clw),False)
trouve_clw = 1
if (elem[list_ordre[num_ligne]]) is None or elem[list_ordre[num_ligne]] == "Null": #gestion des champs "null" (ou None) dans la base mysql
trouve_clw = 1
if GLOBAL_mode_debuggage == 'oui': print "trouve_clw"
if GLOBAL_mode_debuggage == 'oui': print trouve_clw
if trouve_clw == 0:
#mon_widget.addItem(mon_qlistwidgetitem.text())
mon_widget.setItemHidden(mon_widget.item(num_clw),True)
mon_widget.setItemSelected(mon_qlistwidgetitem,False)
"""
for num_clw in range(mon_widget.count()):
mon_widget.setItemSelected(mon_widget.item(num_clw),False)
mon_widget.setItemHidden(mon_widget.item(num_clw),False) #visible
"""
elif elem[list_ordre[num_ligne]] is None or elem[list_ordre[num_ligne]] == "Null":
for num_clw in range(mon_widget.count()):
mon_widget.setItemSelected(mon_widget.item(num_clw),False)
mon_widget.setItemHidden(mon_widget.item(num_clw),False) #visible
mon_widget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
else:
if GLOBAL_mode_debuggage == 'oui': print "il manque des choses"
except:
texte_titre = "erreur"
msg = "Bug de remplissage à débugger du list area de droite, contactez l'administrateur pour une mise à jour logiciel"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Critical)
ma_boite.setInformativeText(msg)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
else:
toto = 2
#if GLOBAL_mode_debuggage == 'oui': print "pas de ligne resultat cliquee"
else:
if GLOBAL_mode_debuggage == 'oui': print "RESULTAT_cell_clickee currentRow egal a -1"
self.mon_grid_area.setEnabled(False)
def RESULTAT_menu_header_principal_de_tableau_resultat(self):
if GLOBAL_mode_debuggage == 'oui': print "RESULTAT_menu_header_principal_de_tableau_resultat"
self.mon_Qmenu_header = QtGui.QMenu(self.qtableWidget_resultat)
for index in range(len(self.RESULTAT_mon_list_de_list_de_colonne)):
###############
#QLE QTE QCB QDE
maliste = self.RESULTAT_mon_list_de_list_de_colonne[index][6]
exec('''mon_label = (u"%s")''' % (maliste))
###############
#exec("self.action_header%d = self.mon_Qmenu_header.addAction(self.RESULTAT_mon_list_de_list_de_colonne[%d][5])" % (index, index))
exec("self.action_header%d = self.mon_Qmenu_header.addAction(mon_label)" % (index))
exec("self.action_header%d.setCheckable(True)" % (index))
if self.qtableWidget_resultat.isColumnHidden(index) == True:
exec("self.action_header%d.setChecked(False)" % (index))
elif self.qtableWidget_resultat.isColumnHidden(index) == False:
exec("self.action_header%d.setChecked(True)" % (index))
#permet de transmetre un paramatre dans la fonction, très pratique!!! self=self permet de conserver le self
exec("QtCore.QObject.connect(self.action_header%d, QtCore.SIGNAL(_fromUtf8('triggered()')), lambda self=self, num_col=%d: self.RESULTAT_afficher_masquer_colonne(num_col))" % (index,index))
#exec("QtCore.QObject.connect(self.action_header%d, QtCore.SIGNAL(_fromUtf8('triggered()')), self.RESULTAT_afficher_masquer_colonne)" % (index))
#QtCore.QObject.connect(self.action_header1, QtCore.SIGNAL(_fromUtf8('triggered()')), lambda who= 1: self.RESULTAT_afficher_masquer_colonne(who))
#self.connect(msa_v1.button_file,SIGNAL('clicked()'), lambda who=msa_v1: self.control.choose_file(who))
#self.connect(button3, SIGNAL("clicked()"), lambda who="Three": self.anyButton(who))
self.mon_Qmenu_header.exec_(QtGui.QCursor.pos())
def RESULTAT_afficher_masquer_colonne(self,num_col):
if GLOBAL_mode_debuggage == 'oui': print "RESULTAT_afficher_masquer_colonne"
if GLOBAL_mode_debuggage == 'oui': print num_col
if self.qtableWidget_resultat.isColumnHidden(num_col) == True:
self.qtableWidget_resultat.setColumnHidden(num_col, False)
elif self.qtableWidget_resultat.isColumnHidden(num_col) == False:
self.qtableWidget_resultat.setColumnHidden(num_col, True)
def SCROLL_clearLayout(self, layout):
for i in reversed(range(layout.count())):
item = layout.itemAt(i)
if isinstance(item, QtGui.QWidgetItem):
#if GLOBAL_mode_debuggage == 'oui': print "widget" + str(item)
item.widget().close()
# or
# item.widget().setParent(None)
elif isinstance(item, QtGui.QSpacerItem):
if GLOBAL_mode_debuggage == 'oui': print "spacer " + str(item)
# no need to do extra stuff
else:
#if GLOBAL_mode_debuggage == 'oui': print "layout " + str(item)
self.SCROLL_clearLayout(item.layout())
# remove the item from layout
layout.removeItem(item)
def SCROLL_remplissage_champs(self):
#si self.mon_grid_area existe déjà, on supprime tou les widgets contenus dedans
try:
toto = self.mon_grid_area.count() #astuce pour vérifier si l'objet existe
self.SCROLL_clearLayout(self.mon_grid_area) #suppresion de tous les widgets
except:
titi = 2
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "ICICICI self.SCROLL_AREA_mon_list_de_list_de_champs ICICICI"
if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs
#if GLOBAL_mode_debuggage == 'oui': print "%d lignes\n" % cur.rowcount
if GLOBAL_mode_debuggage == 'oui': print "Remplissage Qscroll Area"
nb_total_champs = len(self.SCROLL_AREA_mon_list_de_list_de_champs)
if GLOBAL_mode_debuggage == 'oui': print nb_total_champs
#if GLOBAL_mode_debuggage == 'oui': print self.self.SCROLL_AREA_mon_list_de_list_de_champs[1][0]
#on remplit le tableau avec le résultat de la requete
row_QLW = -1
self.mon_grid_area = QtGui.QGridLayout()
for row in range (1,nb_total_champs): #on prend pas le zero qui est l'index
type_champ = self.SCROLL_AREA_mon_list_de_list_de_champs[row][0].split('#')
if GLOBAL_mode_debuggage == 'oui': print type_champ
nom_du_champ_seul = self.SCROLL_AREA_mon_list_de_list_de_champs[row][6] #nom de champ tout seul
#mon_mdp = list_commentaire[1] #"pas_de_mdp" ou bien mot de passe
#analyse pour petit carré à droite
try:
if type_champ[2] == "QPB":
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "essai bouton de droite preparation debut"
monQPush = QtGui.QPushButton()
monQPush.setMaximumSize(QtCore.QSize(20, 20))
monQPush.setMinimumSize(QtCore.QSize(10, 10))
monQPush.setText("...")
#on passe le nom de la table où on doit se connecter ainsi que le mot de passe
list_commentaire = self.SCROLL_AREA_mon_list_de_list_de_champs[row][5].split('#')
mon_mdp = list_commentaire[1]
#QtCore.QObject.connect(monQPush,QtCore.SIGNAL("clicked()"),lambda self=self, type_champ=type_champ[2], nom_de_table=type_champ[4], mdp = commentaires_deuxieme_split[1]: self.SCROLL_petit_bouton_de_droite(type_champ,nom_de_table,mdp))
QtCore.QObject.connect(monQPush,QtCore.SIGNAL("clicked()"),lambda self=self, type_champ=type_champ[2], nom_de_table=type_champ[4], mdp = mon_mdp, num_row_grid = row: self.SCROLL_petit_bouton_de_droite(type_champ,nom_de_table,mdp,num_row_grid))
if GLOBAL_mode_debuggage == 'oui': print "validation bouton de droite preparation fin"
else:
monQPush = ""
except:
monQPush = ""
#if GLOBAL_mode_debuggage == 'oui': print "\ntype_champ"
#if GLOBAL_mode_debuggage == 'oui': print type_champ
#QLE QTE QCB QDE QLW
if type_champ[1] == "QLW": #QListWidget: on la remplit en se connectant aux différentes bases
row_QLW = row_QLW + 1
monListWidget = QListWidget_boost_SCROLL()
if type_champ[3] == "sc": #simple choix
monListWidget.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
monListWidget.setMaximumSize(QtCore.QSize(5000, 20))
elif type_champ[3] == "mc": #multi choix
monListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
#On remplit les list Widget en passant le type de table en paramètre, et on remplit la liste
exec("self.ma_liste_des_items_QLW_%s = self.SCROLL_remplissage_des_QListWidget(type_champ[4],int(type_champ[5]))" % row_QLW) #type_champ[4]: nom de table ------ type_champ[5] numéro de colonne dans la table
exec("ma_liste = copy.deepcopy(self.ma_liste_des_items_QLW_%s)" % row_QLW)
for chaque_item1 in ma_liste:
monListWidget.addItem(chaque_item1)
exec('''objet = QLabel_boost(u"%s"),monListWidget,monQPush''' % ((nom_du_champ_seul)))
QtCore.QObject.connect(objet[0],QtCore.SIGNAL("clicked()"),lambda self=self, text_label=nom_du_champ_seul: self.SCROLL_label_clique_col0(text_label))
elif type_champ[1] == "QLE": #QLineEdit
type_de_donnees = self.SCROLL_AREA_mon_list_de_list_de_champs[row][1] #vérif du type de donnée et rajout d'un validateur pour les champ en INT
if GLOBAL_mode_debuggage == 'oui': print "type_de_donnees"
if GLOBAL_mode_debuggage == 'oui': print type_de_donnees[:3]
if type_de_donnees[:3] == "int":
monline_edit = QtGui.QLineEdit()
split_type_donnees = type_de_donnees.split("(")
split_de_split = split_type_donnees[1].split(")")
taille_maxi = int(split_de_split[0])
monline_edit.setMaxLength(taille_maxi)
monline_edit.setValidator(QtGui.QIntValidator(0, 999999999, monline_edit))
exec('''objet = QLabel_boost(u"%s"),monline_edit,monQPush''' % ((nom_du_champ_seul)))
elif type_de_donnees[:5] == "float":
monline_edit = QtGui.QLineEdit()
min = 0.00
max = 99.99
no_decimals = 2
monline_edit.setMaxLength(len(str(max)))
aValidator = MyDoubleValidator(min, max, no_decimals, monline_edit)
monline_edit.setValidator(aValidator)
#monline_edit.setValidator(QtGui.QDoubleValidator(0.00, 99.99, 2, monline_edit))
exec('''objet = QLabel_boost(u"%s"),monline_edit,monQPush''' % ((nom_du_champ_seul)))
else:
monline_edit = QtGui.QLineEdit()
split_type_donnees = type_de_donnees.split("(")
split_de_split = split_type_donnees[1].split(")")
taille_maxi = int(split_de_split[0])
monline_edit.setMaxLength(taille_maxi) #taille maxi pour les champs texte
exec('''objet = QLabel_boost(u"%s"),monline_edit,monQPush''' % ((nom_du_champ_seul)))
if nom_du_champ_seul == "Affaire":
QtCore.QObject.connect(objet[1],QtCore.SIGNAL("textChanged(const QString&)"),self.SCROLL_titre_scroll_affaire)
QtCore.QObject.connect(objet[0],QtCore.SIGNAL("clicked()"),lambda self=self, text_label=nom_du_champ_seul: self.SCROLL_label_clique_col0(text_label))
elif type_champ[1] == "QTE": #QTextEdit
monTextEdit = QTextEdit_boost_zone_text()
exec('''objet = QLabel_boost(u"%s"),monTextEdit,monQPush''' % ((nom_du_champ_seul)))
QtCore.QObject.connect(objet[0],QtCore.SIGNAL("clicked()"),lambda self=self, text_label=nom_du_champ_seul: self.SCROLL_label_clique_col0(text_label))
elif type_champ[1] == "QCB": #QComboBox: on la remplit:
#soit avec les informations des commentaires
#soit avec la connection en mySQL à la table correpondante lorsqu'un Qpushbutton existe à droite
#moncombox = QtGui.QComboBox()
moncombox = QComboBox_boost_SCROLL()
moncombox.setEditable(False)
try: # si on arrive à récupérer le type de champs 2, alors c'est un Qpush Button, donc connection MysqL nécessaire,
#sinon on récepuère les champs commentaires
type_champ[2]
#COmbobox avec champs en base Mysql
#On remplit les list Widget en passant le type de table en paramètre, et on remplit la liste
maliste = self.SCROLL_AREA_mon_list_de_list_de_champs[row][5].split('#')
maliste2 = maliste[0].split('#-#')
ma_liste_des_items = self.SCROLL_remplissage_des_QListWidget(type_champ[4],int(type_champ[5])) #type_champ[4]: nom de table ------ type_champ[5] numéro de colonne dans la table
for chaque_item1 in ma_liste_des_items:
moncombox.addItem(chaque_item1)
exec('''objet = QLabel_boost(u"%s"),moncombox,monQPush''' % (maliste2[0]))
except: #COmbobox avec champs en commentaires du champ
maliste = self.SCROLL_AREA_mon_list_de_list_de_champs[row][5].split('#')
ma_liste_commentaire = maliste[0].split('#-#')
taille_maliste = len(ma_liste_commentaire)
for i in range(1,taille_maliste):
moncombox.addItem(ma_liste_commentaire[i])
exec('''objet = QLabel_boost(u"%s"),moncombox,monQPush''' % (nom_du_champ_seul))
QtCore.QObject.connect(objet[0],QtCore.SIGNAL("clicked()"),lambda self=self, text_label=nom_du_champ_seul: self.SCROLL_label_clique_col0(text_label))
elif type_champ[1] == "QDE": #QDateEdit
exec('''objet = QLabel_boost(u"%s"),QDateEdit_boost_SCROLL(),monQPush''' % (nom_du_champ_seul))
QtCore.QObject.connect(objet[0],QtCore.SIGNAL("clicked()"),lambda self=self, text_label=nom_du_champ_seul: self.SCROLL_label_clique_col0(text_label))
else:
mon_titre = _fromUtf8("Erreur de traitement")
mon_avertissement = _fromUtf8("Erreur importation contacter MD")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
mabox = QMessageBox_derive()
mabox.box_erreur(mon_titre,mon_avertissement)
objet[0].setAlignment(QtCore.Qt.AlignRight)
self.mon_grid_area.addWidget(objet[0],row,0)
self.mon_grid_area.addWidget(objet[1],row,1)
#QtCore.QObject.connect(objet[0],QtCore.SIGNAL("clicked()"),self.SCROLL_label_clique_col0)
try:
self.mon_grid_area.addWidget(objet[2],row,2)
if GLOBAL_mode_debuggage == 'oui': print "bouton de droite insertion finale"
self.mon_grid_area.itemAtPosition(row,0).widget().setToolTip("Gras Italique signifie champ supprimé") #survol hover hoover
except:
fifi =4
self.verticalLayoutArea.addLayout(self.mon_grid_area)
self.qscrollArea_detail.horizontalScrollBar().setInvertedAppearance(False) #change le scrollbar slider de droite à gauche !!! mais marche pas vriament....
self.FICHE_annuler() #on active comme si on avait fait annuler
def SCROLL_titre_scroll_affaire(self, text_changement):
blabla = self.accents_transformation(text_changement)
titre_affaire = self.accents_transformation(blabla)
#exec("self.groupBox_scroll.setTitle('Affaire: '%s)" % text_changement)
self.groupBox_scroll.setTitle('Affaire: ' + blabla)
#self.groupBox_scroll.setAlignment(4) #centré
#self.groupBox_scroll.setFlat(True) #enlève le contour
def SCROLL_label_clique_col0(self,text_label):
if GLOBAL_modif_unique_ou_multiple == "unique":
if GLOBAL_mode_debuggage == 'oui': print "unique SCROLL_label_clique_col0 "
#self.qtableWidget_resultat.horizontalHeader().keyboardSearch(text_label)
#self.qtableWidget_resultat.horizontalHeader().keyboardSearch("Avancement")
for num in range(self.qtableWidget_resultat.columnCount()):
if text_label == self.qtableWidget_resultat.horizontalHeaderItem(num).text():
if GLOBAL_mode_debuggage == 'oui': print "header ok, on scroll"
ligne_actuelle = self.qtableWidget_resultat.currentRow()
if GLOBAL_mode_debuggage == 'oui': print "ligne_actuelle"
if GLOBAL_mode_debuggage == 'oui': print ligne_actuelle
if ligne_actuelle != -1:
if GLOBAL_mode_debuggage == 'oui': print "toto"
self.qtableWidget_resultat.setCurrentCell(self.qtableWidget_resultat.currentRow(),num)
self.qtableWidget_resultat.scrollToItem(self.qtableWidget_resultat.currentItem())
self.RESULTAT_cell_clickee(self.qtableWidget_resultat.currentRow(), self.qtableWidget_resultat.currentColumn())
else:
self.qtableWidget_resultat.setCurrentCell(0,num)
self.qtableWidget_resultat.scrollToItem(self.qtableWidget_resultat.currentItem())
elif GLOBAL_modif_unique_ou_multiple == "multiple":
if GLOBAL_mode_debuggage == 'oui': print "multiple SCROLL_label_clique_col0"
for num_ligne in range(1,self.mon_grid_area.rowCount()):
if self.mon_grid_area.itemAtPosition(num_ligne,0).widget().text() == text_label and text_label != "Affaire":
mon_widget_col_1 = self.mon_grid_area.itemAtPosition(num_ligne,1).widget()
if mon_widget_col_1.isEnabled() == True:
noir = QtGui.QColor("black")
blanc = QtGui.QColor("white")
gris = QtGui.QColor("gray")
gris_clair = QtGui.QColor(173,216,230) #bleu acier
mapalette_modif_multiple = QtGui.QPalette()
#mapalette_modif_multiple.setColor(QtGui.QPalette.Text, blanc)
mapalette_modif_multiple.setColor(QtGui.QPalette.Base, gris)
mon_widget_col_1.setPalette(mapalette_modif_multiple)
mon_widget_col_1.setEnabled(False)
elif mon_widget_col_1.isEnabled() == False:
noir = QtGui.QColor("black")
blanc = QtGui.QColor("white")
gris = QtGui.QColor("gray")
orange = QtGui.QColor("orange")
gris_clair = QtGui.QColor(173,216,230) #bleu acier
mapalette_modif_multiple = QtGui.QPalette()
mapalette_modif_multiple.setColor(QtGui.QPalette.Text, blanc)
mapalette_modif_multiple.setColor(QtGui.QPalette.Base, orange)
mon_widget_col_1.setPalette(mapalette_modif_multiple)
mon_widget_col_1.setEnabled(True)
def SCROLL_affichage_selon_modif_ajout_suppr(self, mon_mode = "lecture"):
if GLOBAL_mode_debuggage == 'oui': print mon_mode
#self.mon_grid_area:#qtGui.QGridLayout
mon_QCB = QComboBox_boost_SCROLL()
#mon_QCB = QtGui.QComboBox()
mon_QLE = QtGui.QLineEdit()
mon_QTE = QTextEdit_boost_zone_text()
mon_QDE = QDateEdit_boost_SCROLL()
mon_QLW = QListWidget_boost_SCROLL()
#mon_QLW = QtGui.QListWidget()
mon_QPB = QtGui.QPushButton()
#COULEUR
noir = QtGui.QColor("black")
blanc = QtGui.QColor("white")
rouge = QtGui.QColor("red")
gris_clair = QtGui.QColor(173,216,230) #bleu acier
violet_pale = QtGui.QColor(216,191,216) #vert
mapalette_lecture = QtGui.QPalette()
mapalette_lecture.setColor(QtGui.QPalette.Text, noir)
mapalette_lecture.setColor(QtGui.QPalette.Base, blanc)
mapalette_nouveau = QtGui.QPalette()
mapalette_nouveau.setColor(QtGui.QPalette.Text, noir)
mapalette_nouveau.setColor(QtGui.QPalette.Base, gris_clair)
mapalette_modif = QtGui.QPalette()
mapalette_modif.setColor(QtGui.QPalette.Text, noir)
mapalette_modif.setColor(QtGui.QPalette.Base, violet_pale)
mapalette_suppr = QtGui.QPalette()
mapalette_suppr.setColor(QtGui.QPalette.Text, noir)
mapalette_suppr.setColor(QtGui.QPalette.Base, rouge)
nb_lignes = self.mon_grid_area.rowCount() # on recupère tous les itemsen deuicème colonne du SCROLL tableau grid
for num_ligne in range(nb_lignes):
for num_colonne in range(1,3):
mon_item = self.mon_grid_area.itemAtPosition(num_ligne,num_colonne)
#1ère colonne: QCB, QLE, QTE, QDE, QLW
#2ème colonne: QPB
#if GLOBAL_mode_debuggage == 'oui': print "type(mon_item)"
#if GLOBAL_mode_debuggage == 'oui': print type(mon_item)
#mon_widget = mon_item.widget()
#if GLOBAL_mode_debuggage == 'oui': print mon_widget
if mon_item is not None:
mon_widget = mon_item.widget()
#if GLOBAL_mode_debuggage == 'oui': print mon_widget
#if GLOBAL_mode_debuggage == 'oui': print type(mon_widget)
if mon_mode == "lecture" or mon_mode == "annuler": ###LECTURE### ###annuler###
mon_widget.setPalette(mapalette_lecture)
if type(mon_widget) == type(mon_QCB):
#if GLOBAL_mode_debuggage == 'oui': print "QCB"
mon_widget.setEditable(True)
mon_widget.setEnabled(False)
elif type(mon_widget) == type(mon_QLE) \
or type(mon_widget) == type(mon_QDE) \
or type(mon_widget) == type(mon_QTE) :
#if GLOBAL_mode_debuggage == 'oui': print "QLE QDE QTE"
mon_widget.setReadOnly(True)
elif type(mon_widget) == type(mon_QPB):
mon_widget.setEnabled(False)
elif type(mon_widget) == type(mon_QLW):
if GLOBAL_mode_debuggage == 'oui': print "qlw lecture"
mon_widget.setEnabled(True)
elif mon_mode == "nouveau": ###nouveau###
mon_widget.setPalette(mapalette_nouveau)
if type(mon_widget) == type(mon_QCB):
if GLOBAL_mode_debuggage == 'oui': print "QCB"
mon_widget.setEditable(False)
mon_widget.setEnabled(True)
try:
mon_widget.setCurrentIndex(0)
if GLOBAL_mode_debuggage == 'oui': print "current index a zero"
except:
kiki=1
if GLOBAL_mode_debuggage == 'oui': print "current index a zero"
elif type(mon_widget) == type(mon_QLE) \
or type(mon_widget) == type(mon_QTE) :
#if GLOBAL_mode_debuggage == 'oui': print "QLE QDE QTE"
mon_widget.setEnabled(True)
mon_widget.setReadOnly(False)
mon_widget.setText("")
elif type(mon_widget) == type(mon_QDE):
monQDate = QtCore.QDate()
zouzou = monQDate.fromString("19000101", "yyyyMMdd")
mon_widget.setDate(zouzou)
mon_widget.setEnabled(True)
mon_widget.setReadOnly(False)
#mon_widget.fromString("19000101", "yyyyMMdd")
elif type(mon_widget) == type(mon_QLW):
if GLOBAL_mode_debuggage == 'oui': print "QLW QPB"
mon_widget.setEnabled(True)
elif type(mon_widget) == type(mon_QPB):
mon_widget.setEnabled(True)
elif mon_mode == "modif": ###modif###
mon_widget.setPalette(mapalette_modif)
if type(mon_widget) == type(mon_QCB):
#if GLOBAL_mode_debuggage == 'oui': print "QCB"
mon_widget.setEditable(False)
mon_widget.setEnabled(True)
elif type(mon_widget) == type(mon_QLE) \
or type(mon_widget) == type(mon_QTE) :
#if GLOBAL_mode_debuggage == 'oui': print "QLE QDE QTE"
mon_widget.setEnabled(True)
mon_widget.setReadOnly(False)
elif type(mon_widget) == type(mon_QDE):
mon_widget.setEnabled(True)
mon_widget.setReadOnly(False)
elif type(mon_widget) == type(mon_QPB):
mon_widget.setEnabled(True)
elif type(mon_widget) == type(mon_QLW):
if GLOBAL_mode_debuggage == 'oui': print "QLW QPB"
mon_widget.setEnabled(True) # on ne bloque rien, car on bloque la sélection plus loin: mon_widget.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
elif mon_mode == "suppression": ###suppression###
mon_widget.setPalette(mapalette_suppr)
if type(mon_widget) == type(mon_QCB):
if GLOBAL_mode_debuggage == 'oui': print "QCB"
mon_widget.setEditable(True)
mon_widget.setEnabled(False)
elif type(mon_widget) == type(mon_QLE) \
or type(mon_widget) == type(mon_QDE) \
or type(mon_widget) == type(mon_QTE) :
if GLOBAL_mode_debuggage == 'oui': print "QLE QDE QTE"
mon_widget.setReadOnly(True)
elif type(mon_widget) == type(mon_QLW) or type(mon_widget) == type(mon_QPB):
if GLOBAL_mode_debuggage == 'oui': print "QLW QPB"
mon_widget.setEnabled(False)
if mon_mode == "lecture" or mon_mode == "annuler": ###LECTURE### ###annuler###
self.qtableWidget_resultat.setEnabled(True)
elif mon_mode == "nouveau": ###nouveau###
self.qtableWidget_resultat.setEnabled(False)
#self.qtableWidget_resultat.setCurrentCell(-1,0)
elif mon_mode == "modif": ###modif###
self.qtableWidget_resultat.setEnabled(False)
elif mon_mode == "suppression": ###suppression###
self.qtableWidget_resultat.setEnabled(False)
###EXISTAIT AVANT
###if self.qtableWidget_resultat.rowCount() != -1 and mon_mode != "nouveau":
if self.qtableWidget_resultat.rowCount() != -1:
self.RESULTAT_cell_clickee(self.qtableWidget_resultat.currentRow(),self.qtableWidget_resultat.currentColumn()) #on simule un clic dans la ligne pour actualiser chque champ !
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "self.qtableWidget_resultat.currentRow()"
if GLOBAL_mode_debuggage == 'oui': print self.qtableWidget_resultat.currentRow()
def SCROLL_petit_bouton_de_droite(self,type_champ, nom_de_table, mdp, num_row_grid):
if GLOBAL_mode_debuggage == 'oui': print "\n clic_petit_bouton_de_droite"
if GLOBAL_mode_debuggage == 'oui': print "type_champ_clic_petit_bouton"
if GLOBAL_mode_debuggage == 'oui': print type_champ
if GLOBAL_mode_debuggage == 'oui': print "\nmdp"
if GLOBAL_mode_debuggage == 'oui': print mdp
if GLOBAL_mode_debuggage == 'oui': print "\nnom_de_table"
if GLOBAL_mode_debuggage == 'oui': print nom_de_table
if mdp == "pas_de_mdp":
self.maFenetre = Fenetre_SQL_ajout_modif_suppression()
self.maFenetre.creation_fenetre(type_champ, nom_de_table, num_row_grid)
elif mdp == "avec_mdp":
mon_text, ok = QtGui.QInputDialog.getText(MainWindow, "Mot de passe", "Attention, cette opération doit impérativement être effectuée lorsqu'aucune personne n'est connectée!! \n Rentrer votre mot de passe:", QtGui.QLineEdit.Normal)
if GLOBAL_mode_debuggage == 'oui': print "reponse_boite"
if GLOBAL_mode_debuggage == 'oui': print mon_text
if GLOBAL_mode_debuggage == 'oui': print ok
#if (ok and mon_text.isEmpty()):
if (ok and mon_text == GLOBAL_list_table_et_commentaires_tables[0][1]):
self.maFenetre = Fenetre_SQL_ajout_modif_suppression()
self.maFenetre.creation_fenetre(type_champ, nom_de_table, num_row_grid)
elif (ok and mon_text != GLOBAL_list_table_et_commentaires_tables[0][1]):
texte_titre = "erreur"
msg = "Mauvais mot de passe"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Critical)
ma_boite.setInformativeText(msg)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
def SCROLL_remplissage_des_QListWidget(self,nom_de_table,num_de_colonne_de_table):
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#cur.execute("select * from %s" % nom_de_table)
if GLOBAL_mode_debuggage == 'oui': print "num_de_colonne_de_table"
if GLOBAL_mode_debuggage == 'oui': print num_de_colonne_de_table
cur.execute("select * from %s order by %s asc" % (nom_de_table, (int(num_de_colonne_de_table)+1)))
mon_list_resutat = list(cur.fetchall())
mon_vrai_list = []
for elem in mon_list_resutat:
mon_vrai_list.append(elem[num_de_colonne_de_table])
#if GLOBAL_mode_debuggage == 'oui': print "mon_vrai_list"
#if GLOBAL_mode_debuggage == 'oui': print mon_vrai_list
cur.close()
return mon_vrai_list
def rechercher(self, index_unique = "no_index"):
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
QtCore.QObject.disconnect(self.qtableWidget_resultat,QtCore.SIGNAL("cellClicked(int,int)"),self.RESULTAT_cell_clickee)
QtCore.QObject.disconnect(self.qtableWidget_resultat,QtCore.SIGNAL("currentCellChanged(int,int,int,int)"),self.RESULTAT_cell_clickee)
if GLOBAL_mode_debuggage == 'oui': print "lancer fonction rechercher"
self.FICHE_annuler() #on revient en mode lecture
text_ordre_tri_1 = self.ordre_de_tri_1.currentText()
text_ordre_tri_2 = self.ordre_de_tri_2.currentText()
text_ordre_tri_3 = self.ordre_de_tri_3.currentText()
self.type_de_recherche.currentIndex()
if self.type_de_recherche.currentIndex() == 0:
condition_tri_OR_AND = " AND "
type_de_choix= "rien"
elif self.type_de_recherche.currentIndex() == 1:
condition_tri_OR_AND = " OR "
type_de_choix= "rien"
elif self.type_de_recherche.currentIndex() == 2:
condition_tri_OR_AND = " OR "
type_de_choix= "valident_ligne_1_ET"
elif self.type_de_recherche.currentIndex() == 3:
condition_tri_OR_AND = " OR "
type_de_choix= "valident_ligne_2_ET"
elif self.type_de_recherche.currentIndex() == 4:
condition_tri_OR_AND = " OR "
type_de_choix= "valident_ligne_n_ET"
elif self.type_de_recherche.currentIndex() == 5:
condition_tri_OR_AND = " OR "
type_de_choix= "valident_ligne_n-1_ET"
#type_de_choix= "valident_ligne_1_ET"
#type_de_choix= "valident_ligne_2_ET"
#type_de_choix= "valident_ligne_n_ET"
#type_de_choix= "valident_ligne_n-1_ET"
requete = "SELECT * from `%s` WHERE (" % mysql_Nom_de_table
nb_ligne = self.qtableWidget_param.rowCount()
mon_dict = {}
for num_ligne_tri in range(nb_ligne): #dans toutes lignes du tableau de tri
cellule_col_0_text = self.qtableWidget_param.cellWidget(num_ligne_tri,0).currentText()
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if cellule_col_0_text == self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6]:
text_ref_sql = self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]
#if GLOBAL_mode_debuggage == 'oui': print "text_ref_sql"
#if GLOBAL_mode_debuggage == 'oui': print unicode(text_ref_sql).encode("cp850")
"""
self.var_contient = "contient"
self.var_contient_pas = "ne contient pas"
self.var_egal_a = "est égal à"
self.var_inf_a = "est inférieur à"
self.var_sup_a = "est supérieur à"
self.var_est = "est"
self.var_n_est_pas = "n'est pas"
self.var_avant = "se trouve avant"
self.var_apres = "se trouve après"
"""
cellule_col_1_text = self.qtableWidget_param.cellWidget(num_ligne_tri,1).currentText()
if cellule_col_1_text == self.var_contient or cellule_col_1_text == self.var_commence_par or cellule_col_1_text == self.var_finit_par:
condition = " LIKE "
elif cellule_col_1_text == self.var_identique_a:
condition = " = " #BUG ici, le identique à ne fonctionne pas
pourcent_like = ""
elif cellule_col_1_text == self.var_different_de:
condition = " != "
elif cellule_col_1_text == self.var_contient_pas:
condition = " NOT LIKE "
elif cellule_col_1_text == self.var_egal_a:
condition = " = "
elif cellule_col_1_text == self.var_inf_a:
condition = " <= "
elif cellule_col_1_text == self.var_sup_a:
condition = " >= "
elif cellule_col_1_text == self.var_est:
condition = " = "
elif cellule_col_1_text == self.var_n_est_pas:
condition = " != "
elif cellule_col_1_text == self.var_avant:
condition = " <= "
elif cellule_col_1_text == self.var_apres:
condition = " >= "
#bug possible sur les chiffres interprétés en string: à priori tout se passe bien !!!
cellule_col_2 = self.qtableWidget_param.cellWidget(num_ligne_tri,2)
QCB = QtGui.QComboBox()
QLE = QtGui.QLineEdit()
QDE = QtGui.QDateEdit()
QLW = QtGui.QListWidget()
QTE = QTextEdit_boost_zone_text()
if type(cellule_col_2) == type(QCB):
cellule_col_2_text = cellule_col_2.currentText()
elif type(cellule_col_2) == type(QLE):
cellule_col_2_text = cellule_col_2.text()
elif type(cellule_col_2) == type(QDE):
cellule_col_2_text = cellule_col_2.date().toString(QtCore.Qt.ISODate)
if GLOBAL_mode_debuggage == 'oui': print "type((cellule_col_2_text))"
if GLOBAL_mode_debuggage == 'oui': print type((cellule_col_2_text))
toto = copy.deepcopy(unicode(cellule_col_2_text))
if GLOBAL_mode_debuggage == 'oui': print "type(toto)"
if GLOBAL_mode_debuggage == 'oui': print type(toto)
if type(cellule_col_2) == type(QCB) \
or type(cellule_col_2) == type(QLW) \
or type(cellule_col_2) == type(QTE) \
or type(cellule_col_2) == type(QLE):
var_type_cellx = "que_du_texte"
else:
var_type_cellx = "pas_que_du_texte"
if num_ligne_tri == 0 and type_de_choix == "valident_ligne_1_ET":
if nb_ligne >=3:
if condition == " = " and var_type_cellx == "pas_que_du_texte": #Gestion de l'égalité en mysql: en fait on fait un arrondi
if GLOBAL_mode_debuggage == 'oui': print "egalite avec float"
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '`' +unicode(text_ref_sql) + '`' + ' >= ' + '(%(' +str(indice)+ ')s - 0.001)' +' AND ' \
+ '`' + unicode(text_ref_sql) + '`' + ' <= ' + '(%(' +str(indice)+ ')s + 0.001)' + ' AND ('
else:
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '`' +unicode(text_ref_sql) + '`' + unicode(condition) + '%(' +str(indice)+ ')s' + ' AND ('
elif nb_ligne <3:
texte_titre = "Pas assez de ligne"
msg_total = "Ce filtre dans 'Conditions de recherche' n'est actif qu'à partir de 3 lignes minimum"
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
reponse = ma_boite.exec_()
elif num_ligne_tri == 0 and type_de_choix == "valident_ligne_2_ET":
if nb_ligne >=3:
if condition == " = " and var_type_cellx == "pas_que_du_texte": #Gestion de l'égalité en mysql: en fait on fait un arrondi
if GLOBAL_mode_debuggage == 'oui': print "egalite avec float"
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '(`' +unicode(text_ref_sql) + '`' + ' >= ' + '(%(' +str(indice)+ ')s - 0.001)' +' AND ' \
+ '`' + unicode(text_ref_sql) + '`' + ' <= ' + '(%(' +str(indice)+ ')s + 0.001)' + ' AND '
else:
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '(`' +unicode(text_ref_sql) + '`' + unicode(condition) + '%(' +str(indice)+ ')s' + ' AND '
elif nb_ligne <3:
texte_titre = "Pas assez de ligne"
msg_total = "Ce filtre dans 'Conditions de recherche' n'est actif qu'à partir de 3 lignes minimum"
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
reponse = ma_boite.exec_()
elif num_ligne_tri == 1 and type_de_choix == "valident_ligne_2_ET":
if nb_ligne >=3:
if condition == " = " and var_type_cellx == "pas_que_du_texte": #Gestion de l'égalité en mysql: en fait on fait un arrondi
if GLOBAL_mode_debuggage == 'oui': print "egalite avec float"
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '`' +unicode(text_ref_sql) + '`' + ' >= ' + '(%(' +str(indice)+ ')s - 0.001)' +' AND ' \
+ '`' + unicode(text_ref_sql) + '`' + ' <= ' + '(%(' +str(indice)+ ')s + 0.001)' + ') AND ('
else:
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '`' +unicode(text_ref_sql) + '`' + unicode(condition) + '%(' +str(indice)+ ')s' + ') AND ('
elif nb_ligne <3:
texte_titre = "Pas assez de ligne"
msg_total = "Ce filtre dans 'Conditions de recherche' n'est actif qu'à partir de 3 lignes minimum"
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
reponse = ma_boite.exec_()
else: #mode normal "VALIDENT TOUTES ou VALIDENT AU MOINS UNE
if condition == " = " and var_type_cellx == "pas_que_du_texte": #Gestion de l'égalité en mysql: en fait on fait un arrondi
if GLOBAL_mode_debuggage == 'oui': print "egalite avec float"
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '`' +unicode(text_ref_sql) + '`' + ' >= ' + '(%(' +str(indice)+ ')s - 0.001)' +' AND ' \
+ '`' + unicode(text_ref_sql) + '`' + ' <= ' + '(%(' +str(indice)+ ')s + 0.001)' + condition_tri_OR_AND
else:
indice = 'dict_A%s' % (num_ligne_tri)
requete = requete + '`' +unicode(text_ref_sql) + '`' + unicode(condition) + '%(' +str(indice)+ ')s' + condition_tri_OR_AND
if cellule_col_1_text == self.var_contient or cellule_col_1_text == self.var_contient_pas:
mon_dict[indice] = unicode('%') + unicode(cellule_col_2_text) + unicode('%')
elif cellule_col_1_text == self.var_finit_par:
mon_dict[indice] = unicode('%') + unicode(cellule_col_2_text)
elif cellule_col_1_text == self.var_commence_par:
mon_dict[indice] = unicode(cellule_col_2_text) + unicode('%')
else:
mon_dict[indice] = unicode(cellule_col_2_text)
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print "mon_dict"
#if GLOBAL_mode_debuggage == 'oui': print mon_dict
if condition_tri_OR_AND == " AND ":
requete = requete[:-5]
elif condition_tri_OR_AND == " OR ":
requete = requete[:-4]
requete = requete + ")"
if type_de_choix == "valident_ligne_1_ET" or \
type_de_choix == "valident_ligne_2_ET" or \
type_de_choix == "valident_ligne_n_ET" or \
type_de_choix == "valident_ligne_n-1_ET":
requete = requete + ")"
#self.ordre_de_tri_1
#self.ordre_de_tri_2
#self.ordre_de_tri_3
if self.ordre_de_tri_1.currentText() != "" or self.ordre_de_tri_2.currentText() != "" or self.ordre_de_tri_3.currentText() != "":
requete = requete + " ORDER BY "
requete_rapide_order = " ORDER BY "
if self.ordre_de_tri_1.currentText() != "":
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.ordre_de_tri_1.currentText() == self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6]:
text_ref_ordre_de_tri_1 = self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]
if self.asc_desc_1.currentIndex() == 0:
asc_desc_1 = " ASC,"
else:
asc_desc_1 = " DESC,"
requete = requete + '`' + unicode(text_ref_ordre_de_tri_1) + '`' + asc_desc_1
requete_rapide_order = requete_rapide_order + '`' + unicode(text_ref_ordre_de_tri_1) + '`' + asc_desc_1
if self.ordre_de_tri_2.currentText() != "":
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.ordre_de_tri_2.currentText() == self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6]:
text_ref_ordre_de_tri_2 = self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]
if self.asc_desc_2.currentIndex() == 0:
asc_desc_2 = " ASC,"
else:
asc_desc_2 = " DESC,"
requete = requete + '`' + unicode(text_ref_ordre_de_tri_2) + '`' + asc_desc_2
requete_rapide_order = requete_rapide_order + '`' + unicode(text_ref_ordre_de_tri_2) + '`' + asc_desc_2
if self.ordre_de_tri_3.currentText() != "":
for elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
if self.ordre_de_tri_3.currentText() == self.TRI_mon_list_de_list_de_parametres_de_tri[elem][6]:
text_ref_ordre_de_tri_3 = self.TRI_mon_list_de_list_de_parametres_de_tri[elem][0]
if self.asc_desc_3.currentIndex() == 0:
asc_desc_3 = " ASC,"
else:
asc_desc_3 = " DESC,"
requete_rapide_order = requete_rapide_order + '`' + unicode(text_ref_ordre_de_tri_3) + '`' + asc_desc_3
requete = requete[:-1]
else:
requete = requete
requete_rapide_order = ")"
if GLOBAL_mode_debuggage == 'oui': print "mon_dict normal"
if GLOBAL_mode_debuggage == 'oui': print unicode(mon_dict).encode("cp850")
if GLOBAL_mode_debuggage == 'oui': print "requete normale"
if GLOBAL_mode_debuggage == 'oui': print unicode(requete).encode("cp850")
#if GLOBAL_mode_debuggage == 'oui': print desfi
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
# cur.execute("select * from %s" % mysql_Nom_de_table)
if index_unique != "no_index": #recherche sur la ligne précise contenant l'index
requete_index_unique = "SELECT * from `%s` WHERE (`index` = %s) " % (mysql_Nom_de_table,index_unique)
cur.execute(requete_index_unique)
else: #recherche normale ou rapide
if self.lineEdit_rapide.text() == "": #recherche normale
cur.execute(requete, mon_dict)
else: #recherche rapide
requete_rapide1 = "SELECT * from `%s` WHERE ((" % mysql_Nom_de_table
####
cur2=id.cursor()
#cur.execute("select * from %s order by affaire_QLE" % mysql_Nom_de_table)
cur2.execute("SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_KEY, COLUMN_DEFAULT, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '%s'" % mysql_Nom_de_table)
structure_table = list(cur2.fetchall())
cur2.close()
####
#if GLOBAL_mode_debuggage == 'oui': print "structure_table"
#if GLOBAL_mode_debuggage == 'oui': print structure_table
mon_dict_rapide = {}
if GLOBAL_mode_debuggage == 'oui': print "ligne_structure"
for num_ligne_rapide in range(len(structure_table)):
indice = 'dict_B%s' % (num_ligne_rapide)
mon_dict_rapide[indice] = unicode('%') + unicode(self.lineEdit_rapide.text()) + unicode('%')
t=0
for ligne_structure in structure_table:
#mon_dict_rapide[ligne_structure[0]] = unicode('%') + unicode(self.lineEdit_rapide.text()) + unicode('%')
requete_rapide1 = requete_rapide1 + '`' + unicode(ligne_structure[0]) + '` LIKE ' + '%(dict_B' + str(t)+ ')s OR '
t=t+1
#requete = requete + '`' +unicode(text_ref_sql) + '`' + ' >= ' + '(%(' +str(indice)+ ')s - 0.001)' +' AND '
requete_rapide1 = requete_rapide1[:-4]
if self.CBBX_archives_ou_affaires.currentIndex() == 2: #recherche sur tout y compris archives
requete_rapide1 = requete_rapide1 + '))'
elif self.CBBX_archives_ou_affaires.currentIndex() == 1: #recherche sur "affaires archivées seules"
requete_case_coche_archive = unicode("`avancement#QCB` LIKE 'affaire archivée' OR `avancement#QCB` LIKE 'sans suite' OR `avancement#QCB` LIKE 'expertise archivée'", "iso-8859-1")
requete_rapide1 = requete_rapide1 + ') AND (' + requete_case_coche_archive + '))'
elif self.CBBX_archives_ou_affaires.currentIndex() == 0: #rechaerche sur concours et affaire seules
#Avancement#-#concours#-#étude#-#chantier#-#concours à archiver#-#concours archivé#-#affaire à archiver#-#affaire archivée#-#expertise#-#expertise à archiver#-#expertise archivée#pas_de_mdp
requete_case_coche_archive = unicode("`avancement#QCB` LIKE 'concours' OR `avancement#QCB` LIKE 'étude' OR `avancement#QCB` LIKE 'chantier' OR `avancement#QCB` LIKE 'expertise'", "iso-8859-1")
requete_rapide1 = requete_rapide1 + ') AND (' + requete_case_coche_archive + '))'
requete_rapide_totale = requete_rapide1 + requete_rapide_order
requete_rapide_totale = requete_rapide_totale[:-1]
#requete_rapide_totale = requete_rapide1
if GLOBAL_mode_debuggage == 'oui': print "mon_dict_rapide"
if GLOBAL_mode_debuggage == 'oui': print unicode(mon_dict_rapide).encode("cp850")
if GLOBAL_mode_debuggage == 'oui': print "requete_rapide_totale"
if GLOBAL_mode_debuggage == 'oui': print unicode(requete_rapide_totale).encode("cp850")
cur.execute(requete_rapide_totale, mon_dict_rapide)
self.resultat_clic_recherche = list(cur.fetchall())
cur.close()
id.commit()
id.close()
if GLOBAL_mode_debuggage == 'oui': print "resultat"
#if GLOBAL_mode_debuggage == 'oui': print self.resultat_clic_recherche
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "self.RESULTAT_mon_list_de_list_de_colonne"
#if GLOBAL_mode_debuggage == 'oui': print self.RESULTAT_mon_list_de_list_de_colonne
#interdit le tri sur entête pour le réactiver à la fin
self.qtableWidget_resultat.setSortingEnabled(False) #interdit le tri par clic colonne
#on nettoie d'abord le tableau s'il il existe
for i in range(self.qtableWidget_resultat.rowCount()):
self.qtableWidget_resultat.removeRow(0)
hauteur_de_ligne = 20
for row in self.resultat_clic_recherche:
self.qtableWidget_resultat.insertRow(0)
self.qtableWidget_resultat.setRowHeight(0,hauteur_de_ligne)
for i in range(self.qtableWidget_resultat.columnCount()):
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print type (row[i])
#if GLOBAL_mode_debuggage == 'oui': print row[i]
##BIDOUILLE mais pas bidouille du tout
#Différencier setText et setData ok ça marche
#http://www.qtcentre.org/threads/29377-QTreeWidget-setSortingEnabled
if type(row[i]) == long or type(row[i]) == float:
#if GLOBAL_mode_debuggage == 'oui': print 'long-float'
mon_item = QtGui.QTableWidgetItem()
mon_item.setData(0,(row[i]))
self.qtableWidget_resultat.setItem(0, i ,mon_item)
elif type(row[i]) == str:
#if GLOBAL_mode_debuggage == 'oui': print 'str'
mon_item = QtGui.QTableWidgetItem()
mon_item.setText((row[i]))
self.qtableWidget_resultat.setItem(0, i ,mon_item)
else:
self.qtableWidget_resultat.setItem(0, i ,QtGui.QTableWidgetItem(unicode(row[i])))
#self.qtableWidget_resultat.resizeRowsToContents()
#self.qtableWidget_resultat.verticalHeader().setResizeMode(QtGui.QHeaderView.ResizeToContents) #resize à chaque fois
self.qtableWidget_resultat.showGrid()
#autorise le tri sur entête
self.qtableWidget_resultat.setSortingEnabled(True) #autorise le tri sur entête par clic colonne
exec("blabla = 'Lignes trouvées: %s'" % (str(self.qtableWidget_resultat.rowCount())))
self.mon_Qlabel_status_bar2.setText(unicode(blabla, "iso-8859-1"))
QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("cellClicked(int,int)"),self.RESULTAT_cell_clickee)
QtCore.QObject.connect(self.qtableWidget_resultat,QtCore.SIGNAL("currentCellChanged(int,int,int,int)"),self.RESULTAT_cell_clickee)
QtGui.QApplication.restoreOverrideCursor()
def recherche_rapide(self):
if self.lineEdit_rapide.text() == "":
self.qtableWidget_param.show()
self.CBBX_archives_ou_affaires.hide()
self.label_recherche_sur.hide()
self.label.show()
self.type_de_recherche.show()
self.qpush_rechercher.setText("Recherche")
else:
self.qtableWidget_param.hide()
self.CBBX_archives_ou_affaires.show()
self.label_recherche_sur.show()
self.label.hide()
self.type_de_recherche.hide()
self.qpush_rechercher.setText("Rech rapide")
self.FICHE_annuler()
def effacer(self):
if GLOBAL_mode_debuggage == 'oui': print "lancer fonction effacer"
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
"""
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#cur.execute("select * from %s ORDER BY 1 ASC" % mysql_Nom_de_table)
cur.execute("select * from %s" % mysql_Nom_de_table)
self.resultat_clic_recherche = list(cur.fetchall())
cur.close()
id.commit()
id.close()
if GLOBAL_mode_debuggage == 'oui': print "resultat"
if GLOBAL_mode_debuggage == 'oui': print self.resultat_clic_recherche
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "self.RESULTAT_mon_list_de_list_de_colonne"
if GLOBAL_mode_debuggage == 'oui': print self.RESULTAT_mon_list_de_list_de_colonne
#interdit le tri sur entête pour le réactiver à la fin
self.qtableWidget_resultat.setSortingEnabled(False) #interdit le tri par clic colonne
"""
#on nettoie d'abord le tableau s'il il existe
for i in range(self.qtableWidget_resultat.rowCount()):
self.qtableWidget_resultat.removeRow(0)
#on vire le texete dans la recherche rapide
if self.CBBX_archives_ou_affaires.isVisible() == True:
self.lineEdit_rapide.setText('')
self.recherche_rapide()
"""
hauteur_de_ligne = 20
for row in self.resultat_clic_recherche:
self.qtableWidget_resultat.insertRow(0)
self.qtableWidget_resultat.setRowHeight(0,hauteur_de_ligne)
for i in range(self.qtableWidget_resultat.columnCount()):
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print type (row[i])
#if GLOBAL_mode_debuggage == 'oui': print row[i]
##BIDOUILLE mais pas bidouille du tout
#Différencier setText et setData ok ça marche
#http://www.qtcentre.org/threads/29377-QTreeWidget-setSortingEnabled
if type(row[i]) == long or type(row[i]) == float:
#if GLOBAL_mode_debuggage == 'oui': print 'long-float'
mon_item = QtGui.QTableWidgetItem()
mon_item.setData(0,(row[i]))
self.qtableWidget_resultat.setItem(0, i ,mon_item)
elif type(row[i]) == str:
#if GLOBAL_mode_debuggage == 'oui': print 'str'
mon_item = QtGui.QTableWidgetItem()
mon_item.setText((row[i]))
self.qtableWidget_resultat.setItem(0, i ,mon_item)
else:
self.qtableWidget_resultat.setItem(0, i ,QtGui.QTableWidgetItem(unicode(row[i])))
self.qtableWidget_resultat.showGrid()
#autorise le tri sur entête
self.qtableWidget_resultat.setSortingEnabled(True) #autorise le tri sur entête par clic colonne
exec("blabla = 'Lignes trouvées: %s'" % (str(self.qtableWidget_resultat.rowCount())))
self.mon_Qlabel_status_bar2.setText(unicode(blabla, "iso-8859-1"))
"""
QtGui.QApplication.restoreOverrideCursor()
def FICHE_nouveau(self):
if GLOBAL_mode_debuggage == 'oui': print "lancer fonction nouveau"
self.qpush_nouveau.hide()
self.qpush_modifier.hide()
self.qpush_supprimer.hide()
self.qpush_valider_nouveau.show()
self.qpush_valider_modif.hide()
self.qpush_annuler.show()
self.qpush_rechercher.setEnabled(False)
self.qpush_effacer.setEnabled(False)
self.lineEdit_rapide.setEnabled(False)
self.SCROLL_affichage_selon_modif_ajout_suppr(mon_mode = "nouveau")
def FICHE_modifier(self):
if self.qtableWidget_resultat.currentRow() != -1:
if GLOBAL_mode_debuggage == 'oui': print "lancer fonction modifier"
self.qpush_nouveau.hide()
self.qpush_modifier.hide()
self.qpush_supprimer.hide()
self.qpush_valider_nouveau.hide()
self.qpush_valider_modif.show()
self.qpush_annuler.show()
self.qpush_rechercher.setEnabled(False)
self.qpush_effacer.setEnabled(False)
self.lineEdit_rapide.setEnabled(False)
self.SCROLL_affichage_selon_modif_ajout_suppr(mon_mode = "modif")
else:
texte_titre = unicode("Sélection impossible", "iso-8859-1")
msg = unicode("Vous devez sélectionner une ligne", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setInformativeText(msg)
ma_boite.setWindowTitle(texte_titre)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
def FICHE_supprimer(self):
if GLOBAL_mode_debuggage == 'oui': print "lancer fonction effacer"
self.SCROLL_affichage_selon_modif_ajout_suppr(mon_mode = "suppression")
self.FICHE_action_supprimer()
def sizedirectory(self, path):
size = 0
for root, dirs, files in os.walk(path):
for fic in files:
size += os.path.getsize(os.path.join(root, fic))
return size
def FICHE_action_supprimer(self):
for num_ligne in range(1,self.mon_grid_area.rowCount()):
toto = self.mon_grid_area.itemAtPosition(num_ligne,0).widget()
if self.mon_grid_area.itemAtPosition(num_ligne,0).widget().text() == "Affaire":
nom_affaire1 = self.mon_grid_area.itemAtPosition(num_ligne,1).widget().text()
if self.mon_grid_area.itemAtPosition(num_ligne,0).widget().text() == "Avancement":
mon_avancement = self.mon_grid_area.itemAtPosition(num_ligne,1).widget().currentText()
#if GLOBAL_mode_debuggage == 'oui': print sys.stdin.encoding ## cp1252 sous IDLE, cp850 sous la console Python
#machaine = 'äâ' ## machaine est une chaîne encodée selon l'encodage sys.stdin.encoding
#unicode(machaine, sys.stdin.encoding)
if nom_affaire1 != "":
texte_titre = "Suppression fiche"
msg_debut = "Affaire:\n "
msg_debut2 = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
nom_affaire = unicode(nom_affaire1) # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg_fin = "\nEtes-vous sûr de vouloir supprimer cette fiche ?"
msg_fin2 = unicode(msg_fin, "iso-8859-1")
if GLOBAL_deplacement_de_fichier == "oui":
msg_fin3 = unicode("\n Attention ! Le déplacement de fichier étant activé, tous les fichiers physiques sur le serveur seront également supprimés pour cette affaire", "iso-8859-1")
else:
msg_fin3 = unicode("\n Le déplacement de fichier étant désactivé, les fichiers physiques sur le serveur seront conservés", "iso-8859-1")
msg_total = msg_debut2 + nom_affaire + msg_fin2 + msg_fin3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
ma_boite.addButton(_fromUtf8("Annuler"), 1)
reponse = ma_boite.exec_()
if GLOBAL_mode_debuggage == 'oui': print "reponse"
if GLOBAL_mode_debuggage == 'oui': print reponse
if reponse == 0: #OUI
if GLOBAL_mode_debuggage == 'oui': print "SQL creer fonction supprimer fiche"
try:
ligne_actuelle = self.qtableWidget_resultat.currentRow()
ref_index = self.qtableWidget_resultat.item(ligne_actuelle,0).data(0).toString() # on récupère le texte
if GLOBAL_mode_debuggage == 'oui': print "ref_index"
if GLOBAL_mode_debuggage == 'oui': print ref_index
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
requete = ("delete from %s where (`%s`=%s)" % (mysql_Nom_de_table, self.SCROLL_AREA_mon_list_de_list_de_champs[0][0], (ref_index)))
if GLOBAL_mode_debuggage == 'oui': print requete
cur.execute(requete)
cur.close()
id.commit()
id.close()
texte_titre = "Suppression fiche"
msg_debut = "L'affaire:\n "
msg_debut2 = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
nom_affaire = unicode(nom_affaire1) # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg_fin = "\na été supprimée"
msg_fin2 = unicode(msg_fin, "iso-8859-1")
msg_total = msg_debut2 + nom_affaire + msg_fin2
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
ma_boite.addButton(_fromUtf8("Annuler"), 1)
reponse = ma_boite.exec_()
except:
texte_titre = "Fiche non supprimée"
msg_total = unicode("Fiche non supprimée. \n Veuillez selectionner la ligne à supprimer dans le tableau de gauche", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
###### DEBUT REPERTOIRE ####
effacer_chemin_repertoire = self.concat_chemin(mon_avancement, nom_affaire1)
if GLOBAL_mode_debuggage == 'oui': print "effacer_chemin_repertoire"
if GLOBAL_mode_debuggage == 'oui': print effacer_chemin_repertoire
if os.path.isdir(effacer_chemin_repertoire) == True:
#try:
try:
os.rmdir(effacer_chemin_repertoire) #ne fonctionne que si le répertoire est vide
except:
texte_titre = "Répertoire non vide"
msg_total = "Attention, ce répertoire contient d'autre dossiers/fichiers. Voulez-vous vraiment effacer ?."
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Question)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
ma_boite.addButton(_fromUtf8("Annuler"), 1)
reponse = ma_boite.exec_()
if reponse == 0:
try:
shutil.rmtree(effacer_chemin_repertoire) #ne fonctionne que si le répertoire est vide
texte_titre = "Répertoire et sous répertoires supprimés"
msg_1 = unicode("Les répertoires et sous répertoires ont bien été supprimés \n:", "iso-8859-1")
msg_2 = unicode(effacer_chemin_repertoire)
msg_3 = unicode("\n Suppression effectuée", "iso-8859-1")
msg_total = msg_1 + msg_2 + msg_3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except:
texte_titre = "Répertoire non supprimé"
msg_total = "Erreur sur la suppression. Vous devez effectuer la suppresion manuellement."
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif os.path.isdir(effacer_chemin_repertoire) == False:
texte_titre = "Répertoire non supprimé"
msg_total = "Le répertoire de cette affaire n'existe pas."
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
###### FIN REPERTOIRE ####
self.rechercher() # on relance le boton rechercher
elif reponse == 1:
if GLOBAL_mode_debuggage == 'oui': print "annuler"
self.SCROLL_affichage_selon_modif_ajout_suppr(mon_mode = "annuler")
else:
texte_titre = "Action impossible"
msg_total = "Le nom de l'affaire est vide"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Critical)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Fermer"), 0)
reponse = ma_boite.exec_()
self.SCROLL_affichage_selon_modif_ajout_suppr(mon_mode = "annuler")
if GLOBAL_mode_debuggage == 'oui': print "annuler"
def boite_ok_tempo(self,titre, message):
self.mon_wait = QtGui.QProgressDialog(message, "Ok", 0, 4)
#self.mon_wait.setParent(MainWindow)
self.mon_wait.setWindowTitle(titre)
self.mon_wait.setWindowModality(QtCore.Qt.WindowModal)
self.doSomething()
def doSomething(self):
for i in range(1, 3):
time.sleep(1)
self.mon_wait.setValue(i)
if (self.mon_wait.wasCanceled()):
break
self.mon_wait.setValue(4)
def FICHE_valider_nouveau_ou_modif(self, nouveau_ou_modif='nouveau', nom_de_l_affaire_duplicata = 'rien*!'): #=nouveau par défaut
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
if GLOBAL_mode_debuggage == 'oui': print "def FICHE_valider_nouveau_ou_modif"
if GLOBAL_modif_unique_ou_multiple == "multiple":
nouveau_ou_modif = "modif_multiple"
#self.SCROLL_AREA_mon_list_de_list_de_champs c'est là où ya tout dans l'ordre qui va bien
#methode: on crée une matrice dans laquelle on récupère tout les blabla et ensuite on sait que les champs correspondent avec l'ordre du self.SCROLL_AREA_mon_list_de_list_de_champs
mon_QCB = QComboBox_boost_SCROLL()
mon_QLE = QtGui.QLineEdit()
mon_QTE = QTextEdit_boost_zone_text()
mon_QDE = QDateEdit_boost_SCROLL()
mon_QLW = QListWidget_boost_SCROLL()
mon_QPB = QtGui.QPushButton()
if GLOBAL_mode_debuggage == 'oui': print type(mon_QCB)
if GLOBAL_mode_debuggage == 'oui': print type(mon_QLE)
if GLOBAL_mode_debuggage == 'oui': print type(mon_QTE)
if GLOBAL_mode_debuggage == 'oui': print type(mon_QDE)
if GLOBAL_mode_debuggage == 'oui': print type(mon_QLW)
if GLOBAL_mode_debuggage == 'oui': print "tous les blabla"
list_blabla = []
for num_ligne in range(1,self.mon_grid_area.rowCount()):
mon_widget = self.mon_grid_area.itemAtPosition(num_ligne,1).widget()
if type(mon_widget) == type(QComboBox_boost_SCROLL()):
blabla = mon_widget.currentText() #.setEditText (self, QString text) ?pas sûr
if self.mon_grid_area.itemAtPosition(num_ligne,0).widget().text() == "Avancement": #REPLACE accents
mon_avancement = blabla
elif type(mon_widget) == type(QtGui.QLineEdit()):
blabla = mon_widget.displayText() #setText()
if self.mon_grid_area.itemAtPosition(num_ligne,0).widget().text() == "Affaire": #REPLACE accents
if nom_de_l_affaire_duplicata != "rien*!": #on simule une nouvelle affaire lors du duplicata, et on modifie le nom de l'affaire
blabla = self.accents_transformation(nom_de_l_affaire_duplicata) #on repasse le nom de l'affaire en paramètre
titre_affaire = self.accents_transformation(nom_de_l_affaire_duplicata) #on repasse le nom de l'affaire en paramètre
else: #mode normal sans duplicata
blabla = self.accents_transformation(blabla)
titre_affaire = self.accents_transformation(blabla)
elif type(mon_widget) == type(QTextEdit_boost_zone_text()):
blabla = mon_widget.toPlainText() #Use toPlainText() to get the current text. Use setPlainText() to set the text.
elif type(mon_widget) == type(QDateEdit_boost_SCROLL()):
blabla = mon_widget.date().toString(QtCore.Qt.ISODate) #pour que mysal reçoic en champ DATE du AAAA-MM--JJ
elif type(mon_widget) == type(QListWidget_boost_SCROLL()):#plusieurs lignes possibles
list_de_widget = mon_widget.selectedItems()
mon_text = ""
for mon_qlistwidgetitem in list_de_widget:
mon_text = mon_text + mon_qlistwidgetitem.text() + "##"
blabla = mon_text[:-2] #enlève led deux derniers caractères
#blabla = list_de_widget
else:
if GLOBAL_mode_debuggage == 'oui': print "erreur objet non reconnu"
blabla = "erreur"
if GLOBAL_mode_debuggage == 'oui': print type(mon_widget)
if GLOBAL_mode_debuggage == 'oui': print type(blabla)
if GLOBAL_mode_debuggage == 'oui': print unicode(blabla).encode("cp850")
if nouveau_ou_modif == "modif_multiple":
if mon_widget.isEnabled() == True:
list_blabla.append(blabla)
elif mon_widget.isEnabled() == False:
list_blabla.append(19996142556523) #on insere un truc à la con qd le widget est disabled
else:
list_blabla.append(blabla)
if GLOBAL_mode_debuggage == 'oui': print "list_blabla"
if GLOBAL_mode_debuggage == 'oui': print list_blabla
if GLOBAL_mode_debuggage == 'oui': print ""
if nouveau_ou_modif == 'modif':
if GLOBAL_mode_debuggage == 'oui': print "self.ligne_avant_modif select mysql"
if GLOBAL_mode_debuggage == 'oui': print self.ligne_avant_modif[0]
if GLOBAL_mode_debuggage == 'oui': print "TABLEAU self.ligne_cliquee_avant_modif"
if GLOBAL_mode_debuggage == 'oui': print self.ligne_cliquee_avant_modif
if self.ligne_avant_modif[0] != self.ligne_cliquee_avant_modif:
if GLOBAL_mode_debuggage == 'oui': print "erreur qqun a modifié la base"
return "modification impossible" #on sorte de la fonction avec le return !
else:
if GLOBAL_mode_debuggage == 'oui': print "ok modif possible"
mon_dict = {}
for num in range(1,len(self.SCROLL_AREA_mon_list_de_list_de_champs)):
mon_widget_col_0 = self.mon_grid_area.itemAtPosition(num,0).widget() #attention bug possible pour modif multiple
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]
#if GLOBAL_mode_debuggage == 'oui': print list_blabla[num-1]
type_de_donnees = self.SCROLL_AREA_mon_list_de_list_de_champs[num][1]
if type_de_donnees[:3] == "int":
if GLOBAL_mode_debuggage == 'oui': print "int"
if list_blabla[num-1] == "":
valeur = 0
else:
valeur = int(list_blabla[num-1])
if nouveau_ou_modif == "modif_multiple":
if mon_widget_col_0.isEnabled() == True:
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]=valeur #dictionnaire
else:
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]=valeur #dictionnaire
if GLOBAL_mode_debuggage == 'oui': print type(valeur)
elif type_de_donnees[:5] == "float":
if GLOBAL_mode_debuggage == 'oui': print "float"
if list_blabla[num-1] == "":
valeur = 0.0
else:
valeur = float(list_blabla[num-1])
if nouveau_ou_modif == "modif_multiple":
if mon_widget_col_0.isEnabled() == True:
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]=valeur #dictionnaire
else:
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]=valeur #dictionnaire
if GLOBAL_mode_debuggage == 'oui': print type(valeur)
else:
if nouveau_ou_modif == "modif_multiple":
if mon_widget_col_0.isEnabled() == True:
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]=unicode(list_blabla[num-1]) #dictionnaire
else:
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]=unicode(list_blabla[num-1]) #dictionnaire
if GLOBAL_mode_debuggage == 'oui': print "mon_dict"
if GLOBAL_mode_debuggage == 'oui': print "len(mon_dict)"
if GLOBAL_mode_debuggage == 'oui': print len(mon_dict)
if GLOBAL_mode_debuggage == 'oui': print mon_dict
if nouveau_ou_modif != "modif_multiple":
####
if GLOBAL_mode_debuggage == 'oui': print "self.SCROLL_AREA_mon_list_de_list_de_champs"
if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs
for num in range(1,len(self.SCROLL_AREA_mon_list_de_list_de_champs)):
monsplit2 = self.SCROLL_AREA_mon_list_de_list_de_champs[num][0].split('#')
monsplit5 = self.SCROLL_AREA_mon_list_de_list_de_champs[num][5].split('#')
if GLOBAL_mode_debuggage == 'oui': print monsplit2
if GLOBAL_mode_debuggage == 'oui': print monsplit5
try:
toto = monsplit2[2] # on tente de récupérer le truc
mon_objet = "existant"
except:
mon_objet = "pas_existant"
if mon_objet == "existant":
if monsplit2[2]== "QPB" and monsplit5[1] == "pas_de_mdp":
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "detection dun QPB a droite et sans mot de passe"
#connection à la table monsplit2[4], champ numéro monsplit2[5]
requete = ("select * from %s " % (monsplit2[4]))
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#if GLOBAL_mode_debuggage == 'oui': print "requete"
#if GLOBAL_mode_debuggage == 'oui': print requete
cur.execute(requete)
tableau_resultat = list(cur.fetchall())
cur.close()
id.commit()
id.close()
if GLOBAL_mode_debuggage == 'oui': print "tableau_resultat"
if GLOBAL_mode_debuggage == 'oui': print tableau_resultat
trouve_oui_non = "non"
for num2 in range(len(tableau_resultat)):
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "recherche comparaison"
#if GLOBAL_mode_debuggage == 'oui': print mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]].decode("iso-8859-1")
#if GLOBAL_mode_debuggage == 'oui': print tableau_resultat[num2][0].decode("iso-8859-1")
if mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]] == tableau_resultat[num2][0].decode("iso-8859-1"):
if GLOBAL_mode_debuggage == 'oui': print "element trouve donc RAS"
trouve_oui_non = "oui"
if trouve_oui_non == "non": #si on n'a pas réussi à trouver l'info dans la base associée au champ
if GLOBAL_mode_debuggage == 'oui': print "soit le champ a ete vraiment supprime, soit cest une modif entre temps"
#scanner le champ en question pour trouver le champ en italique souligne
#si c'esun vrai champ supprimé, on continue sans problème
#si c'est une modif entre temps: message d'erreur et RETURN return "modification impossible" ????
for num_elem in range(len(self.TRI_mon_list_de_list_de_parametres_de_tri)):
try:
self.mon_grid_area.itemAtPosition(num_elem,0).widget().text()
suite = "oui"
except:
suite = "non"
if suite == "oui":
if GLOBAL_mode_debuggage == 'oui': print "comparaison"
if GLOBAL_mode_debuggage == 'oui': print unicode(self.mon_grid_area.itemAtPosition(num_elem,0).widget().text()).encode("CP850")
if GLOBAL_mode_debuggage == 'oui': print unicode(self.SCROLL_AREA_mon_list_de_list_de_champs[num][6]).encode("CP850")
if self.mon_grid_area.itemAtPosition(num_elem,0).widget().text() == self.SCROLL_AREA_mon_list_de_list_de_champs[num][6]:
#on recupere le widget correspondant:
if GLOBAL_mode_debuggage == 'oui': print "correspondance ok"
mon_widget = self.mon_grid_area.itemAtPosition(num_elem,1).widget()
if GLOBAL_mode_debuggage == 'oui': print type(mon_widget)
if GLOBAL_mode_debuggage == 'oui': print type(QComboBox_boost_SCROLL())
if type(QComboBox_boost_SCROLL()) == type(mon_widget):
if GLOBAL_mode_debuggage == 'oui': print "mon_widget.itemText(num3_cbbx)"
element_modifie_entre_temps = "oui"
for num3_cbbx in range(mon_widget.count()):
#if GLOBAL_mode_debuggage == 'oui': print unicode(mon_widget.itemText(num3_cbbx)).encode("cp850")
qfont_detecte = mon_widget.itemData(num3_cbbx, QtCore.Qt.FontRole) #pas de bug, mais se poser la question pour les Qlistwidget....
if qfont_detecte.typeName() == "QFont":
#if GLOBAL_mode_debuggage == 'oui': print qfont_detecte.typeName()
convertionok = qfont_detecte.Font
if GLOBAL_mode_debuggage == 'oui': print "convertionok"
#if GLOBAL_mode_debuggage == 'oui': print qfont_detecte.toString()
monQFont = QtGui.QFont()
monQFont.setItalic(True) #italique
monQFont.setBold(True) #gras
pour_comparer = QtCore.QVariant(monQFont).toString()
#si le text actuel du CBX est retrouvé dans la liste des item en gras italique, alors c'est bon
if mon_widget.currentText() == mon_widget.itemText(num3_cbbx) and qfont_detecte.toString() == pour_comparer:
element_modifie_entre_temps = "non"
if element_modifie_entre_temps == "oui":
texte_titre = unicode("Cas rarissime MySQL", "iso-8859-1")
msg1 = unicode("Modification non effectuée\nLe champ: \n ", "iso-8859-1")
#msg2 = unicode(self.mon_grid_area.itemAtPosition(num_elem,0).widget().text(), "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
msg2 = unicode(self.mon_grid_area.itemAtPosition(num_elem,0).widget().text()) #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
msg3 = unicode("\ncontenant le texte: \n", "iso-8859-1") # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg4 = unicode(unicode(mon_widget.currentText())) # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
msg5 = unicode("\na été modifiée par une personne extérieure depuis votre denière connexion. Vous devez redémarrer l'application", "iso-8859-1")
msg_total = msg1 + msg2 + msg3 + msg4 + msg5
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
ma_boite.addButton(_fromUtf8("Annuler"), 1)
reponse = ma_boite.exec_()
return "mis a jour entre temps" #le return n'est pas repris par une autre fonction
elif type(QListWidget_boost_SCROLL()) == type(mon_widget):
if GLOBAL_mode_debuggage == 'oui': print "BUG boulot a faire pour le modification entre le temps de deux connections d'un Qlist widget avec bouton sans mot de passe"
#mais dans cette application, ça ne doit pas pouvoir arriver...
else:
if GLOBAL_mode_debuggage == 'oui': print "erreur qqun a modifié la base"
texte_titre = "Erreur de programmation"
msg_debut = "Erreur de programmation, ce cas n'a pas été prévu, contactez votre administrateur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
#ICI TOTO debut_requete = ("insert into %s (%s) values " % (mysql_Nom_de_table, self.ma_structure_table[0][0]))
compteur_champs_a_modifier = -10
if nouveau_ou_modif == "nouveau" or nouveau_ou_modif == "duplique":
debut_requete = ("insert into %s (" % (mysql_Nom_de_table))
suite_requete = debut_requete
#liste des champs
for num in range(1,len(self.SCROLL_AREA_mon_list_de_list_de_champs)):
#if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]
exec("suite_requete = suite_requete + '`%s`' + ','" % (self.SCROLL_AREA_mon_list_de_list_de_champs[num][0])) #altgr+7 à cause du dièse
suite_requete = suite_requete[:-1] #enlève le dernier caractère
suite_requete = suite_requete + ") values ("
# %%% des prévaleurs
for num in range(1,len(self.SCROLL_AREA_mon_list_de_list_de_champs)):
#if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]
#exec("suite_requete = suite_requete + '%('+ %s +')s' + ','" % (self.SCROLL_AREA_mon_list_de_list_de_champs[num+1][0]))
type_de_donnees = self.SCROLL_AREA_mon_list_de_list_de_champs[num][1]
exec("suite_requete = suite_requete + '%'")
exec("suite_requete = suite_requete + '('+ '%s' +')s' + ','" % (self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]))
suite_requete = suite_requete[:-1]
suite_requete = suite_requete+ ")"
if GLOBAL_mode_debuggage == 'oui': print "suite_requete"
if GLOBAL_mode_debuggage == 'oui': print suite_requete
elif nouveau_ou_modif == "modif":
if GLOBAL_mode_debuggage == 'oui': print "ici la modif"
#nb_ligne_modifiees = cur.execute("UPDATE preferences_utilisateurs SET ordre_col_tableau_resultat=%s WHERE (nom_utilisateur=%s)", \
#(str(matrice_colonnes_resultat), unicode(GLOBAL_config_actuelle_finale)))
######
debut_requete = ("UPDATE %s SET " % (mysql_Nom_de_table))
suite_requete = debut_requete
#liste des champs
if GLOBAL_mode_debuggage == 'oui': print "len(self.SCROLL_AREA_mon_list_de_list_de_champs)"
if GLOBAL_mode_debuggage == 'oui': print len(self.SCROLL_AREA_mon_list_de_list_de_champs)
for num in range(1,len(self.SCROLL_AREA_mon_list_de_list_de_champs)):
#if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]
exec("suite_requete = suite_requete + '`%s`'" % (self.SCROLL_AREA_mon_list_de_list_de_champs[num][0])) #altgr+7 à cause du dièse
exec("suite_requete = suite_requete + '=%('")
exec("suite_requete = suite_requete + '%s' + ')s,' " % (self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]))
suite_requete = suite_requete[:-1] #enlève le dernier caractère
#suite_requete = suite_requete+ ")"
ligne_actuelle = self.qtableWidget_resultat.currentRow()
ref_index = self.qtableWidget_resultat.item(ligne_actuelle,0).data(0).toString() # on récupère le texte
if GLOBAL_mode_debuggage == 'oui': print "############ref_index#############"
if GLOBAL_mode_debuggage == 'oui': print ref_index
if GLOBAL_mode_debuggage == 'oui': print "ligne_actuelle"
if GLOBAL_mode_debuggage == 'oui': print ligne_actuelle
if GLOBAL_mode_debuggage == 'oui': print ""
exec("suite_requete = suite_requete + ' WHERE (`%s`=%s)'" % (self.SCROLL_AREA_mon_list_de_list_de_champs[0][0],str(ref_index)))
elif nouveau_ou_modif == "modif_multiple":
if GLOBAL_mode_debuggage == 'oui': print "ici la modif_multiple"
#nb_ligne_modifiees = cur.execute("UPDATE preferences_utilisateurs SET ordre_col_tableau_resultat=%s WHERE (nom_utilisateur=%s)", \
#(str(matrice_colonnes_resultat), unicode(GLOBAL_config_actuelle_finale)))
######
debut_requete = ("UPDATE %s SET " % (mysql_Nom_de_table))
suite_requete = debut_requete
#liste des champs
if GLOBAL_mode_debuggage == 'oui': print "len(self.SCROLL_AREA_mon_list_de_list_de_champs)"
if GLOBAL_mode_debuggage == 'oui': print len(self.SCROLL_AREA_mon_list_de_list_de_champs)
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "mon_dict"
if GLOBAL_mode_debuggage == 'oui': print mon_dict
compteur_champs_a_modifier = 0
champ_avancementQCB = "standard"
for num in range(1,len(self.SCROLL_AREA_mon_list_de_list_de_champs)):
if GLOBAL_mode_debuggage == 'oui': print "num"
if GLOBAL_mode_debuggage == 'oui': print num
if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]
if GLOBAL_mode_debuggage == 'oui': print mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]]
if mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]] != 19996142556523 and \
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]] != "19996142556523" and \
mon_dict[self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]] != 19996142556523.0:
compteur_champs_a_modifier = compteur_champs_a_modifier + 1
#if GLOBAL_mode_debuggage == 'oui': print self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]
exec("suite_requete = suite_requete + '`%s`'" % (self.SCROLL_AREA_mon_list_de_list_de_champs[num][0])) #altgr+7 à cause du dièse
exec("suite_requete = suite_requete + '=%('")
exec("suite_requete = suite_requete + '%s' + ')s,' " % (self.SCROLL_AREA_mon_list_de_list_de_champs[num][0]))
#prise en compte du bug de modif multiple avec le champ avancement 2015-01-16: si le champ est "avancement#QCB", alors, il faut le garder en tête pour prise en compte dans le déplacement de fichiers
if self.SCROLL_AREA_mon_list_de_list_de_champs[num][0] == "avancement#QCB":
champ_avancementQCB = "actif-en-orange"
suite_requete = suite_requete[:-1] #enlève le dernier caractère
#suite_requete = suite_requete+ ")"
suite_requete = suite_requete + ' WHERE ('
#toutes_les_items_actuels = self.qtableWidget_resultat.selectedItems()
toutes_les_QModelIndex_actuels = self.qtableWidget_resultat.selectionModel().selectedRows()
for chaque_QModelIndex in toutes_les_QModelIndex_actuels:
ref_index = self.qtableWidget_resultat.item(chaque_QModelIndex.row(),0).data(0).toString() # on récupère le texte de la référence unique
if GLOBAL_mode_debuggage == 'oui': print "############ref_index#############"
if GLOBAL_mode_debuggage == 'oui': print ref_index
if GLOBAL_mode_debuggage == 'oui': print ""
exec("suite_requete = suite_requete + '`%s`=%s OR ' " % (self.SCROLL_AREA_mon_list_de_list_de_champs[0][0],str(ref_index)))
suite_requete = suite_requete[:-4] #enlève les 4 derniers caractère
suite_requete = suite_requete + ')'
if GLOBAL_mode_debuggage == 'oui': print "suite_requete"
if GLOBAL_mode_debuggage == 'oui': print suite_requete
######
if (titre_affaire != "" or GLOBAL_modif_unique_ou_multiple == "multiple") and compteur_champs_a_modifier != 0 :
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
try: #à remettre en place !!!
cur.execute(suite_requete, mon_dict)
#cur.execute(suite_requete)
#cur.execute("INSERT INTO base_des_affaires1 (`num_boite_archive#QLE`) VALUES ('toto')") # youpi !!!! ça passe utiliser AltGr+7
cur.close()
id.commit()
id.close()
#message erreur:
texte_titre = "Opération sur base"
msg_1 = unicode("L'affaire: \n", "iso-8859-1")
msg_2 = unicode(titre_affaire)
tempo_ferme_fenetre = "non"
if nouveau_ou_modif == "nouveau" or nouveau_ou_modif == "duplique":
msg_3 = unicode("\na bien été ajoutée", "iso-8859-1")
tempo_ferme_fenetre = "oui"
elif nouveau_ou_modif == "modif":
msg_3 = unicode("\na bien été modifiée", "iso-8859-1")
tempo_ferme_fenetre = "oui"
if nouveau_ou_modif == "modif_multiple":
msg_total = unicode("Les affaires sélectionnées ont bien été modifiées", "iso-8859-1")
else:
msg_total = msg_1 + msg_2 + msg_3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
self.boite_ok_tempo(texte_titre,msg_total)
"""
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Information)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
"""
if GLOBAL_deplacement_de_fichier == "oui":
######## GESTION DES REPERTOIRES - DEPLACEMENT ###########
#### 05/12/2013 à priori toute la gestion des répertoires fonctionne mais c'est trop risqué et on le tentera peut être plus tard
#http://python.developpez.com/faq/?page=Repertoire
nouveau_chemin_repertoire = self.concat_chemin(mon_avancement, titre_affaire)
if nouveau_ou_modif == "nouveau" or nouveau_ou_modif == "duplique":
#concat_chemin(self, type_concours_affaire_etc, nom_affaire)
#repertoire existant, on ne fait rien!!!
if os.path.isdir(nouveau_chemin_repertoire) == True:
if GLOBAL_mode_debuggage == 'oui': print "chemin deja existant on ne cree rien"
texte_titre = "Répertoire non créé"
msg_total = "Le répertoire de cette affaire existe déjà, le repertoire n'a donc pas été créé"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
#ok, création du répertoire
elif os.path.isdir(nouveau_chemin_repertoire) == False:
if GLOBAL_mode_debuggage == 'oui': print "creation du repertoire"
if GLOBAL_mode_debuggage == 'oui': print unicode(nouveau_chemin_repertoire).encode("CP850")
try:
os.mkdir(nouveau_chemin_repertoire, 0777)
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
reg_con_chemin_affaires = mon_setting.value('chemins/chemin_affaires').toString()
arborescence_type = os.path.join(str(reg_con_chemin_affaires), "AAA_Arborescence_type")
#shutil.copytree(arborescence_type,nouveau_chemin_repertoire) #ne marche pas si le répertoire existe déjà
#source: http://www.afpy.org/forums/forum_python/forum_general/724939033636
base=arborescence_type
cible=nouveau_chemin_repertoire
for f in os.listdir(base):
src=os.path.join(base,f)
tgt=os.path.join(cible,f)
if os.path.isdir(src):
shutil.copytree(src,tgt)
else:
shutil.copy(src,tgt)
except:
texte_titre = "Sous répertoires de l'affaire non créés"
msg_total = "L'arborescence type du sous répertoire n'a pas été créée. Vérifiez que les sous-chemins de l'arborescence type d'une affaire sont bien définis"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except:
texte_titre = "Répertoire non créé"
msg_total = "Le répertoire n'a pas été créé. Vérifiez que les chemins sont bien définis"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif nouveau_ou_modif == "modif":
if GLOBAL_mode_debuggage == 'oui': print "ligne_actuelle tableau resultat"
if GLOBAL_mode_debuggage == 'oui': print ligne_actuelle
type_concours_affaire_etc = self.qtableWidget_resultat.item(ligne_actuelle,15).data(0).toString()
ancien_nom_affaire = self.qtableWidget_resultat.item(ligne_actuelle,1).data(0).toString()
ancien_chemin_repertoire = self.concat_chemin(type_concours_affaire_etc, ancien_nom_affaire)
if unicode(nouveau_chemin_repertoire) != unicode(ancien_chemin_repertoire):
if os.path.isdir(nouveau_chemin_repertoire) == True:
if GLOBAL_mode_debuggage == 'oui': print "chemin deja existant on ne modifie rien"
texte_titre = "Répertoire non déplacé-modifié"
msg_total = "Le répertoire de destination de cette affaire existe déjà sur le serveur. Vous devez gérer ce répertoire manuellement"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif os.path.isdir(nouveau_chemin_repertoire) == False:
#shutil.move(src, dst)
if GLOBAL_mode_debuggage == 'oui': print "creation du repertoire ancien-nouveau"
if GLOBAL_mode_debuggage == 'oui': print unicode(ancien_chemin_repertoire).encode("CP850")
if GLOBAL_mode_debuggage == 'oui': print unicode(nouveau_chemin_repertoire).encode("CP850")
if os.path.isdir(ancien_chemin_repertoire):
try:
shutil.move(ancien_chemin_repertoire, nouveau_chemin_repertoire)
except:
if GLOBAL_mode_debuggage == 'oui': print "erreur fichier deja ouvert dans ce repertoire"
texte_titre = "Fichier en cours d'utilisation"
msg_total = "Déplacement critique !! Le répertoire déplacé contenait un fichier actuellement en cours d'utilisation par un utilisateur. Cet utilisateur doit enregistrer son fichier vers le nouvel emplacement et supprimer l'ancien répertoire manuellement!"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
else:
texte_titre = "Répertoire source inexistant"
msg_total = "Déplacement physique du répertoire impossible: le répertoire source de cette affaire n'existe pas sur le serveur"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
elif nouveau_ou_modif == "modif_multiple": ###A FAIRE MARCO !!!!!
liste_fichiers_impossibles = []
liste_repertoires_existants = []
liste_fichiers_deja_ouverts = []
####
toutes_les_QModelIndex_actuels = self.qtableWidget_resultat.selectionModel().selectedRows()
for chaque_QModelIndex in toutes_les_QModelIndex_actuels:
if GLOBAL_mode_debuggage == 'oui': print "############ref_index#############"
type_concours_affaire_etc = self.qtableWidget_resultat.item(chaque_QModelIndex.row(),15).data(0).toString()
nom_affaire = self.qtableWidget_resultat.item(chaque_QModelIndex.row(),1).data(0).toString()
ancien_chemin_repertoire = self.concat_chemin(type_concours_affaire_etc, nom_affaire)
#prise en compte de l'orange sur le champ déplacement
if champ_avancementQCB == "actif-en-orange":
nouveau_chemin_repertoire = self.concat_chemin(mon_avancement, nom_affaire)
elif champ_avancementQCB == "standard":
nouveau_chemin_repertoire = ancien_chemin_repertoire
if GLOBAL_mode_debuggage == 'oui': print "ancien_chemin_repertoire"
if GLOBAL_mode_debuggage == 'oui': print ancien_chemin_repertoire
if GLOBAL_mode_debuggage == 'oui': print "nouveau_chemin_repertoire"
if GLOBAL_mode_debuggage == 'oui': print nouveau_chemin_repertoire
####
if unicode(nouveau_chemin_repertoire) != unicode(ancien_chemin_repertoire):
if os.path.isdir(nouveau_chemin_repertoire) == True:
if GLOBAL_mode_debuggage == 'oui': print "chemin deja existant on ne modifie rien"
liste_repertoires_existants.append(unicode(nouveau_chemin_repertoire))
elif os.path.isdir(nouveau_chemin_repertoire) == False:
#shutil.move(src, dst)
if GLOBAL_mode_debuggage == 'oui': print "creation du repertoire ancien-nouveau"
#if GLOBAL_mode_debuggage == 'oui': print unicode(ancien_chemin_repertoire).encode("CP850")
#if GLOBAL_mode_debuggage == 'oui': print unicode(nouveau_chemin_repertoire).encode("CP850")
if os.path.isdir(ancien_chemin_repertoire):
try:
shutil.move(ancien_chemin_repertoire, nouveau_chemin_repertoire)
except:
liste_fichiers_deja_ouverts.append(unicode(ancien_chemin_repertoire))
else:
liste_fichiers_impossibles.append(unicode(ancien_chemin_repertoire))
if len(liste_repertoires_existants) > 0:
texte_titre = "Répertoires non déplacé-modifié"
msg_1 = unicode("Déplacement impossible: le répertoire destination des affaires ci-dessous: \n", "iso-8859-1")
#msg_2 = unicode(ancien_chemin_repertoire)
msg_3 = unicode("\n existe déjà sur le serveur. Vous devez gérer ces répertoires manuellement", "iso-8859-1")
msg_total = msg_1
for nom_fichier in liste_repertoires_existants:
msg_total = msg_total + unicode("\n - ", "iso-8859-1") + nom_fichier
msg_total = msg_total + msg_3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
if len(liste_fichiers_impossibles) > 0:
texte_titre = "Répertoire source inexistant"
msg_1 = unicode("Déplacement impossible: le répertoire source des affaires ci-dessous n'existe pas sur le serveur: \n", "iso-8859-1")
#msg_2 = unicode(ancien_chemin_repertoire)
msg_3 = unicode("\n \n Vous devez gérer ces répertoires manuellement", "iso-8859-1")
msg_total = msg_1
for nom_fichier in liste_fichiers_impossibles:
msg_total = msg_total + unicode("\n - ", "iso-8859-1") + nom_fichier
msg_total = msg_total + msg_3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
if len(liste_fichiers_deja_ouverts) > 0:
texte_titre = "Fichiers en cours d'utilisation"
msg_1 = unicode("Déplacement critique - fichiers déjà ouverts: certains fichiers dans les répertoires sources des affaires ci-dessous contenaient des fichiers en cours d'utilisation par un utilisateur: \n", "iso-8859-1")
#msg_2 = unicode(ancien_chemin_repertoire)
msg_3 = unicode("\n \n Cet utilisateur doit enregistrer son fichier vers le nouvel emplacement et supprimer le(les) ancien(s) répertoire(s) manuellement!", "iso-8859-1")
msg_total = msg_1
for nom_fichier in liste_fichiers_deja_ouverts:
msg_total = msg_total + unicode("\n - ", "iso-8859-1") + nom_fichier
msg_total = msg_total + msg_3
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
#self.table.selectionModel().selectedRows()
######## FIN GESTION DES REPERTOIRES FIN - DEPLACEMENT ###########
self.rechercher() # on relance le bouton rechercher
################ REMISE au niveau de la bonne ligne
if nouveau_ou_modif == "nouveau" or nouveau_ou_modif == "duplique" or nouveau_ou_modif == "modif_multiple":
try:
self.RESULTAT_cell_clickee(-1,self.qtableWidget_resultat.currentColumn()) #on simule un clic dans la ligne pour actualiser chque champ !
except:
self.RESULTAT_cell_clickee(-1,0) #on simule un clic dans la ligne pour actualiser chque champ !
elif nouveau_ou_modif == "modif":
if titre_affaire != "":
if GLOBAL_mode_debuggage == 'oui': print "SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS"
if GLOBAL_mode_debuggage == 'oui': print titre_affaire
mes_list_items = self.qtableWidget_resultat.findItems(titre_affaire, QtCore.Qt.MatchExactly)
#if GLOBAL_mode_debuggage == 'oui': print mes_list_items
#for elem in mes_list_items:
#if GLOBAL_mode_debuggage == 'oui': print self.qtableWidget_resultat.horizontalHeaderItem(mes_list_items[0].column()).text()
if self.qtableWidget_resultat.horizontalHeaderItem(mes_list_items[0].column()).text() == "Affaire":
if GLOBAL_mode_debuggage == 'oui': print "AAAAAABVGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
self.qtableWidget_resultat.setCurrentCell(mes_list_items[0].row(),0)
self.RESULTAT_cell_clickee(mes_list_items[0].row(),0) #on simule un clic dans la ligne pour actualiser chque champ !
else:
self.qtableWidget_resultat.setCurrentCell(-1,0)
self.RESULTAT_cell_clickee(-1,0) #on simule un clic dans la ligne pour actualiser chaque champ !
except MySQLdb.IntegrityError, e:
if nom_de_l_affaire_duplicata == 'rien*!' and nouveau_ou_modif == "duplique":
print "A FAIRE MARCO DUPLIQUE"
texte_titre = "Duplication d'une ligne"
msg_1 = unicode("Seule la ligne sera dupliquée dans Chapty. Vous devrez gérer manuellement la copie des répertoires physiques existant sur le dossier d'origine. \n", "iso-8859-1")
msg_2 = unicode("Nouveau nom: \n", "iso-8859-1")
msg_3 = unicode(titre_affaire)
msg_4 = unicode("_", "iso-8859-1") #rajout d'un tiret bas pour le duplique
msg_total = msg_1 + msg_2 + msg_3 + msg_4
##############
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactiver totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
ma_boite.addButton(_fromUtf8("Annuler"), 1)
reponse = ma_boite.exec_()
if reponse == 0: #ok
nouveau_nom_duplicata = msg_3 + msg_4
self.FICHE_valider_nouveau_ou_modif(nouveau_ou_modif='nouveau', nom_de_l_affaire_duplicata = nouveau_nom_duplicata)
else:
texte_titre = "Erreur"
msg_debut = "Vous avez un doublon sur le champ affaire. Vérifier que cette affaire est bien unique (y compris dans les concours et archives)"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactiver totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
except MySQLdb.OperationalError,e:
texte_titre = "Erreur de connection au serveur"
msg_debut = "Connexion impossible: \n Vérifier si la connection au serveur de base de données est bien établie"
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_debut)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
else:
if compteur_champs_a_modifier == 0 and GLOBAL_modif_unique_ou_multiple == "multiple":
texte_titre = "Opération sur base"
msg_total = "Modification impossible!\n Aucun descriptif de champ en orange n'a été selectionné!"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
else:
texte_titre = "Opération sur base"
msg_total = "Insertion impossible!\nVous devez renseigner le champ 'Affaire'"
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
if nouveau_ou_modif == "modif_multiple": #on repasse en mode unique une fois les modifs effectuées
self.fonction_action_droit_unique()
self.FICHE_annuler()
QtGui.QApplication.restoreOverrideCursor()
def FICHE_valider_modif(self):
if GLOBAL_mode_debuggage == 'oui': print "def valider_modif"
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
#méthode:
#voir si une modif a déjà été faite par qq'un d'autre:
#pour cela: récuperer le list existant lors de chaque clic dans tableau résultat: self.ligne_cliquee_dans_tableau
#ensuite on fait un SELECT sur cette même ligne et on vérifie que la ligne est identique ou pas
# si la ligne est identique: ok on peut faire la modif: UPDATE datas...
# si la ligne est différente: message d'erreur, et pas de modif!
ligne_actuelle = self.qtableWidget_resultat.currentRow()
ref_index = self.qtableWidget_resultat.item(ligne_actuelle,0).data(0).toString() # on récupère le texte
requete = ("select * from %s where `%s` = %s" % (mysql_Nom_de_table, self.SCROLL_AREA_mon_list_de_list_de_champs[0][0], (ref_index)))
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
if GLOBAL_mode_debuggage == 'oui': print "requete"
if GLOBAL_mode_debuggage == 'oui': print requete
cur.execute(requete)
self.ligne_avant_modif = list(cur.fetchall())
#cur.execute(suite_requete)
#cur.execute("INSERT INTO base_des_affaires1 (`num_boite_archive#QLE`) VALUES ('toto')") # youpi !!!! ça passe utiliser AltGr+7
if GLOBAL_mode_debuggage == 'oui': print "self.ligne_avant_modif"
if GLOBAL_mode_debuggage == 'oui': print self.ligne_avant_modif
cur.close()
id.commit()
id.close()
verification = self.FICHE_valider_nouveau_ou_modif(nouveau_ou_modif='modif')
if verification == "modification impossible":
texte_titre = "Modification impossible"
msg_total = unicode("Modification impossible!\nUne personne extérieure a modifié cette même affaire depuis votre dernière recherche !", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
self.rechercher() # on relance le boton rechercher
self.FICHE_annuler()
QtGui.QApplication.restoreOverrideCursor()
def FICHE_annuler(self):
global GLOBAL_modif_unique_ou_multiple
QtGui.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
if GLOBAL_mode_debuggage == 'oui': print "def valider_modif"
self.qpush_nouveau.show()
self.qpush_modifier.show()
self.qpush_supprimer.show()
self.qpush_valider_nouveau.hide()
self.qpush_valider_modif.hide()
self.qpush_annuler.hide()
self.qpush_rechercher.setEnabled(True)
self.qpush_effacer.setEnabled(True)
self.lineEdit_rapide.setEnabled(True)
self.SCROLL_affichage_selon_modif_ajout_suppr(mon_mode = "annuler")
if GLOBAL_modif_unique_ou_multiple == "multiple":
GLOBAL_modif_unique_ou_multiple = "unique"
self.fonction_action_droit_unique()
QtGui.QApplication.restoreOverrideCursor()
def accents_transformation(self,ligne):
#supprime les accents et tirets du texte source
#ligne = unicode(ligne, 'ISO-8859-1').encode('UTF-8') #on décode la châine d'origine accentuée(ISO8859-1), puis on la passe en UTF8
ligne = unicode(ligne).encode('ISO-8859-1') #on décode la châine d'origine accentuée(ISO8859-1), puis on la passe en UTF8
ligne = ligne.replace('É', 'E')
ligne = ligne.replace('È', 'E')
ligne = ligne.replace('Á', 'A')
ligne = ligne.replace('Â', 'A')
ligne = ligne.replace('À', 'A')
ligne = ligne.replace('Ç', 'C')
ligne = ligne.replace('Î', 'I')
ligne = ligne.replace('Æ', 'Ae')
ligne = ligne.replace('æ', 'ae')
ligne = ligne.replace('œ', 'oe')
ligne = ligne.replace('é', 'e')
ligne = ligne.replace('è', 'e')
ligne = ligne.replace('ê', 'e')
ligne = ligne.replace('ë', 'e')
ligne = ligne.replace('à', 'a')
ligne = ligne.replace('ã', 'a')
ligne = ligne.replace('â', 'a')
ligne = ligne.replace('î', 'i')
ligne = ligne.replace('ï', 'i')
ligne = ligne.replace('ô', 'o')
ligne = ligne.replace('ö', 'o')
ligne = ligne.replace('ç', 'c')
ligne = ligne.replace('ù', 'u')
ligne = ligne.replace('û', 'u')
ligne = ligne.replace('ü', 'u')
ligne = ligne.replace('\'', '_')
ligne = ligne.replace('/', '_')
ligne = ligne.replace("'", '_')
ligne = ligne.replace('"', '_')
ligne = ligne.replace('$', '_')
ligne = ligne.replace('&', '_')
ligne = ligne.replace('#', '_')
ligne = ligne.replace('?', '_')
ligne = ligne.replace('!', '_')
ligne = ligne.replace('%', '_')
ligne = ligne.replace('(', '_')
ligne = ligne.replace(')', '_')
ligne = ligne.replace('°', '')
ligne = ligne.replace(' ', '_')
ligne = ligne.replace('_____', '_')
ligne = ligne.replace('____', '_')
ligne = ligne.replace('___', '_')
ligne = ligne.replace('__', '_')
ligne = ligne.replace('–', '_') #super tiret bizarre
ligne = ligne.replace(' - ', '_-_')
ligne = ligne.replace(' -', '_-')
ligne = ligne.replace('- ', '-_')
ligne = ligne.replace('_-', '-')
ligne = ligne.replace('-_', '-')
ligne = ligne.replace('_-_', '-')
ligne = ligne.replace('St-', 'St_')
ligne = ligne.replace('Ste-', 'Ste_')
#ligne = ligne.encode('ISO-8859-1')
ligne = ligne.encode('utf-8')
return ligne
class Transposition_selon_ordre():
def transpose_inverse_list_multiple(self,debut_list_taille_quelconque,list_ordre_simple):
############ debut invertion #############
final_list_taille_quelconque = []
for i in range(len(list_ordre_simple)):
mon_list =[]
final_list_taille_quelconque.append(mon_list)
for i in range(len(list_ordre_simple)):
final_list_taille_quelconque[i] = debut_list_taille_quelconque[list_ordre_simple[i]]
return final_list_taille_quelconque
############ fin invertion #############
def transpose_list_multiple(self,debut_list_taille_quelconque,list_ordre_simple, var_utilisateur):
#debut_list_taille_quelconque = [['a','Xaa','YYYaa'],['b','Xbb','YYYbb'],['c','Xcc','YYYcc'],['d','Xdd','YYYdd'],['e','Xee','YYYee'],['f','Xff','YYYff'],['g','Xgg','YYYgg']]
#list_ordre_simple = [1,0,2,3,4,6,5]
#list_ordre_simple = [1,0,2]
#list_ordre_simple = [7,1,0,10,2,11,3,8,4,6,5]
#if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "type(debut_list_taille_quelconque)"
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "Matrices en entree"
if GLOBAL_mode_debuggage == 'oui': print "debut_list_taille_quelconque"
if GLOBAL_mode_debuggage == 'oui': print type(debut_list_taille_quelconque)
if GLOBAL_mode_debuggage == 'oui': print len(debut_list_taille_quelconque)
if GLOBAL_mode_debuggage == 'oui': print debut_list_taille_quelconque
if GLOBAL_mode_debuggage == 'oui': print "list_ordre_simple"
if GLOBAL_mode_debuggage == 'oui': print type(list_ordre_simple)
if GLOBAL_mode_debuggage == 'oui': print len(list_ordre_simple)
if GLOBAL_mode_debuggage == 'oui': print list_ordre_simple
difference = len(debut_list_taille_quelconque) - len(list_ordre_simple)
if difference !=0:
#si on trouve une différence, on refabrique un nouveau list en ajoutant ou en supprimant des index
#on le renomme avec son nom d'origine
#on va updater la mase MYSQL pour la config en cours
if GLOBAL_mode_debuggage == 'oui': print "difference"
if GLOBAL_mode_debuggage == 'oui': print difference
list_ordre_simple_modifiee = copy.deepcopy(list_ordre_simple) #on duplique le list
if difference > 0:
msg_debut = "Attention ! \nDes champs ont été ajoutés sur le serveur par votre administrateur. Ces champs ont été ajoutés en fin de liste sur le tableau de droite. Vous devez réorganiser vos tableaux de paramètres de tri (en haut à gauche) et tableau de résultat (ordre des colonnes) de toutes vos configs\nCe message ne réapparaitra pas lors de la prochaine ouverture du logiciel"
for i in range(difference):
mon_nouveau_num = len(list_ordre_simple)+i
list_ordre_simple_modifiee.append(mon_nouveau_num)
elif difference < 0:
msg_debut = "Attention ! \nDes champs ont été supprimés sur le serveur par votre administrateur. Vous devez réorganiser vos configs, tri et affichage via paramètres-gestion des configs\nCe message ne réapparaitra pas lors de la prochaine ouverture du logiciel "
type_difference = "suppr"
for i in range(abs(difference)):
list_ordre_simple_modifiee.remove(max(list_ordre_simple_modifiee))
#on a refabriqué un nouveau List augmenté ou diminué du nombre de colonnes
list_ordre_simple = copy.deepcopy(list_ordre_simple_modifiee)
if GLOBAL_mode_debuggage == 'oui': print "list_ordre_simple"
if GLOBAL_mode_debuggage == 'oui': print list_ordre_simple
if difference > 0:
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#cur.execute("UPDATE preferences_utilisateurs SET nom_utilisateur=%s, ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" ,(nouveau_text, str(nouvelle_matrice_colonnes_scroll),ancien_text))
cur.execute("UPDATE preferences_utilisateurs SET ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" , \
(str(list_ordre_simple), unicode(var_utilisateur)))
cur.close()
id.commit()
id.close()
elif difference < 0:
list_tableau_col_visibles = []
for i in range(len(list_ordre_simple)):
mon_petit_list = []
mon_petit_list.append(i)
mon_petit_list.append(i)
mon_petit_list.append(100)
list_tableau_col_visibles.append(mon_petit_list)
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
#cur.execute("UPDATE preferences_utilisateurs SET nom_utilisateur=%s, ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" ,(nouveau_text, str(nouvelle_matrice_colonnes_scroll),ancien_text))
cur.execute("UPDATE preferences_utilisateurs SET ordre_col_tableau_resultat=%s, ordre_zone_scroll_area=%s WHERE (nom_utilisateur=%s)" , \
(str(list_tableau_col_visibles),str(list_ordre_simple), unicode(var_utilisateur)))
cur.close()
id.commit()
id.close()
#message erreur:
texte_titre = "Structure de base sur serveur modifiée"
msg_total = unicode(msg_debut, "iso-8859-1") #ce que j'écris en texte dans mon code est en ISO-8859-1 c'est pour ça que unicode(machaine, sys.stdin.encoding) ne sert pas
#msg_variable = unicode(blabla, "iso-8859-1") # pas besoin de sys.stdin.encoding, puisque ça vient d'ailleurs
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
############ debut invertion #############
final_list_taille_quelconque = []
for i in range(len(list_ordre_simple)):
mon_list =[]
final_list_taille_quelconque.append(mon_list)
for i in range(len(list_ordre_simple)):
final_list_taille_quelconque[i] = debut_list_taille_quelconque[list_ordre_simple[i]]
############ fin invertion #############
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print "debut: " + str(debut_list_taille_quelconque)
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print "ordre: " + str(list_ordre_simple)
#if GLOBAL_mode_debuggage == 'oui': print ""
#if GLOBAL_mode_debuggage == 'oui': print "fin: " + str(final_list_taille_quelconque)
if GLOBAL_mode_debuggage == 'oui': print ""
return final_list_taille_quelconque,list_ordre_simple
###############################
class Fenetre_connexion(Ui_Dialog_connection_Qt): #METHODE PARFAITE POUR CREER LES FENETRES !!! YES !!!! #fenetre_connexion1
#http://snouffy.free.fr/blog-fr/index.php/post/2009/02/18/Qt,-Qt-Designer-et-Python-%3A-d%C3%A9tecter-la-fermeture-de-la-fen%C3%AAtre
#ma_fenetre_connection = QtGui.QDialog(MainWindow) #bien préciser le parent, sinon la fenetre s'ouvre et se referme
#connection = Fenetre_connexion()
#connection.setupUi2(ma_fenetre_connection) #on passe une QDailog ou QMainWindow suivant ce qu'on a créé avec Qt
#ma_fenetre_connection.show()
def ferme_fenetre(self):
self.dialog_connection.close() # du coup la fonction close_event détecte également la fermeture et est lancée
def close_Event(self, event):
if GLOBAL_mode_debuggage == 'oui': print "je ferme les parametres connexions"
def setupUi2(self,Form):
"""Ajoutons ce qu'il manque à la fenêtre"""
self.dialog_connection = Form #promotion: permet de monter d'un cran la fenetre et de l'utiliser ailleurs
self.setupUi(self.dialog_connection) #
self.dialog_connection.closeEvent = self.close_Event
self.dialog_connection.setWindowModality(QtCore.Qt.ApplicationModal) #fenetre modale: non_modal: setWindowModality(QtCore.Qt.NonModal)
self.dialog_connection.setWindowTitle("Paramètres de connexion")
exec("self.push_chemin_affaires.setIcon(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))))" % (GLOBAL_chemin_icone, "folder.png"))
exec("self.push_chemin_archives.setIcon(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))))" % (GLOBAL_chemin_icone, "folder.png"))
QtCore.QObject.connect(self.push_chemin_affaires,QtCore.SIGNAL("clicked()"),self.clicked_affaires)
QtCore.QObject.connect(self.push_chemin_archives,QtCore.SIGNAL("clicked()"),self.clicked_archives)
QtCore.QObject.connect(self.con_ip,QtCore.SIGNAL("cursorPositionChanged(int,int)"),self.test)
QtCore.QObject.connect(self.con_buttonBox,QtCore.SIGNAL("rejected()"),self.ferme_fenetre)
QtCore.QObject.connect(self.con_buttonBox,QtCore.SIGNAL("accepted()"),self.enregistrement_param_dans_base_registre)
self.con_buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save)
self.con_ip.setInputMask("000.000.000.000;_")
self.con_port.setInputMask("0000;_")
self.con_protocole.addItem("FTP")
self.con_protocole.addItem("Secure_FTP")
self.con_pass.setEchoMode(2) #password mot de passe
self.chargement()
def clicked_affaires(self):
#mon_nom = self.ma_bdg_chemin = unicode(QtGui.QFileDialog.getSaveFileName(mon_form, _fromUtf8("Chemin des affaires"), '/pyth'))
reponse = unicode(QtGui.QFileDialog.getExistingDirectory(MainWindow, "Chemin des affaires",self.con_chemin_affaires.text(), QtGui.QFileDialog.ShowDirsOnly))
if reponse != "":
self.con_chemin_affaires.setText(reponse)
def clicked_archives(self):
reponse = unicode(QtGui.QFileDialog.getExistingDirectory(MainWindow, "Chemin des archives",self.con_chemin_archives.text(), QtGui.QFileDialog.ShowDirsOnly))
if reponse != "":
self.con_chemin_archives.setText(reponse)
def chargement(self):
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
reg_con_ip = (mon_setting.value('param_connexion/ip').toString())
reg_con_port = (mon_setting.value('param_connexion/port').toString()) #nesrt à rien pour l'instant
reg_con_protocole = (mon_setting.value('param_connexion/protocole').toString())
reg_con_user = (mon_setting.value('param_connexion/user').toString())
reg_con_pass = (mon_setting.value('param_connexion/pass').toString())
reg_con_base = (mon_setting.value('param_connexion/base').toString())
reg_con_table = (mon_setting.value('param_connexion/table').toString())
reg_con_chemin_affaires = mon_setting.value('chemins/chemin_affaires').toString()
reg_con_chemin_archives = mon_setting.value('chemins/chemin_archives').toString()
self.con_ip.setText(reg_con_ip)
self.con_port.setText(reg_con_port)
num = self.con_protocole.findText(reg_con_protocole)
self.con_protocole.setCurrentIndex(num)
self.con_user.setText(reg_con_user)
self.con_pass.setText(reg_con_pass)
self.con_base.setText(reg_con_base)
self.con_table.setText(reg_con_table)
self.con_chemin_affaires.setText(reg_con_chemin_affaires)
self.con_chemin_archives.setText(reg_con_chemin_archives)
self.con_chemin_affaires.setToolTip("Linux et mac: du type /media/echogre1/Affaires
Windows du type \\\\Sme\echogre1\Affaires
-->Affaires_en_cours
-->Concours") #hover bulle survol
self.con_chemin_archives.setToolTip("Linux et mac: du type /media/echogre1/Archives
Windows du type \\\\Sme\echogre1\Archives
Affaires
-->Affaires_archivees
-->Concours_perdus") #hover bulle survol
except:
fefe = 2
def test(self):
if GLOBAL_mode_debuggage == 'oui': print "youpudede"
def enregistrement_param_dans_base_registre(self):
if GLOBAL_mode_debuggage == 'oui': print "enregistrement_param_dans_base_registre"
#http://www.siteduzero.com/informatique/tutoriels/enregistrer-vos-options-avec-qsettings/creer-un-fichier-d-options
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
mon_setting.setValue('param_connexion/ip', unicode(self.con_ip.text()))
mon_setting.setValue('param_connexion/port', unicode(self.con_port.text()))
mon_setting.setValue('param_connexion/protocole', unicode(self.con_protocole.currentText()))
mon_setting.setValue('param_connexion/user', unicode(self.con_user.text()))
mon_setting.setValue('param_connexion/pass', unicode(self.con_pass.text()))
mon_setting.setValue('param_connexion/base', unicode(self.con_base.text()))
mon_setting.setValue('param_connexion/table', unicode(self.con_table.text()))
mon_setting.setValue('chemins/chemin_affaires', unicode(self.con_chemin_affaires.text()))
mon_setting.setValue('chemins/chemin_archives', unicode(self.con_chemin_archives.text()))
self.dialog_connection.close() # du coup la fonction close_event détecte également la fermeture et est lancée
texte_titre = "Paramètres de connexion"
msg_total = unicode("Paramètres enregistrés. Vous devez rédémarrer le logiciel", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
class Fenetre_version(Ui_Dialog_version_Qt): #METHODE PARFAITE POUR CREER LES FENETRES !!! YES !!!! #fenetre_version1
#http://snouffy.free.fr/blog-fr/index.php/post/2009/02/18/Qt,-Qt-Designer-et-Python-%3A-d%C3%A9tecter-la-fermeture-de-la-fen%C3%AAtre
#ma_fenetre_connection = QtGui.QDialog(MainWindow) #bien préciser le parent, sinon la fenetre s'ouvre et se referme
#connection = Fenetre_connexion()
#connection.setupUi2(ma_fenetre_connection) #on passe une QDailog ou QMainWindow suivant ce qu'on a créé avec Qt
#ma_fenetre_connection.show()
def ferme_fenetre(self):
self.dialog_connection.close() # du coup la fonction close_event détecte également la fermeture et est lancée
def close_Event(self, event):
if GLOBAL_mode_debuggage == 'oui': print "je ferme les parametres version "
def setupUi2(self,Form):
"""Ajoutons ce qu'il manque à la fenêtre"""
self.dialog_version = Form #promotion: permet de monter d'un cran la fenetre et de l'utiliser ailleurs
self.setupUi(self.dialog_version) #
self.dialog_version.closeEvent = self.close_Event
self.dialog_version.setWindowModality(QtCore.Qt.ApplicationModal) #fenetre modale: non_modal: setWindowModality(QtCore.Qt.NonModal)
self.dialog_version.setWindowTitle("Paramètres de Version")
self.version.setText(GLOBAL_nom_programme+GLOBAL_version_programme+GLOBAL_date_version)
#http://www.developpez.net/forums/d847960/c-cpp/bibliotheques/qt/inserer-image-qt/
exec("mon_image = QtGui.QPixmap(_fromUtf8(os.path.normcase(str('%s%s'))))" % (GLOBAL_chemin_icone, "logo2_trop_grand.png"))
mon_image.scaled(187,189, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation)
self.image.setPixmap(mon_image)
self.image.setScaledContents(True)
self.notes_de_version.setPlainText(unicode(GLOBAL_blabla, 'iso-8859-1'))
#exec("elem.bouche_image1.setPixmap(QtGui.QPixmap('%s/DESS1.bmp'))" % (chemin_icone))
class class_FTP_ou_SFTP():
def FTP_ou_SFTP(self):
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
reg_con_ip = (mon_setting.value('param_connexion/ip').toString())
reg_con_port = (mon_setting.value('param_connexion/port').toString())
reg_con_protocole = (mon_setting.value('param_connexion/protocole').toString())
reg_con_user = (mon_setting.value('param_connexion/user').toString())
reg_con_pass = (mon_setting.value('param_connexion/pass').toString())
reg_con_base = (mon_setting.value('param_connexion/base').toString())
reg_con_table = (mon_setting.value('param_connexion/table').toString())
global mysql_Nom_de_table
mysql_Nom_de_table = str(reg_con_table)
if GLOBAL_mode_debuggage == 'oui': print "reg_con_protocole"
if GLOBAL_mode_debuggage == 'oui': print reg_con_protocole
if reg_con_protocole == "FTP":
if GLOBAL_mode_debuggage == 'oui': print "connexion FTP"
#reg_con_ip = '195.144.11.16'
#reg_con_user = 'echologos7'
#reg_con_pass = '4jsk3b87j6333i'
#reg_con_base = 'echologos7'
#id=MySQLdb.connect(host=reg_con_ip, user=reg_con_user, passwd=reg_con_pass, db=reg_con_base)
#mon_ftp = class_FTP_ou_SFTP() \ id=mon_ftp.FTP_ou_SFTP()
#if GLOBAL_mode_debuggage == 'oui': print "adresse_ip"
#if GLOBAL_mode_debuggage == 'oui': print reg_con_ip
#if GLOBAL_mode_debuggage == 'oui': print "reg_con_user"
#if GLOBAL_mode_debuggage == 'oui': print reg_con_user
#if GLOBAL_mode_debuggage == 'oui': print "reg_con_pass"
#if GLOBAL_mode_debuggage == 'oui': print reg_con_pass
#if GLOBAL_mode_debuggage == 'oui': print "reg_con_base"
#if GLOBAL_mode_debuggage == 'oui': print reg_con_base
exec("id=MySQLdb.connect(host='%s', user='%s', passwd='%s', db='%s')" % (reg_con_ip,reg_con_user,reg_con_pass,reg_con_base))
return id
elif reg_con_protocole == "Secure_FTP":
if GLOBAL_mode_debuggage == 'oui': print "connexion secure FTP"
exec("id=MySQLdb.connect(host='%s', user='%s', passwd='%s', db='%s')" % (reg_con_ip,reg_con_user,reg_con_pass,reg_con_base)) #bug sans bug, connection SFTP à mettre en place
return id
else:
toto = 4/0 #genere erreur
#except MySQLdb.OperationalError,e:
# texte_titre = "Erreur de connection au serveur_"
# msg_debut = "Connexion impossible: \n Vérifier si la connection au serveur de base de données est bien établie \n Fermeture du logiciel"
# QtGui.QApplication.restoreOverrideCursor()
# ma_boite = QtGui.QMessageBox(MainWindow)
# ma_boite.setIcon(QtGui.QMessageBox.Warning)
# ma_boite.setWindowTitle(texte_titre)
# ma_boite.setInformativeText(msg_debut)
# ma_boite.addButton(_fromUtf8("Ok"), 0)
# reponse = ma_boite.exec_()
# mon_form.close()
# sys.exit()
except:
#if GLOBAL_mode_debuggage == 'oui': print "erreur"
#if GLOBAL_mode_debuggage == 'oui': print e
#elif reg_con_protocole == "":
texte_titre = "Paramètres de connexion"
msg_total = unicode("Ceci est votre première connexion ou bien vos paramètres de connexion ne sont pas ou mal renseignés. Vous devez les renseigner puis relancer le logiciel", "iso-8859-1")
QtGui.QApplication.restoreOverrideCursor()
QtGui.QApplication.restoreOverrideCursor() #appel une deuxième fois pour le désactivger totalement
ma_boite = QtGui.QMessageBox(MainWindow)
ma_boite.setIcon(QtGui.QMessageBox.Warning)
ma_boite.setWindowTitle(texte_titre)
ma_boite.setInformativeText(msg_total)
ma_boite.addButton(_fromUtf8("Ok"), 0)
reponse = ma_boite.exec_()
ma_fenetre_connection = QtGui.QDialog(MainWindow)
connection = Fenetre_connexion()
connection.setupUi2(ma_fenetre_connection)
if GLOBAL_mode_debuggage == 'oui': print "zaza42"
ma_fenetre_connection.exec_()
class Fenetre_pre_impression_references(Ui_Dialog_impression_references): #METHODE PARFAITE POUR CREER LES FENETRES !!! YES !!!!
#http://snouffy.free.fr/blog-fr/index.php/post/2009/02/18/Qt,-Qt-Designer-et-Python-%3A-d%C3%A9tecter-la-fermeture-de-la-fen%C3%AAtre
#ma_fenetre_connection = QtGui.QDialog(MainWindow) #bien préciser le parent, sinon la fenetre s'ouvre et se referme
#connection = Fenetre_connexion()
#connection.setupUi2(ma_fenetre_connection) #on passe une QDailog ou QMainWindow suivant ce qu'on a créé avec Qt
#ma_fenetre_connection.show()
def ferme_fenetre(self):
self.Dialog_impression_references.close() # du coup la fonction close_event détecte également la fermeture et est lancée
def close_Event(self, event):
if GLOBAL_mode_debuggage == 'oui': print "je ferme les parametres connexions"
def setupUi_reference(self,Form):
"""Ajoutons ce qu'il manque à la fenêtre"""
self.Dialog_impression_references = Form #promotion: permet de monter d'un cran la fenetre et de l'utiliser ailleurs
self.setupUi(self.Dialog_impression_references) #
self.Dialog_impression_references.closeEvent = self.close_Event
self.Dialog_impression_references.setWindowModality(QtCore.Qt.ApplicationModal) #fenetre modale: non_modal: setWindowModality(QtCore.Qt.NonModal)
self.Dialog_impression_references.setWindowTitle("Impression des références")
#debut status bar
#http://stackoverflow.com/questions/6135514/qt-how-to-implement-qdialog-statusbar
monlayout = QtGui.QVBoxLayout(self.Dialog_impression_references)
monlayout.addWidget(QtGui.QLineEdit())
mon_status = QtGui.QStatusBar()
monlayout.addWidget(mon_status)
#fin status bar bug marche pas
QtCore.QObject.connect(self.Qpush_ref_rechercher,QtCore.SIGNAL('clicked()'),self.rechercher_references)
QtCore.QObject.connect(self.Qpush_ref_imprimer,QtCore.SIGNAL('clicked()'),self.lancer_impression)
QtCore.QObject.connect(self.Qpush_ref_annuler,QtCore.SIGNAL('clicked()'),self.ferme_fenetre)
QtCore.QObject.connect(self.Qpush_cheminODT,QtCore.SIGNAL('clicked()'),self.chemin_fichier_ODT_impression)
#QtCore.QObject.connect(self.tableWidget_reference,QtCore.SIGNAL('currentCellChanged(int,int,int,int)'),self.double_clic_ligne_tableau)
#QtCore.QObject.connect(self.tableWidget_reference,QtCore.SIGNAL('cellDoubleClicked(int,int)'),self.double_clic_ligne_tableau)
#ASTUCE ! ####http://stackoverflow.com/questions/1332110/selecting-qcombobox-in-qtablewidget
self.montant_bas.setValidator(QtGui.QIntValidator(0, 999999999, self.montant_bas))
self.montant_haut.setValidator(QtGui.QIntValidator(0, 999999999, self.montant_haut))
self.montant_bas.setText("0")
self.montant_haut.setText("99999999999999")
self.checkBox_fichierODT.setStatusTip("Cocher la case pour créer d'un fichier ODT contenant toutes les données") #BUG, définir le parent ????
self.Qpush_cheminODT.setStatusTip("Définir le chemin du fichier ODT")
self.remplissage_widgets_references()
def double_clic_ligne_tableau(self, mon_QPoint):
#def double_clic_ligne_tableau(self):
if GLOBAL_mode_debuggage == 'oui': print "double_clic_ligne_tableau youyouy"
if GLOBAL_mode_debuggage == 'oui': print mon_QPoint.x()
if GLOBAL_mode_debuggage == 'oui': print mon_QPoint.y()
ligne = self.tableWidget_reference.indexAt(mon_QPoint).row()
if GLOBAL_mode_debuggage == 'oui': print "ligne du tableau"
if GLOBAL_mode_debuggage == 'oui': print ligne
numero_index = int(self.tableWidget_reference.cellWidget(ligne,9).toPlainText())
if GLOBAL_mode_debuggage == 'oui': print "numero_index"
if GLOBAL_mode_debuggage == 'oui': print numero_index
mon_form.rechercher(numero_index) #on simule une fonction recherche sur le numero de l'index
#self.ferme_fenetre() #on ferme la fenetre d'impression
mon_form.qtableWidget_resultat.setCurrentCell(0,0) #on simule un clic dans la première ligne du tableau pourafficher toutes les vlaeurs dans la zone de roite
mon_form.qtableWidget_resultat.emit(QtCore.SIGNAL("cellClicked(0,0)"))
def lancer_impression(self):
if GLOBAL_mode_debuggage == 'oui': print "impression_references"
try:
self.ferme_fenetre() #on ferme la fenetre d'impression
except:
titi = 2
impression = Imprimer()
impression.references_imprimer_ok()
def chemin_fichier_ODT_impression(self):
global GLOBAL_repertoire_pour_ODT
if GLOBAL_mode_debuggage == 'oui': print "chemin_fichier_ODT_impression"
GLOBAL_repertoire_pour_ODT = unicode(QtGui.QFileDialog.getExistingDirectory(MainWindow, _fromUtf8("Définir le répertoire pour impression ODT:")))
if GLOBAL_mode_debuggage == 'oui': print "repertoire_pour_ODT"
if GLOBAL_mode_debuggage == 'oui': print GLOBAL_repertoire_pour_ODT
def rechercher_references(self):
if GLOBAL_mode_debuggage == 'oui': print "rechercher_references"
#self.montant_bas
#self.montant_haut
#self.QCB_agence
#self.QCB_type_de_ref
#self.QDateEdit_bas
#self.QDateEdit_haut
nom_champ_ref = "`type_de_ref#QLW#QPB#mc#table_type_de_ref#0`"
nom_champ_agence = "`agence#QCB`"
nom_champ_hono = "`montant_hono#QLE`"
nom_champ_date = "`date_rec_travaux#QDE`"
nom_champ_avancement = "`avancement#QCB`"
mon_dictF = {}
mon_dictF["montant_bas"] = unicode(self.montant_bas.text())
mon_dictF["montant_haut"] = unicode(self.montant_haut.text())
mon_dictF["QDateEdit_bas"] = unicode(self.QDateEdit_bas.date().toString(QtCore.Qt.ISODate))
mon_dictF["QDateEdit_haut"] = unicode(self.QDateEdit_haut.date().toString(QtCore.Qt.ISODate))
mon_dictF["avancement_A"] = unicode("étude","iso-8859-1")
mon_dictF["avancement_B"] = unicode("chantier","iso-8859-1")
mon_dictF["avancement_C"] = unicode("affaire archivée","iso-8859-1")
mon_dictF["avancement_D"] = unicode("affaire à archiver","iso-8859-1")
#tri sur champ avancement_A, avancement_B, avancement_C, avancement_D
#étude
#chantier
#affaire archivée
#affaire à archiver
####DEBUT REQUETE
requete = "SELECT * FROM `%s` WHERE ((" % (mysql_Nom_de_table)
g = 0
for elem_agence in self.QCB_agence.selectedItems():
mon_dictF["agence_" + str(g) ] = unicode(elem_agence.text())
requete = requete + nom_champ_agence + " LIKE " + "%(agence_" + str(g) + ")s OR "
g = g+1
requete = requete[:-4]
requete = requete + ") AND ("
g = 0
for elem_ref in self.QCB_type_de_ref.selectedItems(): #bug sur le dernier élemnt sélectionné
mon_dictF["ref_" + str(g) ] = unicode("%") +unicode(elem_ref.text()) + unicode("%")
if GLOBAL_mode_debuggage == 'oui': print "reference"
if GLOBAL_mode_debuggage == 'oui': print mon_dictF["ref_" + str(g) ]
requete = requete + nom_champ_ref + " LIKE " + "%(ref_" + str(g) + ")s OR "
g = g+1
requete = requete[:-4]
requete = requete + ") AND "
requete = requete + nom_champ_hono + ' >= ' + "%(montant_bas)s" + ' AND '
requete = requete + nom_champ_hono + ' <= ' + "%(montant_haut)s" + ' AND '
requete = requete + "(" + nom_champ_avancement + ' LIKE ' + "%(avancement_A)s" + ' OR '
requete = requete + nom_champ_avancement + ' LIKE ' + "%(avancement_B)s" + ' OR '
requete = requete + nom_champ_avancement + ' LIKE ' + "%(avancement_C)s" + ' OR '
requete = requete + nom_champ_avancement + ' LIKE ' + "%(avancement_D)s" + ') AND '
requete = requete + nom_champ_date + ' >= ' + "%(QDateEdit_bas)s" + ' AND '
requete = requete + nom_champ_date + ' <= ' + "%(QDateEdit_haut)s"
requete = requete + ") ORDER BY " + nom_champ_date + " DESC, " + nom_champ_ref + " ASC"
if GLOBAL_mode_debuggage == 'oui': print ""
if GLOBAL_mode_debuggage == 'oui': print "impression dico ref"
if GLOBAL_mode_debuggage == 'oui': print mon_dictF
if GLOBAL_mode_debuggage == 'oui': print "requete"
if GLOBAL_mode_debuggage == 'oui': print unicode(requete).encode("CP850")
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur=id.cursor()
cur.execute(requete, mon_dictF)
resultat = list(cur.fetchall())
cur.close()
id.close()
if GLOBAL_mode_debuggage == 'oui': print "resultat"
if GLOBAL_mode_debuggage == 'oui': print resultat
#inserer la concaténation des valeurs dans "tableWidget_reference"
for num in range(self.tableWidget_reference.rowCount()):
self.tableWidget_reference.removeRow(0)
self.tableWidget_reference.setColumnCount(10)
item = QtGui.QTableWidgetItem()
item.setText("C")
self.tableWidget_reference.setHorizontalHeaderItem(0, item)#rien
self.tableWidget_reference.setColumnWidth(0, 20)
item = QtGui.QTableWidgetItem()
item.setText("Nature de l'opération")
self.tableWidget_reference.setHorizontalHeaderItem(1, item)#rien
self.tableWidget_reference.setColumnWidth(1, 190)
item = QtGui.QTableWidgetItem()
item.setText("Maître d'ouvrage")
self.tableWidget_reference.setHorizontalHeaderItem(2, item)#rien
self.tableWidget_reference.setColumnWidth(2, 190)
item = QtGui.QTableWidgetItem()
item.setText("Type de travaux")
self.tableWidget_reference.setHorizontalHeaderItem(3, item)#rien
self.tableWidget_reference.setColumnWidth(3, 150)
item = QtGui.QTableWidgetItem()
item.setText("Type de mission")
self.tableWidget_reference.setHorizontalHeaderItem(4, item)#rien
self.tableWidget_reference.setColumnWidth(4, 100)
item = QtGui.QTableWidgetItem()
item.setText("Co/Sous Traitant")
self.tableWidget_reference.setHorizontalHeaderItem(5, item)#rien
self.tableWidget_reference.setColumnWidth(5, 100)
item = QtGui.QTableWidgetItem()
item.setText("Importance")
self.tableWidget_reference.setHorizontalHeaderItem(6, item)#rien
self.tableWidget_reference.setColumnWidth(6, 100)
item = QtGui.QTableWidgetItem()
item.setText("Année")
self.tableWidget_reference.setHorizontalHeaderItem(7, item)#rien
self.tableWidget_reference.setColumnWidth(7, 80)
item = QtGui.QTableWidgetItem()
item.setText("Montant hono")
self.tableWidget_reference.setHorizontalHeaderItem(8, item)#rien
self.tableWidget_reference.setColumnWidth(8, 100)
item = QtGui.QTableWidgetItem()
item.setText("Num Index")
self.tableWidget_reference.setHorizontalHeaderItem(9, item)#rien
self.tableWidget_reference.setColumnWidth(9, 80)
for ligne in range(len(resultat)):
self.tableWidget_reference.insertRow(self.tableWidget_reference.rowCount())
self.tableWidget_reference.setRowHeight(self.tableWidget_reference.rowCount()-1,70)
mon_checkBox = QtGui.QCheckBox()
mon_checkBox.setChecked(True)
self.tableWidget_reference.setCellWidget(ligne,0,mon_checkBox)
archi = resultat[ligne][18]
text_nature = (resultat[ligne][2]) + " " + (resultat[ligne][3]) + " (" + (resultat[ligne][4]) + ") .Arch.: " +\
(archi.upper()) + "." +(resultat[ligne][19]) + " " + (resultat[ligne][20]) #upper: met en majuscule (lower minuscule)
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
mon_label.setText(text_nature)
self.tableWidget_reference.setCellWidget(ligne,1,mon_label)
#MOA
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
text_MOA = resultat[ligne][6]
mon_label.setText(text_MOA)
self.tableWidget_reference.setCellWidget(ligne,2,mon_label)
#type_tvx
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
text_MOA = resultat[ligne][29]
mon_label.setText(text_MOA)
self.tableWidget_reference.setCellWidget(ligne,3,mon_label)
#type_mission
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
type_mission = resultat[ligne][23]
type_mission_nettoyage = type_mission.replace('##','-')
type_mission_nettoyage = type_mission_nettoyage.replace('A - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('B - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('C - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('D - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('E - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('F - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('G - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('H - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('I - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('J - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('K - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('L - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('M - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('N - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('O - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('P - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('Q - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('R - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('S - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('T - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('U - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('V - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('W - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('X - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('Y - ','')
type_mission_nettoyage = type_mission_nettoyage.replace('Z - ','')
mon_label.setText(type_mission_nettoyage)
mon_label.setText(type_mission_nettoyage)
self.tableWidget_reference.setCellWidget(ligne,4,mon_label)
#co sous traitant
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
text_MOA = resultat[ligne][5]
mon_label.setText(text_MOA)
self.tableWidget_reference.setCellWidget(ligne,5,mon_label)
#Montant - importance des travaux
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
Montant = resultat[ligne][9]
surface_tvx = resultat[ligne][10]
if GLOBAL_mode_debuggage == 'oui': print "montant"
if GLOBAL_mode_debuggage == 'oui': print Montant
if Montant <= 999:
pre_text = QtCore.QString(str(Montant) + " k%1").arg(QtCore.QChar(8364)) #euro signe
elif Montant > 999:
pre_text = QtCore.QString(str(float(Montant)/1000) + " M%1").arg(QtCore.QChar(8364))#euro signe
if Montant == 0.0 or Montant == "" or Montant == "0.0":
pre_text = "-"
pre_text = pre_text.replace('.',',')
if surface_tvx == 0.0 or surface_tvx == "" or surface_tvx == "0.0":
dede = 2
else:
pre_text = pre_text + '\n' + str(surface_tvx)
#pre_text = QtCore.QString(pre_text + " m%1 (SHON)").arg(QtCore.QChar()) #m² carré
pre_text = QtCore.QString(pre_text + unicode(" m² (SHON)", "iso-8859-1"))
mon_label.setText(pre_text)
#msg_3 = unicode("\na bien été ajoutée", "iso-8859-1")
self.tableWidget_reference.setCellWidget(ligne,6,mon_label)
##Annee reception
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
date = resultat[ligne][13]
avancement = resultat[ligne][15]
if GLOBAL_mode_debuggage == 'oui': print "Avancement resultat[ligne][15]"
if GLOBAL_mode_debuggage == 'oui': print resultat[ligne][15]
if resultat[ligne][15] == "étude" or resultat[ligne][15] == "chantier":
text = "En cours"
elif resultat[ligne][15] == "affaire archivée" or resultat[ligne][15] == "affaire à archiver":
text = str(date.year)
else:
text = "pas de DROC"
mon_label.setText(text)
self.tableWidget_reference.setCellWidget(ligne,7,mon_label)
#Montant_hono
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
Montant_hono = resultat[ligne][24]
if Montant_hono == 0.0 or Montant_hono == "" or Montant_hono == "0.0" or Montant_hono == 0 or Montant_hono == "0":
mon_label.setText("-")
else:
mon_label.setText(QtCore.QString(str(Montant_hono) + " %1").arg(QtCore.QChar(8364))) #euro signe
#mon_label.setText(str(Montant_hono) + " " + (QtCore.QChar(8364)).toLatin1())
#mon_label.setText(QtCore.QString("Hello, %1 world").arg(QtCore.QChar(8364))) #euro signe
self.tableWidget_reference.setCellWidget(ligne,8,mon_label)
#num_index
mon_label = QTextEdit_boost()
QtCore.QObject.connect(mon_label,QtCore.SIGNAL("mon_cellDoubleclicked(QPoint*)"),self.double_clic_ligne_tableau)
num_index = resultat[ligne][0]
mon_label.setText(str(num_index))
self.tableWidget_reference.setCellWidget(ligne,9,mon_label)
# self.tableWidget_reference.setWordWrap(True)
def remplissage_widgets_references(self):
if GLOBAL_mode_debuggage == 'oui': print "remplissage_widgets_references"
mon_ftp = class_FTP_ou_SFTP()
id=mon_ftp.FTP_ou_SFTP()
cur2=id.cursor()
cur2.execute("SELECT * FROM table_type_de_ref")
resultat_type_de_ref = list(cur2.fetchall())
cur2.close()
id.close()
if GLOBAL_mode_debuggage == 'oui': print type(self.QCB_type_de_ref)
self.QCB_type_de_ref.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.QCB_type_de_ref.setMinimumSize(QtCore.QSize(100, 80))
self.QCB_type_de_ref.setMaximumSize(QtCore.QSize(5000, 80))
self.QCB_type_de_ref.clear()
for elem in resultat_type_de_ref:
#if GLOBAL_mode_debuggage == 'oui': print "elem"
#if GLOBAL_mode_debuggage == 'oui': print elem
self.QCB_type_de_ref.addItem(elem[0])
#GLOBAL_mon_tuple_de_tuple_des_configs
#if GLOBAL_mode_debuggage == 'oui': print GLOBAL_mon_tuple_de_tuple_ORIGINAL
for num in range(len(GLOBAL_mon_tuple_de_tuple_ORIGINAL)):
if GLOBAL_mode_debuggage == 'oui': print GLOBAL_mon_tuple_de_tuple_ORIGINAL[num]
if GLOBAL_mon_tuple_de_tuple_ORIGINAL[num][0] == "agence#QCB":
ligne_agence = GLOBAL_mon_tuple_de_tuple_ORIGINAL[num][5]
premier_split = ligne_agence.split('#')
second_split = premier_split[0].split('#-#')
self.QCB_agence.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
self.QCB_agence.setMinimumSize(QtCore.QSize(100, 80))
self.QCB_agence.setMaximumSize(QtCore.QSize(5000, 80))
self.QCB_agence.clear()
for num_agence in range(1,len(second_split)):
self.QCB_agence.addItem(second_split[num_agence])
#date bas et haut
date = QtCore.QDate()
date_du_jour = date.currentDate()
date_500_ans = QtCore.QDate()
#date_500_ans.setDate(01,01,(date_du_jour.addYears(-500)).year())
date_500_ans.setDate(1800,01,01)
self.QDateEdit_haut.setDate(date_du_jour)
self.QDateEdit_bas.setDate(date_500_ans)
class Imprimer():
def references_imprimer_ok(self, repertoire_ODT = "non"):
#self.option_impression.hide()
#http://qt.developpez.com/doc/4.7/if GLOBAL_mode_debuggage == 'oui': printing/
printer = QtGui.QPrinter()
printer.setPageMargins(10,10,10,10,0) #0 pour unité millimetre
document=QtGui.QTextDocument()
dialog = QtGui.QPrintDialog(printer)
#dialog.setModal(True)
dialog.setWindowModality(QtCore.Qt.ApplicationModal)
dialog.setWindowTitle("Coucou titre" )
mon_logo = "logo_grenoble.png" #BUG pour clermont : "logo_clermont.png"
"""
if GLOBAL_mode_debuggage == 'oui': print "mon_dialog_pre_imprim"
if GLOBAL_mode_debuggage == 'oui': print mon_dialog_pre_imprim
if GLOBAL_mode_debuggage == 'oui': print type(mon_dialog_pre_imprim)
if GLOBAL_mode_debuggage == 'oui': print mon_dialog_pre_imprim.children()
list_children = mon_dialog_pre_imprim.children()
for elem in list_children:
if GLOBAL_mode_debuggage == 'oui': print elem.objectName()
"""
list_type_de_ref = mon_dialog_pre_imprim.findChild(QtGui.QListWidget,"QCB_type_de_ref").selectedItems()
############################################################
#on crée un curseur a l'endroit du curseur actuel
cursor = QtGui.QTextCursor(document)
###en tête ECHOLOGOS AUVERGNE ou GRENOBLE
mon_image1 = QtGui.QTextImageFormat()
#exec("mon_image1.setName(_fromUtf8('%s%s'))") % (chemin_icone, "/listen.png")
exec("mon_image1.setName(_fromUtf8(_fromUtf8(os.path.normcase(str('%s%s')))))") % (GLOBAL_chemin_icone, mon_logo)
mon_image1.setWidth(400)
mon_image1.setHeight(100)
format0 = QtGui.QTextCharFormat()
format0.setFontPointSize(10)
format1 = QtGui.QTextCharFormat()
format1.setFontPointSize(10)
format1.setFontItalic(True)
cursor.insertImage(mon_image1)
cursor.insertText("\n")
for elem in list_type_de_ref:
mon_blockformat = cursor.blockFormat()
mon_alignement = QtCore.Qt.AlignLeft
mon_blockformat.setAlignment(mon_alignement)
cursor.setBlockFormat(mon_blockformat)
cursor.insertText(elem.text(),format1)
cursor.insertText(" - ",format1)
cursor.movePosition(cursor.Left, cursor.KeepAnchor, 2) #je bouge 2 fois sans bouger l'ancre
cursor.removeSelectedText #on effeace
cursor.insertText("\n")
#http://www.unixgarden.com/index.php/gnu-linux-magazine/qt-4-4-textes-enrichis-et-documents-structures
#http://pyqt.sourceforge.net/Docs/PyQt4/qtextcursor.html#MoveOperation-enum
mon_blockformat = cursor.blockFormat()
mon_alignement = QtCore.Qt.AlignRight
mon_blockformat.setAlignment(mon_alignement)
cursor.setBlockFormat(mon_blockformat)
cursor.insertText("D'autres références sur www.echologos.fr",format1)
cursor.insertText("\n")
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat = cursor.blockFormat()
mon_alignement = QtCore.Qt.AlignHCenter
mon_blockformat.setAlignment(mon_alignement)
cursor.setBlockFormat(mon_blockformat)
cursor.insertText("Rôle tenu par le candidat : BET acoustique",format1)
cursor.insertText("\n")
#### FIN ENTETE ECHOLOGOS
################## TABLEAU #########"
#retourne le nom du tab puis on numéro (on passe par l'index sinon, ça plante lorsqu'on supprime des circuits):
cursor.movePosition(cursor.End)
#on crée un block pour le tableau
cursor.beginEditBlock()
#Creation du format du tableau qui sera imprimer
tableFormat = QtGui.QTextTableFormat()
tableFormat.setAlignment(QtCore.Qt.AlignHCenter)
#tableFormat.setAlignment(QtCore.Qt.AlignLeft)
tableFormat.setBackground(QtGui.QColor("#ffffff")) #blanc
tableFormat.setCellPadding(5)
tableFormat.setCellSpacing(0)
#tableFormat.setWidth(2000)
#tableFormat.setLeftMargin(10) #marge dans le browser, grrrr
#tableFormat.setRightMargin(10) #marge dans le browser, grrrr
#Mise en page des colonnes du super tableau des références
mon_list_de_QTextLength = []
mon_list_de_QTextLength.append(QtGui.QTextLength(2,22)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,22)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,10)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,14)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,8)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,9)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,6)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
mon_list_de_QTextLength.append(QtGui.QTextLength(2,9)) #type, largeur type: 0:variable ,1:fixe ,2:percentage
tableFormat.setColumnWidthConstraints(mon_list_de_QTextLength)
#tableFormat.setPageBreakPolicy(tableFormat.PageBreak_AlwaysAfter) #page break - saut de page!!!! vis à vis du tableu: on lui indique d'insérer un saut de page toujours après le tableau!!
tableFormat.setPageBreakPolicy(tableFormat.PageBreak_Auto)
#Creation du tableau qui sera imprimé avec le nombre de colonne
#et de ligne que contient le tableau mis en parametre
#exec("ui.tableWidget%s = QtGui.QTableWidget(ui.tab%s)" % (numero_circuit, numero_circuit))
#QTextTable * tableau = cursor.insertTable(tableau_a_imprimer->rowCount()+1, tableau_a_imprimer->columnCount(), tableFormat);
nb_ligne = mon_dialog_pre_imprim.findChild(QtGui.QTableWidget,"tableWidget_reference").rowCount()
if GLOBAL_mode_debuggage == 'oui': print "nb_ligne"
if GLOBAL_mode_debuggage == 'oui': print type(nb_ligne)
if GLOBAL_mode_debuggage == 'oui': print nb_ligne
nb_colonne = 8
#tableFormat.setPageBreakPolicy(tableFormat.PageBreak_Auto)
tableau = cursor.insertTable(1, nb_colonne, tableFormat) #ici, tableau est un QTextTable
frame = cursor.currentFrame()
frameFormat = frame.frameFormat()
frameFormat.setBorder(0)
frame.setFrameFormat(frameFormat)
#Format des HEADER du tableau
format_entete_tableau = QtGui.QTextCharFormat()
format_entete_tableau.setFontPointSize(13)
mon_QFont = QtGui.QFont()
mon_QFont.setWeight(99) # gras ou moins gras
format_entete_tableau.setFont(mon_QFont)
format_entete_tableau.setFontItalic(True)
#format_entete_tableau.setFontWeight(QFont::Bold);
#on ecrit les HEADERS du tableaux CIRCUIT dans le tableau a imprimer
Header = 1
if Header == 1:
list_text = []
list_text.append("Nature de l'opération")
list_text.append("Maître d'ouvrage")
list_text.append("Type de travaux (neuf, extension, réhabilitation")
list_text.append("Type de mission de maîtrise d'oeuvre")
list_text.append("Co/Sous Traitant")
list_text.append("Importance (montant H.T. des travaux et/ou surface)")
list_text.append("Année")
list_text.append("Montant H.T. des honoraires")
for col in range(nb_colonne):
#http://pyqt.sourceforge.net/Docs/PyQt4/qtexttablecellformat.html#details
cellule = tableau.cellAt(0,col) #cellule
cellCursor = cellule.firstCursorPosition() #cellCursor est un QTextCursor
mon_blockformat = cellCursor.blockFormat()
mon_alignement = QtCore.Qt.AlignHCenter
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat.setAlignment(mon_alignement)
cellCursor.setBlockFormat(mon_blockformat)
cellCursor.insertText(unicode(list_text[col], "iso-8859-1"),format_entete_tableau)
#impression des données CIRCUIT dans le tableau
cursor.insertText("\n")
lignes_a_supprimer = []
for row in range(1,(nb_ligne+1)):
tableau.insertRows(row,1)
for col in range(nb_colonne):
#http://pyqt.sourceforge.net/Docs/PyQt4/qtexttablecellformat.html#details
cell = tableau.cellAt(row,col) #cellule est un QTextTableCell
#cell.setLeftPadding(0) #marche pas
cellCursor = cell.firstCursorPosition()
exec("mon_widget = mon_dialog_pre_imprim.findChild(QtGui.QTableWidget,'tableWidget_reference').cellWidget(%s,%s)" % (row-1,col+1))
if GLOBAL_mode_debuggage == 'oui': print "mon_widget"
if GLOBAL_mode_debuggage == 'oui': print type(mon_widget)
if GLOBAL_mode_debuggage == 'oui': print mon_widget
mon_blockformat = cellCursor.blockFormat()
if col >= 2:
mon_alignement = QtCore.Qt.AlignHCenter
else:
mon_alignement = QtCore.Qt.AlignLeft
#http://pyqt.sourceforge.net/Docs/PyQt4/qt.html#AlignmentFlag-enum
mon_blockformat.setAlignment(mon_alignement)
cellCursor.setBlockFormat(mon_blockformat)
cellCursor.insertText(mon_widget.toPlainText())
#doudouille
#http://stackoverflow.com/questions/5187484/how-to-center-text-in-qtexttable
exec("mon_case_coche = mon_dialog_pre_imprim.findChild(QtGui.QTableWidget,'tableWidget_reference').cellWidget(%s,0)" % (row-1))
if GLOBAL_mode_debuggage == 'oui': print "mon_case_coche"
if GLOBAL_mode_debuggage == 'oui': print type(mon_case_coche)
if GLOBAL_mode_debuggage == 'oui': print mon_case_coche
if mon_case_coche.isChecked() == False:
lignes_a_supprimer.append(row)
if GLOBAL_mode_debuggage == 'oui': print "lignes_a_supprimer"
if GLOBAL_mode_debuggage == 'oui': print lignes_a_supprimer
lignes_a_supprimer.reverse()
for num in range(len(lignes_a_supprimer)):
#if GLOBAL_mode_debuggage == 'oui': print elem
tableau.removeRows(lignes_a_supprimer[num]+1,1)
#fin de l'edition
cursor.endEditBlock()
cursor.movePosition(cursor.End)
cursor.insertText("Ces références sont présentées suivant le modèle préconisé par la Mission Interministérielle pour la Qualité des Constructions Publiques (MIQCP).",format1)
############################################################
############################################################
############################################################
######## DEBUT CREATION fichier ODT ##############
if mon_dialog_pre_imprim.findChild(QtGui.QCheckBox,'checkBox_fichierODT').isChecked() == True:
#impression au format ouvert ODF ODT
chemin_complet = os.path.join(GLOBAL_repertoire_pour_ODT, unicode("tableau_des_references_MIQCP.odt")) #concatène le chemin
if GLOBAL_mode_debuggage == 'oui': print "chemin_complet ODT"
if GLOBAL_mode_debuggage == 'oui': print chemin_complet
mon_writer = QtGui.QTextDocumentWriter(chemin_complet)
mon_writer.setFormat("odf")
mon_writer.write(document)
######## FIN CREATION fichier ODT ##############
if dialog.exec_() == True:
printer.setOrientation(QtGui.QPrinter.Landscape) #grosse astuce, il faut définir l'orienttaion après que la fenetre de config soit fermée, sinon, ça prend en compte le paramètre de config impirmante de base
#impression de notre editor dans le QPrinter initialisé au début de la fonction
document.print_(printer)
print "printer.copyCount()"
printer.copyCount()
mon_dialog_pre_imprim.close()
def references_imprimer_ok_sert_a_rien_avec_Qpainter(self):
#http://zetcode.com/tutorials/pyqt4/drawing/
monwidget = mon_form.qtableWidget_resultat
printer_device = QtGui.QPrinter()
painter = QtGui.QPainter(printer_device)
#printer_device = QtGui.QPaintDevice()
painter.begin(printer_device)
xscale = printer_device.pageRect().width()/(monwidget.width())
yscale = printer_device.pageRect().height()/(monwidget.height())
scale = min(xscale,yscale)
painter.translate(printer_device.paperRect().x() + printer_device.pageRect().width()/2, printer_device.paperRect().y() + printer_device.pageRect().height()/2)
painter.scale(scale, scale)
#painter.translate(-width()/2, -height()/2)
monwidget.render(painter)
painter.end()
"""
QPainter painter;
painter.begin(&printer);
double xscale = printer.pageRect().width()/double(myWidget->width());
double yscale = printer.pageRect().height()/double(myWidget->height());
double scale = qMin(xscale, yscale);
painter.translate(printer.paperRect().x() + printer.pageRect().width()/2,
printer.paperRect().y() + printer.pageRect().height()/2);
painter.scale(scale, scale);
painter.translate(-width()/2, -height()/2);
myWidget->render(&painter);
"""
#http://python.developpez.com/faq/?page=Generalites#GenExecuteFile
from asyncore import dispatcher #module pour la classe serveur
import sys, time, socket #module pour la classe serveur
#http://venom630.free.fr/geo/tutz/programmation/python/sockets/
class Server( dispatcher ): #creation d'un mini serveur qui emp^che l'éxécution multiple: http://python.developpez.com/faq/?page=Generalites
def __init__(self):
dispatcher.__init__(self)
self.create_socket( socket.AF_INET, socket.SOCK_STREAM )
self.bind(('', 50010 ) ) #en cas de creation d'autre programme, il faut changer ce numéro de port qui est crée et existe tant que "la_base_des_programmes" fonctionne
self.listen(1) #accepte une seule connection à la fois
try:
Server()
if __name__ == "__main__":
import sys
#"infos systeme"
chemin_fichier_courant = sys.argv[0]
#fenetre principale
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
mon_form = Ui_MainWindow_surclasse() # Ton interface,
mon_form.setupUi2(MainWindow) # il la lance
if GLOBAL_mode_debuggage == 'oui': print "zaza43"
#MainWindow.setMaximumSize(800,600)
#logo
exec("MainWindow.setWindowTitle(_fromUtf8('%s_%s'))" % (GLOBAL_nom_programme, GLOBAL_version_programme))
exec("MainWindow.setWindowIcon(QtGui.QIcon(_fromUtf8(os.path.normcase(str('%s%s')))))" % (GLOBAL_chemin_icone, "logo2.png"))
if GLOBAL_mode_debuggage == 'oui': print "zaza48"
try:
mon_setting = QtCore.QSettings("Echologos", "Basaffaire")
dimension_mainwindow = mon_setting.value('visuel/dimension_main_window')
MainWindow.restoreGeometry(dimension_mainwindow.toByteArray())
except:
titi =2
if GLOBAL_mode_debuggage == 'oui': print "zaza49"
if dimension_mainwindow.toByteArray() == "":
MainWindow.setGeometry(100,100,200,200) #évite le bug de compilation sur pyinstaller casse tete marco 5h!!!
MainWindow.show() # On affiche l'interface
if GLOBAL_mode_debuggage == 'oui': print "zaza50"
from PyQt4.QtCore import QT_VERSION_STR
from PyQt4.pyqtconfig import Configuration
if GLOBAL_mode_debuggage == 'oui': print "infos systeme"
if GLOBAL_mode_debuggage == 'oui': print("Qt version:", QT_VERSION_STR)
cfg = Configuration()
if GLOBAL_mode_debuggage == 'oui': print("SIP version:", cfg.sip_version_str)
if GLOBAL_mode_debuggage == 'oui': print("PyQt version:", cfg.pyqt_version_str)
if GLOBAL_mode_debuggage == 'oui': print ("version de python:", sys.version_info)
sys.exit(app.exec_())
except(e):
if GLOBAL_mode_debuggage == 'oui': print 'Un programme deja en service, impossible de lancer un deuxieme'
if GLOBAL_mode_debuggage == 'oui': print e
sys.exit()
##################################### BASE MYSQL - debut ##################################"
"""
Nouvelle Base 2013
Hôte de connexion (HOST) : cl1-sql7
Nom d'utilisateur (LOGIN) : echologos7
Mot de passe (PASSWORD) : 4jsk3b87j6333i
Nom de BASE : echologos7
"""
###Nom de table: "base_des_affaires1"
"""
codage en UTF8_unicode_ci
1 index cle primaire avec auto incrément
2 affaire#QLE - NE JAMAIS MODIFIER CE CHAMP VARCHAR QlineEdit Affaire
3 intitule#QTE TEXT QtextEdit Intitulé opération
4 commune#QLE VARCHAR QlineEdit Commune affaire
5 dpt_affaire#QCB#QPB#sc#departement VARCHAR QComboBox Département affaire
6 co_sous_trait#QCB VARCHAR QComboBox Sous trait#-#Co-traitant#-#Sous-Traitant#-#Client direc
7 maitre_ouvrage#QLE VARCHAR QlineEdit Maître d'ouvrage
8 coord_maitre_ouvrage#QTE TEXT QtextEdit Coordonnées MOA
9 montant#QLE INT QlineEdit Montant travaux
10 surface#QLE VARCHAR QlineEdit Surface travaux
11 adresse_chantier#QTE TEXT QtextEdit Adresse chantier
12 DROC#QDE DATE QDateEdit ?? Date de la DROC
13 date_rec_travaux#QDE DATE QDateEdit ?? Date réception tvx
14 num_boite_archive#QLE INT QlineEdit Num boite archive
15 avancement#QCB VARCHAR QComboBox Avancement#-#Concours:#-#étude#-#chantier#-#à archiver#-#archive#-#sans suite#-#concours perdu#-#expertis
16 date_pouvoir#QDE DATE QDateEdit Date d'envoi pouvoir
17 charge_affaire#QCB#QPB#sc#table_personnel#papa VARCHAR QComboBox Chargé d'affaires
18 donneur_ordre#QCB#QPB#sc#table_archis VARCHAR QlineEdit Donneur d'ordre
19 responsable_donneur_ordre#QLE VARCHAR QlineEdit Responsable DO
20 commentaires#QTE TEXT Qtextedit Commentaires
21 mission#QLW#QPB#mc#table_type_de_mission#papa VARCHAR QLineEdit Missions
22 montant_hono#QLE INT QLineEdit Montant honoraires
23 prochaine_echeance#QDE DATE QDateEdit Date future échéance
24 type_echeance#QCB VARCHAR QComboBox Type d'échéance#-#concours#-#APS#-#APD#-#PRO#-#PRO/DCE#-#DCE#-#VISA#-#EXE#-#CHANTIER#-#Rapport d'étude#-#Note acoustique#-#Note divers
25 type_de_ref#QLW#QPB#mc#table_type_de_ref#papa VARCHAR QListWidget Type de référence
26 mesures#QLW#QPB#mc#table_type_de_mesures#papa VARCHAR QListWidget Type de référence
27 type_de_travaux#QCB VARCHAR QComboBox Type de travaux:#-#concours#-#APS#-#APD#-#PRO#-#PRO/DCE#-#DCE#-#VISA#-#EXE#-#CHANTIER#-#Rapport d'étude#-#Note acoustique#-#Note divers
# les QLW QListWidget et les QCB peuvent être reliées à des tables Mysql: le 3ème split # représente le num de colonne à parser dans la table
#
# le mot de passe est est tout à la fin de la ligne des QLW
"""
###Nom de table: "preferences_utilisateurs"
"""
codage en UTF8_unicode_ci
1 nom_utilisateur VARCHAR
2 ordre_parametres_de_tri VARCHAR
3 ordre_col_tableau_resultat VARCHAR
4 ordre_zone_scroll_area VARCHAR
"""
##################################### CHAMPS DE LA BASE MYSQL - fin ##################################"