Macros

    From The Document Foundation Wiki
    < Macros‎ | Python Guide‎ | fr‎ | Guide

    Principes généraux |Table des matières| Boites de dialogue

    Identifier son système

    Les informations utiles de l'environnement

    Toute programmation nécessite à un moment ou un autre de récupérer des informations sur le système informatique. Comment récupérer des informations sur le matériel, le système d'exploitation, python, la suite bureautique ou sur la macro elle même ?

    Les briques de base de la macro

    Nous allons profiter de cette macro pour introduire la création de fonctions. Une fonction évite de reproduire mécaniquement des portions de code en l'appelant avec un nom de fonction. Une fonction nous permet aussi d'adapter les spécificités de valeurs ou d'éléments en lui passant des paramètres.

    Pour commencer vous devez créer un fichier info.py. Soit avec l'extension APOS, soit en l'éditant «aux emplacements des fichiers macro », soit en l'éditant dans un de vos répertoire et après en l'intégrant dans un document LibreOffice avec un script.

    D'abord nous récupérons en début de macro les bibliothèques et les paramètres utiles pour la fonction :

    import uno
    from com.sun.star.awt.MessageBoxType import \
        MESSAGEBOX as BOÎTEDIALOGUE, \
        INFOBOX as BOÎTEINFORMATION, \
        ERRORBOX as BOÎTEERREUR, \
        WARNINGBOX as BOÎTEAVERTISSEMENT, \
        QUERYBOX as BOÎTEQUESTION
    from com.sun.star.awt.MessageBoxButtons import \
        BUTTONS_OK as BOUTON_OK, \
        BUTTONS_OK_CANCEL as BOUTONS_OK_ANNULER, \
        BUTTONS_YES_NO as BOUTONS_OUI_NON, \
        BUTTONS_YES_NO_CANCEL as BOUTONS_OUI_NON_ANNULER, \
        BUTTONS_RETRY_CANCEL as BOUTONS_RÉESSAYER_ANNULER, \
        BUTTONS_ABORT_IGNORE_RETRY as BOUTONS_INTERROMPRE_RÉESSAYER_IGNORER, \
        DEFAULT_BUTTON_OK as OK_PAR_DEFAUT, \
        DEFAULT_BUTTON_CANCEL as ANNULER_PAR_DEFAUT, \
        DEFAULT_BUTTON_RETRY as RÉESSAYER_PAR_DEFAUT, \
        DEFAULT_BUTTON_YES as OUI_PAR_DEFAUT, \
        DEFAULT_BUTTON_NO as NON_PAR_DEFAUT, \
        DEFAULT_BUTTON_IGNORE as IGNORER_PAR_DEFAUT
    from com.sun.star.awt.MessabeBoxResults import CANCEL as ANNULER, OK, YES as OUI, NO as NON, RETRY as RÉESSAYER, IGNORE as IGNORER

    Nous allons donc transformer notre code d'affichage d'une boite de dialogue en une fonction de nom «boitemsg». Cette fonction aura comme paramètres :

    • le message à afficher avec le paramètre «messageboîte»,
    • le titre de la boîte de message avec le paramètre «titreboîteàmessage»,
    • la variété de boutons avec le paramètre «typedebouton» avec par défaut le bouton OK à afficher
    • et le modèle de boîte de dialogue avec le paramètre «typedeboite» avec comme modèle par défaut de paramètre BOÎTEDIALOGUE.

    def boitemsg(messageboîte, titreboîteàmessage, typedebouton=BOUTON_OK, typedeboite=BOÎTEDIALOGUE):
         #typedeboite :
         #  Boite de message      : BOÎTEDIALOGUE
         #  Boite d'information   : BOÎTEINFORMATION
         #  Boite d'erreur        : BOÎTEERREUR
         #  Boite d'alerte        : BOÎTEAVERTISSEMENT
         #  Boite d'interrogation : BOÎTEQUESTION
         #
         #typedebouton :
         #  OK                        : BOUTON_OK
         #  OK/ANNULER                : BOUTONS_OK_ANNULER
         #  OUI/NON                   : BOUTONS_OUI_NON
         #  OUI/NON/ANNULER           : BOUTONS_OUI_NON_ANNULER
         #  RÉESSAYER/ANNULER         : BOUTONS_RÉESSAYER_ANNULER
         #  ANNULER/RÉESSAYER/IGNORER : BOUTONS_INTERROMPRE_REESSAYER_IGNORER
         bureau = XSCRIPTCONTEXT.getDesktop()
         cadre = bureau.getCurrentFrame()
         fenêtre = cadre.getContainerWindow()
         boîteàoutils = fenêtre.getToolkit()
         boîtemessage = boîteàoutils.createMessageBox(fenêtre, typedeboite, typedebouton, titreboîteàmessage, messageboîte)
         return boîtemessage.execute()

    Pour utiliser cette fonction nous écrivons le nom de la fonction en substituant les paramètres.

    La détection du matériel informatique

    Comme pour la boite de message nous allons créer une fonction pour détecter le processeur de l'ordinateur.

    D'abord modifions les bibliothèques utiles pour la fonction

    import uno, platform, subprocess

    «platform» nous permet de récupérer des informations sur le système. «subprocess» permet de traiter le résultat d'une commande shell.

    Puis écrivons la fonction de détection du processeur de l'ordinateur :

    #Création de la fonction de détection du processeur
     def info_processeur():
         #Si le système d'exploitation est un MS Windows
         if platform.system() == "Windows":
             #platform retourne le type de processeur de l'ordinateur
             return platform.processor()
         #Si le système d'exploitation est un macOS
         elif platform.system() == "Darwin":
             #la commande shell sysctl retourne le type de processeur de l'ordinateur
             return subprocess.check_output(['/usr/sbin/sysctl', "-n", "machdep.cpu.brand_string"]).strip()
         #Si le système d'exploitation est un Linux
         elif platform.system() == "Linux":
             #le contenu du système de fichier virtuel /proc/cpuinfo retourne le type de processeur de l'ordinateur
             #dans le paramètre ''model name''
             for ligne in subprocess.check_output(["cat", "/proc/cpuinfo"], universal_newlines=True).split("\n"):
                 if "model name" in ligne:
                     return ligne.replace("model name", "").replace(":", "").strip()
         return platform.processor()

    Nous pouvons maintenant afficher avec la fonction boitemsg toutes sortes d'informations sur le matériel de l'ordinateur :

    def info():
         message = "[Matériel]"
         message += "\nMachine : %s" % platform.architecture()[0]
         message += "\nProcesseur : %s" % platform.machine()
         message += "\nModèle : %s" % info_processeur()
     
         resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)

    Résultat de l'exécution de la macro info.py

    Le système d'exploitation

    Ajoutons le code suivant :

    message += "\n\n[Système d'exploitation]"
         message += "\nSystème : %s" % platform.system()
         message += "\nNom machine du système : %s" % platform.node()
         message += "\nVersion du noyeau : %s" % platform.release()
         message += "\nRéalisation du système : %s" % platform.version()

    avant la ligne de code de notre macro :

    resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)

    Résultat de l'exécution de la macro info.py

    Les informations sur Python

    Nous devons d'abord ajouter la bibliothèque «sys»

    import uno, platform, subprocess, sys

    Puis le code suivant :

    message += "\n\n[Python]"
         message += "\nVersion de Python : %s.%s.%s" % sys.version_info[:3]
         message += "\nVersion du compilateur : %s" % platform.python_compiler()
         message += "\nVersion de compilation : %s" % platform.python_build()[1]
         message += "\nChemin de l\'exécutable : %s" % sys.executable

    avant la ligne de code de notre macro :

    resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)

    Résultat de l'exécution de la macro info.py

    Les informations sur la suite bureautique

    Nous devons d'abord ajouter la bibliothèque «PropertyValue» en début de programme

    …
     from com.sun.star.awt.MessageBoxResults import CANCEL, OK, YES, NO, RETRY, IGNORE
     from com.sun.star.beans import PropertyValue

    Puis le code suivant :

    message += "\n\n[Bureautique]"
         #Teste l'exécution de la séquence de code python
         try:
             #Définition des paramètres de récupération de la configuration de la suite bureautique
             prop = PropertyValue()
             prop.Name = 'nodepath'
             prop.Value = '/org.openoffice.Setup/Product'
             properties = (prop,)
             #Récupération du contexte d'exécution de la suite bureautique
             ctx = XSCRIPTCONTEXT.getComponentContext()
             #Récupération de la configuration de la suite bureautique
             configuration = ctx.ServiceManager.createInstanceWithContext(
                 'com.sun.star.configuration.ConfigurationProvider', ctx)
             #Récupération des informations sur la configuration
             informations = configuration.createInstanceWithArguments( 
                 'com.sun.star.configuration.ConfigurationAccess', properties)
             #Récupération du nom de la suite bureautique
             bureautique = informations.getByName('ooName')
             #Récupération du fournisseur de la suite bureautique
             vendeur = informations.getByName('ooVendor')
             #Récupération de la version de la suite
             version = informations.getByName('ooSetupVersion')
             #Récupération de la révision
             révision = informations.getByName('ooSetupVersionAboutBox')
             #Récupération de la version des documents produit par la suite
             versionfichiers = informations.getByName('ooXMLFileFormatVersion')
         except:
             bureautique = 'Pas d\'information disponible'
             vendeur = 'Pas d\'information disponible'
             version = 'Pas d\'information disponible'
             révision = 'Pas d\'information disponible'
             versionfichiers = 'Pas d\'information disponible'
         message += "\nSuite bureautique : %s" % bureautique
         message += "\nFournisseur : %s" % vendeur
         message += "\nVersion : %s" % version
         message += "\nRévision : %s" % révision
         message += "\nVersion fichiers : %s" % versionfichiers
         try:
             #Récupération du document courant ouvert (enregistré sur un support) de la suite
             oDoc = XSCRIPTCONTEXT.getDocument()
             #Récupération de son emplacement sur le support
             oLocal = oDoc.getLocation()
             message += "\nChemin : %s" % str(oLocal)
         except:
             message += "\nChemin document : %s" % 'Pas d\'emplacement de document'

    avant la ligne de code de notre macro :

    resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)

    Résultat de l'exécution de la macro info.py

    Les informations sur la macro info.py

    Nous devons d'abord ajouter la bibliothèque «os»

    import uno, platform, subprocess, sys, os

    Puis le code suivant :

    message += "\n\n[Macro]"
         message += "\nScript python : %s" % os.path.basename(__file__)
         message += "\nChemin macro : %s" % os.path.dirname(__file__)
         message += "\nChemin courant : %s" % os.getcwd()

    avant la ligne de code de notre macro :

    resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)

    Résultat de l'exécution de la macro info.py

    Code complet d'affichage d'informations du système

    Résultat de l'exécution de la macro info.py

    #!
     #coding: utf8
     #Macro: info.py
     #Objectif: Affiche une boîte de dialogue avec des informations systèmes
     #Auteur: Franc SERRES
     #Licence: https://www.gnu.org/licenses/gpl-3.0.fr.html
     
     import uno, platform, subprocess, sys, os
     from com.sun.star.awt.MessageBoxType import \
         MESSAGEBOX as BOÎTEDIALOGUE, \
         INFOBOX as BOÎTEINFORMATION, \
         ERRORBOX as BOÎTEERREUR, \
         WARNINGBOX as BOÎTEAVERTISSEMENT, \
         QUERYBOX as BOÎTEQUESTION
     from com.sun.star.awt.MessageBoxButtons import \
         BUTTONS_OK as BOUTON_OK, \
         BUTTONS_OK_CANCEL as BOUTONS_OK_ANNULER, \
         BUTTONS_YES_NO as BOUTONS_OUI_NON, \
         BUTTONS_YES_NO_CANCEL as BOUTONS_OUI_NON_ANNULER, \
         BUTTONS_RETRY_CANCEL as BOUTONS_RÉESSAYER_ANNULER, \
         BUTTONS_ABORT_IGNORE_RETRY as BOUTONS_INTERROMPRE_REESSAYER_IGNORER, \
         DEFAULT_BUTTON_OK as OK_PAR_DEFAUT, \
         DEFAULT_BUTTON_CANCEL as ANNULER_PAR_DEFAUT, \
         DEFAULT_BUTTON_RETRY as RÉESSAYER_PAR_DEFAUT, \
         DEFAULT_BUTTON_YES as OUI_PAR_DEFAUT, \
         DEFAULT_BUTTON_NO as NON_PAR_DEFAUT, \
         DEFAULT_BUTTON_IGNORE as IGNORER_PAR_DEFAUT
     from com.sun.star.awt.MessageBoxResults import CANCEL, OK, YES, NO, RETRY, IGNORE
     from com.sun.star.beans import PropertyValue
     
     def boitemsg(messageboîte, titreboîteàmessage, typedebouton=BOUTON_OK, typedeboite=BOÎTEDIALOGUE):
         #typedeboite :
         #  Boite de message      : BOÎTEDIALOGUE
         #  Boite d'information   : BOÎTEINFORMATION
         #  Boite d'erreur        : BOÎTEERREUR
         #  Boite d'alerte        : BOÎTEAVERTISSEMENT
         #  Boite d'interrogation : BOÎTEQUESTION
         #
         #typedebouton :
         #  OK                        : BOUTON_OK
         #  OK/ANNULER                : BOUTONS_OK_ANNULER
         #  OUI/NON                   : BOUTONS_OUI_NON
         #  OUI/NON/ANNULER           : BOUTONS_OUI_NON_ANNULER
         #  RÉESSAYER/ANNULER         : BOUTONS_RÉESSAYER_ANNULER
         #  ANNULER/RÉESSAYER/IGNORER : BOUTONS_INTERROMPRE_REESSAYER_IGNORER
         bureau = XSCRIPTCONTEXT.getDesktop()
         cadre = bureau.getCurrentFrame()
         fenêtre = cadre.getContainerWindow()
         boîteàoutils = fenêtre.getToolkit()
         boîtemessage = boîteàoutils.createMessageBox(fenêtre, typedeboite, typedebouton, titreboîteàmessage, messageboîte)
         return boîtemessage.execute()
     
     def get_processor_info():
         if platform.system() == "Windows":
             return platform.processor()
         elif platform.system() == "Darwin":
             return subprocess.check_output(['/usr/sbin/sysctl', "-n", "machdep.cpu.brand_string"]).strip()
         elif platform.system() == "Linux":
             for line in subprocess.check_output(["cat", "/proc/cpuinfo"], universal_newlines=True).split("\n"):
                 if "model name" in line:
                     return line.replace("model name", "").replace(":", "").strip()
         return platform.processor()
     
     def info():
         message = "[Matériel]"
         message += "\nMachine : %s" % platform.architecture()[0]
         message += "\nProcesseur : %s" % platform.machine()
         message += "\nModèle : %s" % get_processor_info()
     
         message += "\n\n[Système d'exploitation]"
         message += "\nSystème : %s" % platform.system()
         message += "\nNom machine du système : %s" % platform.node()
         message += "\nVersion du noyeau : %s" % platform.release()
         message += "\nRéalisation du système : %s" % platform.version()
     
         message += "\n\n[Python]"
         message += "\nVersion de Python : %s.%s.%s" % sys.version_info[:3]
         message += "\nVersion du compilateur : %s" % platform.python_compiler()
         message += "\nVersion de compilation : %s" % platform.python_build()[1]
         message += "\nChemin de l\'exécutable : %s" % sys.executable
     
         message += "\n\n[Bureautique]"
         try:
             prop = PropertyValue()
             prop.Name = 'nodepath'
             prop.Value = '/org.openoffice.Setup/Product'
             properties = (prop,)
             ctx = XSCRIPTCONTEXT.getComponentContext()
             configuration = ctx.ServiceManager.createInstanceWithContext(
                 'com.sun.star.configuration.ConfigurationProvider', ctx)
             informations = configuration.createInstanceWithArguments( 
                 'com.sun.star.configuration.ConfigurationAccess', properties)
             bureautique = informations.getByName('ooName')
             vendeur = informations.getByName('ooVendor')
             version = informations.getByName('ooSetupVersion')
             révision = informations.getByName('ooSetupVersionAboutBox')
             versionfichiers = informations.getByName('ooXMLFileFormatVersion')
         except:
             bureautique = 'Pas d\'information disponible'
             vendeur = 'Pas d\'information disponible'
             version = 'Pas d\'information disponible'
             révision = 'Pas d\'information disponible'
             versionfichiers = 'Pas d\'information disponible'
         message += "\nSuite bureautique : %s" % bureautique
         message += "\nFournisseur : %s" % vendeur
         message += "\nVersion : %s" % version
         message += "\nRévision : %s" % révision
         message += "\nVersion fichiers : %s" % versionfichiers
         try:
             document = XSCRIPTCONTEXT.getDocument()
             location = document.getLocation()
             message += "\nChemin : %s" % location
         except:
             message += "\nChemin document : %s" % 'Pas d\'emplacement de document'
     
         message += "\n\n[Macro]"
         message += "\nScript python : %s" % os.path.basename(__file__)
         message += "\nChemin macro : %s" % os.path.dirname(__file__).replace('file://', '')
         message += "\nChemin courant : %s" % os.getcwd()
         resultat = boitemsg(message , "Info Système", typedeboite=BOÎTEINFORMATION)
     
     g_exportedScripts = info,

    Principes généraux | Boites de dialogue