Esempio n. 1
0
    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()
Esempio n. 2
0
    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
Esempio n. 3
0
    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()
Esempio n. 6
0
 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
Esempio n. 7
0
 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
Esempio n. 9
0
 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
Esempio n. 10
0
    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)
Esempio n. 11
0
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
Esempio n. 12
0
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