def MAJ(self): cochesPrecedents = self.GetCoches() self.DeleteAllItems() self.root = self.AddRoot(_(u"Données")) # Fichiers locaux listeFichiersLocaux = self.GetListeFichiersLocaux() if len(listeFichiersLocaux) > 0 and self.parent.check_locaux.GetValue() == True : brancheType = self.AppendItem(self.root, _(u"Fichiers locaux"), ct_type=1) self.SetPyData(brancheType, _(u"locaux")) self.SetItemBold(brancheType) for nomFichier in listeFichiersLocaux : brancheNom = self.AppendItem(brancheType, nomFichier, ct_type=1) self.SetPyData(brancheNom, nomFichier) for nomCategorie, codeCategorie in LISTE_CATEGORIES : fichier = u"%s_%s.dat" % (nomFichier, codeCategorie) brancheFichier = self.AppendItem(brancheNom, nomCategorie, ct_type=1) self.SetPyData(brancheFichier, fichier) if os.path.isfile(UTILS_Fichiers.GetRepData(fichier)) == False : brancheFichier.Enable(False) # Fichiers réseaux listeFichiersReseau, listeBases = self.GetListeFichiersReseau() if len(listeFichiersReseau) > 0 and self.parent.check_reseau.GetValue() == True : brancheType = self.AppendItem(self.root, _(u"Fichiers réseau"), ct_type=1) self.SetPyData(brancheType, _(u"reseau")) self.SetItemBold(brancheType) for nomFichier in listeFichiersReseau : brancheNom = self.AppendItem(brancheType, nomFichier, ct_type=1) self.SetPyData(brancheNom, nomFichier) for nomCategorie, codeCategorie in LISTE_CATEGORIES : fichier = u"%s_%s" % (nomFichier, codeCategorie.lower()) brancheFichier = self.AppendItem(brancheNom, nomCategorie, ct_type=1) self.SetPyData(brancheFichier, fichier) if fichier not in listeBases : brancheFichier.Enable(False) # Modèles de documents brancheType = self.AppendItem(self.root, _(u"Modèles de documents"), ct_type=1) self.SetPyData(brancheType, _(u"modeles")) self.SetItemBold(brancheType) # Editions de documents brancheType = self.AppendItem(self.root, _(u"Editions de documents"), ct_type=1) self.SetPyData(brancheType, _(u"editions")) self.SetItemBold(brancheType) self.ExpandAll() # Rétablit les coches précédents if len(cochesPrecedents) > 0 : self.SetCoches(cochesPrecedents) self.AfficheNbreElements()
def ModifierFichier(self, titre=""): """ Modifier un fichier """ if UTILS_Utilisateurs.VerificationDroitsUtilisateurActuel("fichier_fichier", "modifier") == False : return if self.mode == "reseau" : dlg = wx.MessageDialog(self, _(u"Il est impossible de modifier le nom d'un fichier réseau !"), _(u"Désolé"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Demande de confirmation 1 dlg = wx.MessageDialog(None, _(u"Souhaitez-vous vraiment modifier le nom du fichier '%s' ?") % titre, _(u"Modifier un fichier"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_QUESTION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return # Demande le nouveau nom du fichier dlg = wx.TextEntryDialog(self, _(u"Saisissez un nouveau nom pour le fichier '%s' :") % titre, _(u"Modifier le nom"), titre) if dlg.ShowModal() == wx.ID_OK: nouveauTitre = dlg.GetValue() dlg.Destroy() else : dlg.Destroy() return if nouveauTitre == "" : dlg = wx.MessageDialog(self, _(u"Le nom que vous avez saisi ne semble pas valide !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return # Demande de confirmation 2 dlg = wx.MessageDialog(None, _(u"Vous êtes vraiment sûr de vouloir changer le nom du fichier '%s' en '%s' ?") % (titre, nouveauTitre), _(u"Modifier un fichier"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return # Modifier un fichier local for suffixe in ("DATA", "DOCUMENTS", "PHOTOS") : try : source = UTILS_Fichiers.GetRepData(u"%s_%s.dat" % (titre, suffixe)) destination = UTILS_Fichiers.GetRepData(u"%s_%s.dat" % (nouveauTitre, suffixe)) os.rename(source, destination) except Exception, err : print suffixe, "Erreur dans le renommage de fichier : ", err
def GetListeFichiersLocal(self) : """ Récupère la liste des fichiers locaux à afficher """ # Lit le répertoire chemin = UTILS_Fichiers.GetRepData() fichiers = os.listdir(chemin) fichiers.sort() listeFichiers = [] for fichier in fichiers : nomFichier = os.path.split(fichier)[1] titre = nomFichier[:-9] cheminFichier = chemin + "/" + fichier if (self.prefixe == None and nomFichier.endswith("_DATA.dat")) or (self.prefixe != None and nomFichier.endswith("_DATA.dat") and nomFichier.startswith(self.prefixe)) : # Taille des 3 bases de données taille = 0 for suffixe in ("DATA", "DOCUMENTS", "PHOTOS") : fichierTemp = u"%s/%s_%s.dat" % (chemin, titre, suffixe) if os.path.isfile(fichierTemp) : taille += os.path.getsize(fichierTemp) taille = FormatFileSize(taille) # Date dernière modification t = os.path.getmtime(cheminFichier) date = datetime.datetime.fromtimestamp(t) dateModif = date.strftime("%d/%m/%Y %H:%M") # Ouverture de la base de données pour récupérer les infos sur le fichier logo = None description = u"" try : connexion = sqlite3.connect(cheminFichier.encode('utf-8')) cursor = connexion.cursor() req = "SELECT nom, logo FROM organisateur WHERE IDorganisateur=1;" cursor.execute(req) description, logo = cursor.fetchone() connexion.close() except : pass if logo != None : try : io = cStringIO.StringIO(logo) if 'phoenix' in wx.PlatformInfo: img = wx.Image(io, wx.BITMAP_TYPE_ANY) else : img = wx.ImageFromStream(io, wx.BITMAP_TYPE_ANY) img = RecadreImg(img) image = img.ConvertToBitmap() except : image = None else : image = None # Mémorisation listeFichiers.append({"titre" : titre, "image" : image, "description" : description, "taille" : taille, "dateModif" : dateModif}) return listeFichiers
def ConversionReseauLocal(parent, nomFichier=""): # Demande le nom du nouveau fichier local from Dlg import DLG_Saisie_nouveau_fichier dlg = DLG_Saisie_nouveau_fichier.MyDialog(parent) dlg.SetTitle(_(u"Conversion d'un fichier réseau en fichier local")) dlg.radio_local.SetValue(True) dlg.OnRadioLocal(None) dlg.radio_local.Enable(False) dlg.radio_reseau.Enable(False) dlg.checkbox_details.Show(False) dlg.hyperlink_details.Show(False) dlg.CentreOnScreen() if dlg.ShowModal() == wx.ID_OK: nouveauFichier = dlg.GetNomFichier() dlg.Destroy() else: dlg.Destroy() return False # Vérifie que le fichier n'est pas déjà utilisé if os.path.isfile(UTILS_Fichiers.GetRepData(u"%s_TDATA.dat" % nomFichier)) == True: dlg = wx.MessageDialog(parent, _(u"Le fichier existe déjà."), _(u"Erreur de création de fichier"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() return False nomFichierReseauFormate = nomFichier[nomFichier.index("[RESEAU]" ):].replace( "[RESEAU]", "") # Demande une confirmation pour la conversion message = _( u"Confirmez-vous la conversion du fichier réseau '%s' en fichier local portant le nom '%s' ? \n\nCette opération va durer quelques instants...\n\n(Notez que le fichier original sera toujours conservé)" ) % (nomFichierReseauFormate, nouveauFichier) dlg = wx.MessageDialog(parent, message, _(u"Confirmation de la conversion"), wx.YES_NO | wx.CANCEL | wx.ICON_QUESTION) if dlg.ShowModal() == wx.ID_YES: dlg.Destroy() else: dlg.Destroy() return False # Lance la conversion parent.SetStatusText( _(u"Conversion du fichier en cours... Veuillez patientez...")) conversion = GestionDB.ConversionReseauLocal(nomFichier, nouveauFichier, parent) parent.SetStatusText(_(u"La conversion s'est terminée avec succès.")) dlg = wx.MessageDialog( None, _(u"La conversion s'est terminée avec succès. Le nouveau fichier a été créé." ), "Information", wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() return True
def SupprimerFichier(self, titre=""): """ Supprimer un fichier """ # Demande de confirmation dlg = wx.MessageDialog( None, _(u"Souhaitez-vous vraiment supprimer le fichier '%s' ?") % titre, _(u"Supprimer un fichier"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_QUESTION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES: return dlg = wx.MessageDialog( None, _(u"Attention, la suppression est irreversible !!! \n\n Vous êtes vraiment sûr de vouloir supprimer le fichier '%s' ?" ) % titre, _(u"Supprimer un fichier"), wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES: return # Supprimer un fichier local if self.mode == "local": for suffixe in ("TDATA", "TDOCUMENTS", "TPHOTOS"): try: os.remove( UTILS_Fichiers.GetRepData(u"%s_%s.dat" % (titre, suffixe))) except Exception as err: pass # Supprime un fichier réseau if self.mode == "reseau": hote = self.codesReseau["hote"] utilisateur = self.codesReseau["utilisateur"] motdepasse = self.codesReseau["motdepasse"] port = self.codesReseau["port"] DB = GestionDB.DB(nomFichier=u"%s;%s;%s;%s[RESEAU]" % (port, hote, utilisateur, motdepasse)) if DB.echec == 1: dlg = wx.MessageDialog( self, _(u"Erreur de connexion MySQL !\n\n%s") % DB.erreur, _(u"Erreur de connexion"), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() DB.Close() return for suffixe in ("tdata", "tdocuments", "tphotos"): DB.ExecuterReq("""DROP DATABASE IF EXISTS %s_%s;""" % (titre, suffixe)) DB.Close() self.Remplissage()
def GetListeFichiersLocaux(self): """ Trouver les fichiers présents sur le DD """ listeFichiersTmp = os.listdir(UTILS_Fichiers.GetRepData()) listeFichiers = [] for fichier in listeFichiersTmp : if fichier[-9:] == "_DATA.dat" : nomFichier = fichier[:-9] if nomFichier.startswith("EXEMPLE_") == False : listeFichiers.append(nomFichier) listeFichiers.sort() return listeFichiers
def GetListeFichiersLocaux(self): """ Trouver les fichiers présents sur le DD """ listeFichiersTmp = os.listdir(UTILS_Fichiers.GetRepData()) listeFichiers = [] for fichier in listeFichiersTmp : if fichier[-10:] == "_TDATA.dat" : nomFichier = fichier[:-10] if "EXEMPLE" not in nomFichier and "Exemple" not in nomFichier : listeFichiers.append(nomFichier) listeFichiers.sort() return listeFichiers
def GetListeFichiersLocal(self): """ Récupère la liste des fichiers locaux à afficher """ # Lit le répertoire chemin = UTILS_Fichiers.GetRepData() fichiers = os.listdir(chemin) fichiers.sort() listeFichiers = [] for fichier in fichiers: nomFichier = os.path.split(fichier)[1] titre = nomFichier[:-10] cheminFichier = chemin + "/" + fichier if (self.prefixe == None and nomFichier.endswith("_TDATA.dat") ) or (self.prefixe != None and nomFichier.endswith("_TDATA.dat") and nomFichier.startswith(self.prefixe)): # Taille des 3 bases de données taille = 0 for suffixe in ("TDATA", "TDOCUMENTS", "TPHOTOS"): fichierTemp = "%s/%s_%s.dat" % (chemin, titre, suffixe) if os.path.isfile(fichierTemp): taille += os.path.getsize(fichierTemp) taille = FormatFileSize(taille) # Date dernière modification t = os.path.getmtime(cheminFichier) date = datetime.datetime.fromtimestamp(t) dateModif = date.strftime("%d/%m/%Y %H:%M") # Ouverture de la base de données pour récupérer les infos sur le fichier description = u"" img = wx.Image( Chemins.GetStaticPath("Images/80x80/Logo_tw.png"), wx.BITMAP_TYPE_PNG) img = RecadreImg(img) image = img.ConvertToBitmap() # Mémorisation listeFichiers.append({ "titre": titre, "image": image, "description": description, "taille": taille, "dateModif": dateModif }) return listeFichiers
def SupprimerFichier(self, titre=""): """ Supprimer un fichier """ if UTILS_Utilisateurs.VerificationDroitsUtilisateurActuel("fichier_fichier", "supprimer") == False : return # Demande de confirmation dlg = wx.MessageDialog(None, _(u"Souhaitez-vous vraiment supprimer le fichier '%s' ?") % titre.decode("iso-8859-15"), _(u"Supprimer un fichier"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_QUESTION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return dlg = wx.MessageDialog(None, _(u"Attention, la suppression est irreversible !!! \n\n Vous êtes vraiment sûr de vouloir supprimer le fichier '%s' ?") % titre.decode("iso-8859-15"), _(u"Supprimer un fichier"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return # Supprimer un fichier local if self.mode == "local" : for suffixe in ("DATA", "DOCUMENTS", "PHOTOS") : try : os.remove(UTILS_Fichiers.GetRepData(u"%s_%s.dat" % (titre, suffixe))) except Exception, err : pass
def OnBoutonOk(self, event): index = self.ctrl_fichiers.GetFirstSelected() if index == -1 : dlg = wx.MessageDialog(self, _(u"Vous devez sélectionner un fichier dans la liste !"), _(u"Erreur de saisie"), wx.OK | wx.ICON_EXCLAMATION) dlg.ShowModal() dlg.Destroy() return titre = self.ctrl_fichiers.GetItemPyData(index)["titre"] nomFichier = self.GetNomFichier() listeOptions = self.ctrl_options.GetIDcoches() # Demande de confirmation nbreFamilles = self.GetNbreFamilles() if nbreFamilles > 0 : dlg = wx.MessageDialog(self, _(u"Attention, %d fiches familles sont déjà saisies dans ce fichier. Si vous utilisez la fonction d'importation, TOUTES les fiches actuelles seront écrasées !!!\n\nSouhaitez-vous tout de même continuer ?") % nbreFamilles, _(u"Avertissement"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_EXCLAMATION) if dlg.ShowModal() != wx.ID_YES : dlg.Destroy() return False dlg.Destroy() dlg = wx.MessageDialog(self, _(u"Souhaitez-vous vraiment lancer l'importation des familles du fichier '%s' ?\n\nAttention, toutes les données actuelles seront écrasées !") % titre, _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.CANCEL|wx.ICON_EXCLAMATION) if dlg.ShowModal() != wx.ID_YES : dlg.Destroy() return False dlg.Destroy() # Importation des tables listeTables = [ "comptes_payeurs", "familles", "individus", "liens", "medecins", "payeurs", "categories_travail", "caisses", "rattachements", "regimes", "secteurs", "types_sieste", "problemes_sante", "types_maladies", "types_vaccins", "vaccins", "vaccins_maladies", ] if "abonnements" in listeOptions : listeTables.extend(["abonnements", "listes_diffusion"]) if "scolarite" in listeOptions : listeTables.extend(["classes", "ecoles", "niveaux_scolaires", "scolarite"]) if "questionnaire" in listeOptions : listeTables.extend(["questionnaire_categories", "questionnaire_choix", "questionnaire_filtres", "questionnaire_questions", "questionnaire_reponses"]) if "pieces" in listeOptions : listeTables.extend(["pieces", "types_pieces"]) if "messages" in listeOptions : listeTables.extend(["messages", "messages_categories"]) if "quotients" in listeOptions : listeTables.extend(["quotients",]) if "mandats" in listeOptions : listeTables.extend(["mandats",]) DB = GestionDB.DB() for nomTable in listeTables : # Réinitialisation de la table print "Reinitialisation de la table %s..." % nomTable DB.ExecuterReq("DROP TABLE %s;" % nomTable) DB.Commit() DB.CreationTable(nomTable, Tables.DB_DATA) # Importation des données print "Importation de la table %s..." % nomTable if self.radio_local.GetValue() == True : DB.Importation_table(nomTable=nomTable, nomFichierdefault=UTILS_Fichiers.GetRepData(u"%s_DATA.dat" % nomFichier)) else : DB.Importation_table(nomTable=nomTable, nomFichierdefault=nomFichier+"_data", mode="reseau") DB.Close() # Fin nbreFamilles = self.GetNbreFamilles() dlg = wx.MessageDialog(self, _(u"La procédure d'importation est terminée !\n\n%d familles ont été importées avec succès.") % nbreFamilles, _(u"Confirmation"), wx.OK | wx.ICON_INFORMATION) dlg.ShowModal() dlg.Destroy() self.EndModal(wx.ID_OK)
def Sauvegarde(listeFichiersLocaux=[], listeFichiersReseau=[], nom="", repertoire=None, motdepasse=None, listeEmails=None, dictConnexion=None): """ Processus de de création du ZIP """ # Si aucun fichier à sauvegarder if len(listeFichiersLocaux) == 0 and len(listeFichiersReseau) == 0 : return False # Initialisation de la barre de progression nbreEtapes = 3 nbreEtapes += len(listeFichiersLocaux) nbreEtapes += len(listeFichiersReseau) if motdepasse != None : nbreEtapes += 1 if repertoire != None : nbreEtapes += 1 if listeEmails != None : nbreEtapes += 1 # Création du nom du fichier de destination if motdepasse != None : extension = EXTENSIONS["crypte"] else: extension = EXTENSIONS["decrypte"] # Vérifie si fichier de destination existe déjà if repertoire != None : fichierDest = u"%s/%s.%s" % (repertoire, nom, extension) if os.path.isfile(fichierDest) == True : dlg = wx.MessageDialog(None, _(u"Un fichier de sauvegarde portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return False # Récupération des paramètres de l'adresse d'expéditeur par défaut if listeEmails != None : dictAdresse = UTILS_Envoi_email.GetAdresseExpDefaut() if dictAdresse == None : dlgErreur = wx.MessageDialog(None, _(u"Envoi par Email impossible :\n\nAucune adresse d'expéditeur n'a été définie. Veuillez la saisir dans le menu Paramétrage du logiciel..."), _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Fenêtre de progression dlgprogress = wx.ProgressDialog(_(u"Sauvegarde"), _(u"Lancement de la sauvegarde..."), maximum=nbreEtapes, parent=None, style= wx.PD_SMOOTH | wx.PD_AUTO_HIDE | wx.PD_APP_MODAL) # Création du fichier ZIP temporaire nomFichierTemp = u"%s.%s" % (nom, EXTENSIONS["decrypte"]) fichierZip = zipfile.ZipFile(UTILS_Fichiers.GetRepTemp(fichier=nomFichierTemp), "w", compression=zipfile.ZIP_DEFLATED) numEtape = 1 dlgprogress.Update(numEtape, _(u"Création du fichier de compression..."));numEtape += 1 # Intégration des fichiers locaux for nomFichier in listeFichiersLocaux : dlgprogress.Update(numEtape, _(u"Compression du fichier %s...") % nomFichier);numEtape += 1 fichier = UTILS_Fichiers.GetRepData(nomFichier) if os.path.isfile(fichier) == True : fichierZip.write(fichier, nomFichier) else : dlgprogress.Destroy() dlgErreur = wx.MessageDialog(None, _(u"Le fichier '%s' n'existe plus sur cet ordinateur. \n\nVeuillez ôter ce fichier de la procédure de sauvegarde automatique (Menu Fichier > Sauvegardes automatiques)") % nomFichier, _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Intégration des fichiers réseau if len(listeFichiersReseau) > 0 and dictConnexion != None : # Création du répertoire temporaire repTemp = UTILS_Fichiers.GetRepTemp(fichier="savetemp") if os.path.isdir(repTemp) == True : shutil.rmtree(repTemp) os.mkdir(repTemp) # Recherche du répertoire d'installation de MySQL repMySQL = GetRepertoireMySQL(dictConnexion) if repMySQL == None : dlgprogress.Destroy() dlgErreur = wx.MessageDialog(None, _(u"Noethys n'a pas réussi à localiser MySQL sur votre ordinateur.\n\nNotez bien que MySQL doit être installé obligatoirement pour créer une sauvegarde réseau."), _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Création du fichier de login nomFichierLoginTemp = repTemp + "/logintemp.cnf" #os.path.abspath(os.curdir) + "/" + repTemp + "/logintemp.cnf" CreationFichierLoginTemp(host=dictConnexion["host"], port=dictConnexion["port"], user=dictConnexion["user"], password=dictConnexion["password"], nomFichier=nomFichierLoginTemp) # Création du backup pour chaque fichier MySQL for nomFichier in listeFichiersReseau : dlgprogress.Update(numEtape, _(u"Compression du fichier %s...") % nomFichier);numEtape += 1 fichierSave = u"%s/%s.sql" % (repTemp, nomFichier) args = u""""%sbin/mysqldump" --defaults-extra-file="%s" --single-transaction --opt --databases %s > "%s" """ % (repMySQL, nomFichierLoginTemp, nomFichier, fichierSave) print(("Chemin mysqldump =", args)) if six.PY2: args = args.encode('utf8') proc = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) out, temp = proc.communicate() if out not in ("", b""): print((out,)) try : if six.PY2: out = str(out).decode("iso-8859-15") except : pass dlgprogress.Destroy() dlgErreur = wx.MessageDialog(None, _(u"Une erreur a été détectée dans la procédure de sauvegarde !\n\nErreur : %s") % out, _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Insère le fichier Sql dans le ZIP try : fichierZip.write(fichierSave.encode('utf8'), u"%s.sql" % nomFichier) except Exception as err : dlgprogress.Destroy() print(("insertion sql dans zip : ", err,)) try : if six.PY2: err = str(err).decode("iso-8859-15") except : pass dlgErreur = wx.MessageDialog(None, _(u"Une erreur est survenue dans la sauvegarde !\n\nErreur : %s") % err, _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Supprime le répertoire temp shutil.rmtree(repTemp) # Finalise le fichier ZIP fichierZip.close() # Cryptage du fichier if motdepasse != None : dlgprogress.Update(numEtape, _(u"Cryptage du fichier..."));numEtape += 1 fichierCrypte = u"%s.%s" % (nom, EXTENSIONS["crypte"]) motdepasse = base64.b64decode(motdepasse) if six.PY3: motdepasse = motdepasse.decode('utf8') ancienne_methode = UTILS_Customize.GetValeur("version_cryptage", "sauvegarde", "1", ajouter_si_manquant=False) in ("1", None) UTILS_Cryptage_fichier.CrypterFichier(UTILS_Fichiers.GetRepTemp(fichier=nomFichierTemp), UTILS_Fichiers.GetRepTemp(fichier=fichierCrypte), motdepasse, ancienne_methode=ancienne_methode) nomFichierTemp = fichierCrypte extension = EXTENSIONS["crypte"] else: extension = EXTENSIONS["decrypte"] # Copie le fichier obtenu dans le répertoire donné if repertoire != None : dlgprogress.Update(numEtape, _(u"Création du fichier dans le répertoire cible..."));numEtape += 1 try : shutil.copy2(UTILS_Fichiers.GetRepTemp(fichier=nomFichierTemp), fichierDest) except : print("Le repertoire de destination de sauvegarde n'existe pas.") # Préparation du message message = UTILS_Envoi_email.Message(destinataires=listeEmails, sujet=_(u"Sauvegarde Noethys : %s") % nom, texte_html=_(u"Envoi de la sauvegarde de Noethys"), fichiers=[UTILS_Fichiers.GetRepTemp(fichier=nomFichierTemp),]) # Envoi par Email if listeEmails != None : dlgprogress.Update(numEtape, _(u"Expédition de la sauvegarde par Email..."));numEtape += 1 try : messagerie = UTILS_Envoi_email.Messagerie(backend=dictAdresse["moteur"], hote=dictAdresse["smtp"], port=dictAdresse["port"], utilisateur=dictAdresse["utilisateur"], motdepasse=dictAdresse["motdepasse"], email_exp=dictAdresse["adresse"], use_tls=dictAdresse["startTLS"], timeout=60*3, parametres=dictAdresse["parametres"]) messagerie.Connecter() messagerie.Envoyer(message) messagerie.Fermer() except Exception as err: dlgprogress.Destroy() print((err,)) if six.PY2: err = str(err).decode("iso-8859-15") dlgErreur = wx.MessageDialog(None, _(u"Une erreur a été détectée dans l'envoi par Email !\n\nErreur : %s") % err, _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Suppression des répertoires et fichiers temporaires dlgprogress.Update(numEtape, _(u"Suppression des fichiers temporaires..."));numEtape += 1 fichier = UTILS_Fichiers.GetRepTemp(fichier=u"%s.%s" % (nom, EXTENSIONS["decrypte"])) if os.path.isfile(fichier) == True : os.remove(fichier) fichier = UTILS_Fichiers.GetRepTemp(fichier=u"%s.%s" % (nom, EXTENSIONS["crypte"])) if os.path.isfile(fichier) == True : os.remove(fichier) # Fin du processus dlgprogress.Update(numEtape, _(u"Sauvegarde terminée avec succès !")) dlgprogress.Destroy() return True
def Restauration(parent=None, fichier="", listeFichiersLocaux=[], listeFichiersReseau=[], dictConnexion=None): """ Restauration à partir des listes de fichiers locaux et réseau """ listeFichiersRestaures = [] # Initialisation de la barre de progression fichierZip = zipfile.ZipFile(fichier, "r") #fichierZip = MyZipFile(fichier, "r") # Restauration des fichiers locaux Sqlite ------------------------------------------------------------------------------ if len(listeFichiersLocaux) > 0 : # Vérifie qu'on les remplace bien listeExistantsTemp = [] for fichier in listeFichiersLocaux : if os.path.isfile(UTILS_Fichiers.GetRepData(fichier)) == True : listeExistantsTemp.append(fichier) if len(listeExistantsTemp) > 0 : if len(listeExistantsTemp) == 1 : message = _(u"Le fichier '%s' existe déjà.\n\nSouhaitez-vous vraiment le remplacer ?") % listeExistantsTemp[0] else : message = _(u"Les fichiers suivants existent déjà :\n\n - %s\n\nSouhaitez-vous vraiment les remplacer ?") % "\n - ".join(listeExistantsTemp) dlg = wx.MessageDialog(parent, message, "Attention !", wx.YES_NO | wx.CANCEL |wx.NO_DEFAULT | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return False # Restauration nbreEtapes = len(listeFichiersLocaux) dlgprogress = wx.ProgressDialog(_(u"Merci de patienter"), _(u"Lancement de la restauration..."), maximum=nbreEtapes, parent=parent, style= wx.PD_SMOOTH | wx.PD_AUTO_HIDE | wx.PD_APP_MODAL) numEtape = 1 for fichier in listeFichiersLocaux : dlgprogress.Update(numEtape, _(u"Restauration du fichier %s...") % fichier);numEtape += 1 try : # buffer = fichierZip.read(fichier) # f = open(UTILS_Fichiers.GetRepData(fichier), "wb") # f.write(buffer) # f.close() fichierZip.extract(fichier, UTILS_Fichiers.GetRepData()) except Exception as err: dlgprogress.Destroy() print(err) dlg = wx.MessageDialog(None, _(u"La restauration du fichier '%s' a rencontré l'erreur suivante : \n%s") % (fichier, err), "Erreur", wx.OK| wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() return False listeFichiersRestaures.append(fichier[:-4]) # Restauration des fichiers réseau MySQL ------------------------------------------------------------------------------------------------------------------------- if len(listeFichiersReseau) > 0 : # Récupération de la liste des fichiers MySQL de l'ordinateur listeFichiersExistants = GetListeFichiersReseau(dictConnexion) # Recherche du répertoire d'installation de MySQL repMySQL = GetRepertoireMySQL(dictConnexion) if repMySQL == None : dlgErreur = wx.MessageDialog(None, _(u"Noethys n'a pas réussi à localiser MySQL sur votre ordinateur.\nNotez bien que MySQL doit être installé obligatoirement pour créer une restauration réseau."), _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False # Vérifie qu'on les remplace bien listeExistantsTemp = [] for fichier in listeFichiersReseau : fichier = fichier[:-4] if fichier in listeFichiersExistants : listeExistantsTemp.append(fichier) if len(listeExistantsTemp) > 0 : if len(listeExistantsTemp) == 1 : message = _(u"Le fichier '%s' existe déjà.\n\nSouhaitez-vous vraiment le remplacer ?") % listeExistantsTemp[0] else : message = _(u"Les fichiers suivants existent déjà :\n\n - %s\n\nSouhaitez-vous vraiment les remplacer ?") % "\n - ".join(listeExistantsTemp) dlg = wx.MessageDialog(parent, message, "Attention !", wx.YES_NO | wx.CANCEL |wx.NO_DEFAULT | wx.ICON_EXCLAMATION) reponse = dlg.ShowModal() dlg.Destroy() if reponse != wx.ID_YES : return False # Création du répertoire temporaire repTemp = UTILS_Fichiers.GetRepTemp(fichier="restoretemp") if os.path.isdir(repTemp) == True : shutil.rmtree(repTemp) os.mkdir(repTemp) # Création du fichier de login nomFichierLoginTemp = repTemp + "/logintemp.cnf" #os.path.abspath(os.curdir) + "/" + repTemp + "/logintemp.cnf" CreationFichierLoginTemp(host=dictConnexion["host"], port=dictConnexion["port"], user=dictConnexion["user"], password=dictConnexion["password"], nomFichier=nomFichierLoginTemp) # Restauration nbreEtapes = len(listeFichiersReseau) dlgprogress = wx.ProgressDialog(_(u"Merci de patienter"), _(u"Lancement de la restauration..."), maximum=nbreEtapes, parent=parent, style= wx.PD_SMOOTH | wx.PD_AUTO_HIDE | wx.PD_APP_MODAL) numEtape = 1 for fichier in listeFichiersReseau: fichier = fichier[:-4] # Création de la base si elle n'existe pas if fichier not in listeFichiersExistants : nomFichier = u"%s;%s;%s;%s[RESEAU]%s" % (dictConnexion["port"], dictConnexion["host"], dictConnexion["user"], dictConnexion["password"], fichier) DB = GestionDB.DB(suffixe=None, nomFichier=nomFichier, modeCreation=True) DB.Close() # Copie du fichier SQL dans le répertoire Temp / restoretemp # buffer = fichierZip.read(u"%s.sql" % fichier) # f = open(fichierRestore, "wb") # f.write(buffer) # f.close() fichierZip.extract(u"%s.sql" % fichier, repTemp) fichierRestore = u"%s/%s.sql" % (repTemp, fichier) # Importation du fichier SQL dans MySQL dlgprogress.Update(numEtape, _(u"Restauration du fichier %s...") % fichier);numEtape += 1 args = u""""%sbin/mysql" --defaults-extra-file="%s" %s < "%s" """ % (repMySQL, nomFichierLoginTemp, fichier, fichierRestore) print(("Chemin mysql =", args)) if six.PY2: args = args.encode("iso-8859-15") proc = subprocess.Popen(args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, stdin=subprocess.PIPE) out, temp = proc.communicate() if out not in ("", b"") : print(("subprocess de restauration mysql :", out)) if six.PY2: out = str(out).decode("iso-8859-15") dlgprogress.Destroy() dlgErreur = wx.MessageDialog(None, _(u"Une erreur a été détectée dans la procédure de restauration !\n\nErreur : %s") % out, _(u"Erreur"), wx.OK | wx.ICON_ERROR) dlgErreur.ShowModal() dlgErreur.Destroy() return False listeFichiersRestaures.append(fichier) # Supprime le répertoire temp shutil.rmtree(repTemp) # Fin de la procédure dlgprogress.Destroy() fichierZip.close() return listeFichiersRestaures