Exemple #1
0
def getTableau(parent, nomFichier):
    """ Ouvre et renvoie le classeur
        contenant la grille d'évaluation
    """

    tableau, err, fichierPB = ouvrirXLS(nomFichier)

    #
    # Gestion des éventuelles erreurs
    #
    if err == 0:
        return tableau

    elif err & 1 != 0:
        messageErreur(parent, u"Lancement d'Excel impossible !",
                      u"L'application Excel ne semble pas installée !")


#    elif err&2 != 0:
#        messageErreur(parent, u"Fichier non trouvé !",
#                      u"Le fichier original de la grille,\n    " + fichierPB[0] + u"\n" \
#                      u"n'a pas été trouvé ! \n")

    else:
        print "Erreur", err
Exemple #2
0
def GetNewVersion(win):
    print "Recherche nouvelle version (hormis beta)..."
    url = "https://api.github.com/repos/cedrick-f/pySequence/releases/latest"
    proxy_handler = urllib2.ProxyHandler()
    opener = urllib2.build_opener(proxy_handler)
    urllib2.install_opener(opener)
    print "  proxies :", proxy_handler.proxies

    req = urllib2.Request(url)
    try:
        handler = urllib2.urlopen(req)
    except:
        print u"Pas d'accès à Internet"
        return

    dic = json.loads(handler.read())

    latest = dic['tag_name'].lstrip('v')

    # Version actuelle
    a = __version__.split('.')

    print "   locale  :", __version__
    print "   serveur :", latest

    # Comparaison
    new = False
    for i, l in enumerate(latest.split('.')):
        nl = int(l.rstrip("-beta"))
        na = int(a[i].rstrip("-beta"))
        #        print nl,na
        if nl > na:
            new = True
            break
        elif nl < na:
            break
    if new:
        print latest
    else:
        print

    if new:
        dialog = wx.MessageDialog(win, u"Une nouvelle version de pySéquence est disponible\n\n" \
                                        u"\t%s\n\n" \
                                        u"Voulez-vous visiter la page de téléchargement ?" % latest,
                                      u"Nouvelle version", wx.YES_NO | wx.ICON_INFORMATION)
        retCode = dialog.ShowModal()
        if retCode == wx.ID_YES:
            try:
                webbrowser.open(
                    "https://github.com/cedrick-f/pySequence/releases/latest",
                    new=2)
            except:
                from widgets import messageErreur
                messageErreur(None, u"Ouverture impossible",
                              u"Impossible d'ouvrir l'url\n\n%s\n" % url)

    return
Exemple #3
0
def genererGrillePDF(nomFichier, grilles_feuilles):
    #    print "genererGrillePDF"
    #    print grilles_feuilles

    wx.BeginBusyCursor()
    dosstemp = tempfile.mkdtemp()
    merger = PdfFileMerger()

    Ok = True
    for i, grille_feuille in enumerate(grilles_feuilles):
        grille, feuille = grille_feuille
        grille = grilles.PyExcel(grille)
        if feuille is None:
            feuille = grille.getSheets()[-1]


#        print "   ", feuille
# Création du fichier temporaire PDF
        nomGrille = r"grille" + str(i) + r".pdf"
        fichertempV = os.path.join(dosstemp, nomGrille)

        # Activation des feuilles "grilles"
        grille.setActiveSheet(grille.getSheetNum(feuille))
        #        grille.setActiveSheet(i+1)

        # Génération de la grille en PDF
        try:
            grille.save_pdf(fichertempV)
            grille.close()
        except:
            Ok = False
            print "Erreur save_pdf 1"
        try:
            f = open(fichertempV, "rb")
            merger.append(f)
            f.close()
        except:
            Ok = False
            print "Erreur save_pdf 2"

    if not Ok:
        shutil.rmtree(dosstemp)
        wx.EndBusyCursor()
        messageErreur(self, u"Erreur !",
                      u"Impossible de générer le fichier PDF des grilles")
        return False

    output = open(nomFichier, "wb")
    merger.write(output)

    shutil.rmtree(dosstemp)
    wx.EndBusyCursor()
    return True
Exemple #4
0
def genererGrillePDF(nomFichier, grilles_feuilles):
#    print "genererGrillePDF" 
#    print grilles_feuilles
    
    wx.BeginBusyCursor()
    dosstemp = tempfile.mkdtemp()
    merger = PdfFileMerger()
    
    Ok = True
    for i, grille_feuille in enumerate(grilles_feuilles):
        grille, feuille = grille_feuille
        grille = grilles.PyExcel(grille)
        if feuille is None:
            feuille = grille.getSheets()[-1]
#        print "   ", feuille
        # Création du fichier temporaire PDF
        nomGrille = r"grille"+str(i)+r".pdf"
        fichertempV = os.path.join(dosstemp, nomGrille)
        
        # Activation des feuilles "grilles"
        grille.setActiveSheet(grille.getSheetNum(feuille))
#        grille.setActiveSheet(i+1)

        # Génération de la grille en PDF
        try:
            grille.save_pdf(fichertempV)
            grille.close()
        except:
            Ok = False
            print "Erreur save_pdf 1"
        try:
            f = open(fichertempV, "rb")
            merger.append(f)
            f.close()
        except:
            Ok = False
            print "Erreur save_pdf 2"  
        
        
    if not Ok:
        shutil.rmtree(dosstemp)
        wx.EndBusyCursor()
        messageErreur(self, u"Erreur !",
                            u"Impossible de générer le fichier PDF des grilles")
        return False
    
    output = open(nomFichier, "wb")
    merger.write(output)

    shutil.rmtree(dosstemp)
    wx.EndBusyCursor()
    return True
Exemple #5
0
    def Afficher(self, pathref, fenSeq=None):
        """ Lance l'affichage du contenu du lien
            <pathref> = chemin de l'application pour déterminer le chemin absolu
        """
        t = self.getTexte()
        print("Afficher", self.type, self.path)
        path = self.GetAbsPath(pathref)
        #         print "   ", path
        #         print "   ", path.decode("unicode-escape")
        #         print "   ", path.encode(sys.getfilesystemencoding())

        if self.type == "f":
            if os.path.exists(path):
                try:
                    os.startfile(path)
                except:
                    messageErreur(
                        None, "Ouverture impossible",
                        "Impossible d'ouvrir le fichier\n\n%s\n" %
                        toSystemEncoding(path))
            else:
                messageErreur(
                    None, "Chemin non trouvé",
                    "Le fichiern'a pas été trouvé\n\n%s" %
                    toSystemEncoding(path))

        elif self.type == 'd':
            if os.path.isdir(path):
                openFolder(path)
#                 try:
# #                     subprocess.Popen(["explorer", path])
#
#                 except:
#                     messageErreur(None, u"Ouverture impossible",
#                                   u"Impossible d'acc�der au dossier\n\n%s\n" %toSystemEncoding(path))
            else:
                messageErreur(
                    None, "Chemin non trouvé",
                    "Le dossiern'a pas été trouvé\n\n%s" %
                    toSystemEncoding(path))

        elif self.type == 'u':
            try:
                webbrowser.open(self.path)
            except:
                messageErreur(
                    None, "Ouverture impossible",
                    "Impossible d'ouvrir l'url\n\n%s\n" %
                    toSystemEncoding(self.path))

        elif self.type == 's':
            if os.path.isfile(path):
                #                self.Show(False)
                child = fenSeq.commandeNouveau()
                child.ouvrir(path)
Exemple #6
0
def GetNewVersion(win):
    print "Recherche nouvelle version ..."
    url = "https://api.github.com/repos/cedrick-f/pySequence/releases/latest"
    req = urllib2.Request(url)
    handler = urllib2.urlopen(req)
    dic = json.loads(handler.read())
    
    latest = dic['tag_name'].lstrip('v')
    
    # Version actuelle
    a = __version__.split('.')
    
    print "  actuelle :", __version__
    print "  nouvelle :",latest
    
    # Comparaison
    new = False
    for i, l in enumerate(latest.split('.')):
        nl = int(l.rstrip("-beta"))
        na = int(a[i].rstrip("-beta"))
        if nl > na:
            new = True
            break
    if new:
        print latest
    else:
        print

    if new:
        dialog = wx.MessageDialog(win, u"Une nouvelle version de pySéquence est disponible\n\n" \
                                        u"\t%s\n\n" \
                                        u"Voulez-vous visiter la page de téléchargement ?" % latest, 
                                      u"Nouvelle version", wx.YES_NO | wx.ICON_INFORMATION)
        retCode = dialog.ShowModal()
        if retCode == wx.ID_YES:
            try:
                webbrowser.open("https://github.com/cedrick-f/pySequence/releases/latest",new=2)
            except:
                messageErreur(None, u"Ouverture impossible",
                              u"Impossible d'ouvrir l'url\n\n%s\n" %url)


    return
Exemple #7
0
def getTableau(win, nomFichier):
    """ Ouvre et renvoie les classeurs 
        contenant les grilles d'évaluation : revues + soutenance
        
        :param win: Fenêtre parente des éventuels wx.Dialog à afficher pendant le processus
        :type win: wx.Window
            
        :return: la liste des codes d'erreur
        :rtype: list
        
            
    """
    #     print "getTableau", nomFichier

    tableau, err, fichierPB = ouvrirXLS(nomFichier)

    #
    # Gestion des éventuelles erreurs
    #
    if err == 0:
        return tableau

    elif err & 1 != 0:
        messageErreur(win, "Lancement d'Excel impossible !",
                      "L'erreur peut avoir une des causes suivantes :\n" \
                      " - L'application Excel n'est pas installée.\n" \
                      " - Le fichier original de la grille n'a pas la bonne extention.\n"
                      )


#    elif err&2 != 0:
#        messageErreur(parent, u"Fichier non trouvé !",
#                      u"Le fichier original de la grille,\n    " + fichierPB[0] + u"\n" \
#                      u"n'a pas été trouvé ! \n")

    else:
        print("Erreur", err)
Exemple #8
0
def getTableau(parent, nomFichier):
    """ Ouvre et renvoie le classeur
        contenant la grille d'évaluation
    """

    tableau, err, fichierPB = ouvrirXLS(nomFichier)
                                      
    #
    # Gestion des éventuelles erreurs
    #
    if err == 0:
        return tableau
    
    elif err&1 != 0:
        messageErreur(parent, u"Lancement d'Excel impossible !",
                      u"L'application Excel ne semble pas installée !")
        
#    elif err&2 != 0:
#        messageErreur(parent, u"Fichier non trouvé !",
#                      u"Le fichier original de la grille,\n    " + fichierPB[0] + u"\n" \
#                      u"n'a pas été trouvé ! \n")
        
    else:
        print "Erreur", err
Exemple #9
0
def MyExceptionHook(etype, value, trace):
    """
    Handler for all unhandled exceptions.
 
    :param `etype`: the exception type (`SyntaxError`, `ZeroDivisionError`, etc...);
    :type `etype`: `Exception`
    :param string `value`: the exception error message;
    :param string `trace`: the traceback header, if any (otherwise, it prints the
     standard Python header: ``Traceback (most recent call last)``.
    """
    tmp = traceback.format_exception(etype, value, trace)
    mes = u"pySéquence %s a rencontré une erreur et doit fermer !\n\n"\
         u"Merci de copier le message ci-dessous\n" \
         u"et de l'envoyer à l'équipe de développement :\n"\
         u"cedrick point faury arobase ac-clermont point fr\n\n" %version.__version__
    exception = mes + "".join(tmp)

    try:
        wx.GetApp().GetTopWindow()
        messageErreur(None, "Erreur !", exception, wx.ICON_ERROR)
    except:
        print exception
        time.sleep(6)
    sys.exit()
Exemple #10
0
def MyExceptionHook(etype, value, trace):
    """
    Handler for all unhandled exceptions.
 
    :param `etype`: the exception type (`SyntaxError`, `ZeroDivisionError`, etc...);
    :type `etype`: `Exception`
    :param string `value`: the exception error message;
    :param string `trace`: the traceback header, if any (otherwise, it prints the
     standard Python header: ``Traceback (most recent call last)``.
    """
    tmp = traceback.format_exception(etype, value, trace)
    mes = u"pySéquence %s a rencontré une erreur et doit fermer !\n\n"\
         u"Merci de copier le message ci-dessous\n" \
         u"et de l'envoyer à l'équipe de développement :\n"\
         u"cedrick point faury arobase ac-clermont point fr\n\n" %version.__version__
    exception = mes + "".join(tmp)
    
    try:
        wx.GetApp().GetTopWindow()
        messageErreur(None, "Erreur !", exception, wx.ICON_ERROR)
    except:
        print exception
        time.sleep(6)
    sys.exit()
Exemple #11
0
def getTableaux(parent, doc):
    """ Ouvre et renvoie les classeurs 
        contenant les grilles d'évaluation : revues + soutenance
    """
    typ = doc.GetTypeEnseignement()
    ref = doc.GetReferentiel()
    prj = doc.GetProjetRef()
    fichiers = prj.grilles
#    print "grilles :", fichiers
    fichierPB = []
    
    def ouvrir(fichier):
        fichier = os.path.join(TABLE_PATH, toFileEncoding(fichier))
        tableau = None
        err = 0
        
        if os.path.isfile(fichier):
            try:
                tableau = PyExcel(fichier)
            except:
                err = 1
        else:
            err = 2
            fichierPB.append(fichier)
            
        return err, tableau
    
    tableaux = {}
    ff = r""
    for k, f in fichiers.items():
        nomFichier = f[0]
        if nomFichier != ff:
            if EXT_EXCEL != os.path.splitext(nomFichier)[1]:
                nomFichier = os.path.splitext(nomFichier)[0] + EXT_EXCEL
            err, tableaux[k] = [ouvrir(nomFichier), f[1]]
    
#    if typ == 'SSI':
#        err, tableau = ouvrir(fichiers[0])
#        if err != 0:
#            err, tableau = ouvrir(fichiers[1])
#    else:
#        errR, tableauR = ouvrir(fichiersR[0])
#        if errR != 0:
#            errR, tableauR = ouvrir(fichiersR[1])
#        errS, tableauS = ouvrir(fichiersS[0])
#        if errS != 0:
#            errS, tableauS = ouvrir(fichiersS[1])
#        err = errR + errR
#        tableau = [tableauR, tableauS]
        
    if err == 0:
        return tableaux
    elif err&1 != 0:
        messageErreur(parent, u"Lancement d'Excel impossible !",
                      u"L'application Excel ne semble pas installée !")
    elif err&2 != 0:
        messageErreur(parent, u"Fichier non trouvé !",
                              u"Le fichier original de la grille,\n    " + fichierPB[0] + u"\n" \
                              u"n'a pas été trouvé ! \n")
    else:
        print "Erreur", err
Exemple #12
0
def getTableaux(parent, doc):
    """ Ouvre et renvoie les classeurs 
        contenant les grilles d'évaluation : revues + soutenance
    """
    typ = doc.GetTypeEnseignement()
    ref = doc.GetReferentiel()
    prj = doc.GetProjetRef()
    fichiers = prj.grilles
    #    print "grilles :", fichiers
    fichierPB = []

    def ouvrir(fichier):
        fichier = os.path.join(TABLE_PATH, toFileEncoding(fichier))
        tableau = None
        err = 0

        if os.path.isfile(fichier):
            try:
                tableau = PyExcel(fichier)
            except:
                err = 1
        else:
            err = 2
            fichierPB.append(fichier)

        return err, tableau

    tableaux = {}
    ff = r""
    for k, f in fichiers.items():
        nomFichier = f[0]
        if nomFichier != ff:
            if EXT_EXCEL != os.path.splitext(nomFichier)[1]:
                nomFichier = os.path.splitext(nomFichier)[0] + EXT_EXCEL
            err, tableaux[k] = [ouvrir(nomFichier), f[1]]


#    if typ == 'SSI':
#        err, tableau = ouvrir(fichiers[0])
#        if err != 0:
#            err, tableau = ouvrir(fichiers[1])
#    else:
#        errR, tableauR = ouvrir(fichiersR[0])
#        if errR != 0:
#            errR, tableauR = ouvrir(fichiersR[1])
#        errS, tableauS = ouvrir(fichiersS[0])
#        if errS != 0:
#            errS, tableauS = ouvrir(fichiersS[1])
#        err = errR + errR
#        tableau = [tableauR, tableauS]

    if err == 0:
        return tableaux
    elif err & 1 != 0:
        messageErreur(parent, u"Lancement d'Excel impossible !",
                      u"L'application Excel ne semble pas installée !")
    elif err & 2 != 0:
        messageErreur(parent, u"Fichier non trouvé !",
                              u"Le fichier original de la grille,\n    " + fichierPB[0] + u"\n" \
                              u"n'a pas été trouvé ! \n")
    else:
        print "Erreur", err
Exemple #13
0
def genererGrillePDF(nomFichier, grilles_feuilles):
    #    print "genererGrillePDF"
    #    print grilles_feuilles

    wx.BeginBusyCursor()
    dosstemp = tempfile.mkdtemp()

    doc = fitz.open()

    #     merger = PdfFileMerger()
    #     print "temp :", dosstemp

    Ok = True
    g = []
    for i, grille_feuille in enumerate(grilles_feuilles):
        grille, feuille = grille_feuille
        grille = grilles.PyExcel(grille)
        g.append(grille)
        if feuille is None:
            feuille = grille.getSheets()[-1]
#        print "   ", feuille
# Création du fichier temporaire PDF
        nomGrille = "grille" + str(i) + ".pdf"
        fichertempV = os.path.join(dosstemp, nomGrille)

        # Activation des feuilles "grilles"
        grille.setActiveSheet(grille.getSheetNum(feuille))
        #        grille.setActiveSheet(i+1)

        # Génération de la grille en PDF
        try:
            grille.save_pdf(fichertempV)
#             grille.close()
        except:
            Ok = False
            print("Erreur save_pdf 1")

        try:
            doc1 = fitz.open(fichertempV)
            doc.insertPDF(doc1)
            doc1.close()


#             f = open(fichertempV, "rb")
#             merger.append(f)
#             f.close()
        except:
            Ok = False
            print("Erreur save_pdf 2")

    for grille in g:
        try:
            grille.close()
        except:
            pass

    if not Ok:
        shutil.rmtree(dosstemp)
        wx.EndBusyCursor()
        messageErreur(self, "Erreur !",
                      "Impossible de générer le fichier PDF des grilles")
        return False

    doc.save(nomFichier)
    doc.close()
    #     output = open(nomFichier, "wb")
    #     merger.write(output)

    try:
        shutil.rmtree(dosstemp)
    except:
        print("Grilles temporaires non supprimées :", dosstemp)

    wx.EndBusyCursor()
    return True
Exemple #14
0
def GetNewVersion(win):
    print("Recherche nouvelle version ...")

    # getsion des proxies
    proxy_handler = urllib.request.ProxyHandler()
    opener = urllib.request.build_opener(proxy_handler)
    urllib.request.install_opener(opener)
    print("  proxies :", proxy_handler.proxies)

    url1 = __urlapi__ + "/releases/latest"
    url2 = __urlapi__ + "/releases"

    ##########################################################################################
    def getVerNumId(url):
        req = urllib.request.Request(url)
        try:
            handler = urllib.request.urlopen(req)
        except:
            print("Pas d'accès à Internet")
            return None, None

        dic = json.loads(handler.read())
        if type(dic) == list:
            dic = dic[0]

        id = dic['id']
        ver = dic['tag_name'].lstrip('v')
        return ver, id

    #########################################################################################
    latest, id1 = getVerNumId(url1)
    last_ver, id2 = getVerNumId(url2)

    if latest is None or last_ver is None:
        return

    # Version actuelle
    a = __version__.split('.')

    print("   locale  :", __version__)
    print("   serveur :", latest)
    print("   serveur_beta :", last_ver)

    # Comparaison
    #     new = False
    #     for i, l in enumerate(latest.split('.')):
    #         nl = int(l.rstrip("-beta"))
    #         na = int(a[i].rstrip("-beta"))
    # #        print nl,na
    #         if nl > na:
    #             new = True
    #             break
    #         elif nl < na:
    #             break
    #     if new:
    #         print latest
    #     else:
    #         print

    new = sup(latest, a)
    newbeta = sup(last_ver, a)

    if new:
        dialog = wx.MessageDialog(win, "Une nouvelle version de pySéquence est disponible\n\n" \
                                        "\t%s\n\n" \
                                        "Voulez-vous visiter la page de téléchargement ?" % latest,
                                      "Nouvelle version", wx.YES_NO | wx.ICON_INFORMATION)
        retCode = dialog.ShowModal()
        if retCode == wx.ID_YES:
            try:
                url = __url__ + "/releases/latest"
                webbrowser.open(url, new=2)
            except:
                from widgets import messageErreur
                messageErreur(None, "Ouverture impossible",
                              "Impossible d'ouvrir l'url\n\n%s\n" % url)

    elif newbeta:
        dialog = wx.MessageDialog(win, "Une nouvelle version de pySéquence est disponible\n\n" \
                                        "\t%s\n\n" \
                                        "... Il s'agit d'une version beta ...\n\n" \
                                        "Voulez-vous visiter la page de téléchargement ?" % last_ver,
                                      "Nouvelle version beta", wx.YES_NO | wx.ICON_INFORMATION)
        retCode = dialog.ShowModal()
        if retCode == wx.ID_YES:
            try:
                url = __url__ + "/releases/tag/v" + last_ver
                webbrowser.open(url, new=2)
            except:
                from widgets import messageErreur
                messageErreur(None, "Ouverture impossible",
                              "Impossible d'ouvrir l'url\n\n%s\n" % url)

    return
Exemple #15
0
def genererFicheValidation(nomFichier, projet):
    """
    """
    
    #
    # Styles
    #
    title_style = ParagraphStyle(name="TitleStyle",
                                 fontName="Helvetica",
                                 textColor = colors.red,
                                 fontSize=20,
                                 alignment=TA_LEFT,
                                 )
    
    normal_style = ParagraphStyle(name="NormalStyle",
                                 fontName="Helvetica",
                                 fontSize=10,
                                 leading = 12,
                                 alignment=TA_LEFT,
                                 )
    

    
    entete_style = ParagraphStyle(name="EnteteStyle",
                                 fontName="Helvetica",
                                 textColor = colors.gray,
                                 fontSize=9,
                                 alignment=TA_LEFT,
                                 )
    
    info_style = ParagraphStyle(name="InfoStyle",
                                 fontName="Helvetica",
                                 textColor = colors.gray,
                                 fontSize=8,
                                 alignment=TA_LEFT,
                                 )
    
    # To make a SimpleDocTemplate, just supply a file name for your PDF, and the
    # page margins. You can optionally supply non-flowing elements such as headers
    # and footers. I will introduce that feature in a later demonstration.
    doc = SimpleDocTemplate(nomFichier,
                            pagesize=A4,
                            leftMargin=10*mm,
                            rightMargin=10*mm,
                            topMargin=10*mm,
                            bottomMargin=10*mm)
    
    story = [] # Fill this list with flowable objects
    
    ref = projet.GetReferentiel()
    prj = projet.GetProjetRef()
    #
    # En-tête
    #
    story.append(Paragraph(u"Fiche de validation du projet",
                           title_style
                           ))
    story.append(Spacer(1, 5*mm))
    
    if projet.GetTypeEnseignement() == 'SSI':
        en_tete = [u"Bulletin officiel n°39 du 23 octobre 2014",
                   u"Annexe 4 à la note de service n° 2014-131 du 9-10-2014",
                   u"Baccalauréat général, série S, sciences de l'ingénieur - Épreuve orale, projet interdisciplinaire"]
        
    elif ref.Famille == 'STI':
        en_tete = [u"Bulletin officiel n°39 du 23 octobre 2014",
                   u"Annexe 9 à la note de service n° 2014-132 du 13-10-2014",
                   u"Baccalauréat technologique, série STI2D - Épreuve de projet en enseignement spécifique à la spécialité"]
        
    else:
        messageErreur(None, u"Erreur !",
                            u"Impossible de trouver le fichier HTML")
        return False
        
        
    for l in en_tete:
        story.append(Paragraph(l, entete_style))
        story.append(Spacer(1, 1*mm))
    
    story.append(Spacer(1, 4*mm))
    
    
    #
    # Première zone
    #
    NP = []
    for p in projet.equipe:
        np = p.GetNomPrenom()
        if p.referent:
            np = gras(np)  
        if p.discipline != 'Tec':
            np = italic(np)
        NP.append(Paragraph(np, normal_style))
        
    data= [[[Paragraph(gras(u'Établissement : '), normal_style), Paragraph(projet.classe.etablissement, normal_style)], [Paragraph(gras(u"Année scolaire : ")+getAnneeScolaireStr(), normal_style),
                                                                                                                         Paragraph(gras(u"Nombre d’élèves concernés : ")+str(len(projet.eleves)), normal_style)]],
           [Paragraph(gras(u"Spécialité : ")+ ref.Enseignement[0], normal_style), Paragraph(gras(u"Nombre de groupes d’élèves : ")+str(projet.nbrParties), normal_style)],
           [Paragraph(gras(u"Noms et prénoms des enseignants responsables :"), normal_style), NP]]
    t = Table(data, style = [('VALIGN',      (0,0),(-1,-1),'TOP')])
    
    story.append(t)
    
    story.append(Spacer(1, 5*mm))
    
    styleSheet = getSampleStyleSheet()


    #
    # Deuxième zone (tableau)
    #
#    print ref.attributs_prj
    # Colonne de gauche
    ppi = Paragraph(gras(u'Intitulé du projet'),normal_style)
    
    ppo = Paragraph(gras(u'Origine de la proposition'),normal_style)
    
    ppb = [Paragraph(gras(u'Problématique - Énoncé général du besoin'),normal_style)]
    ppb.append(splitParagraph(prj.attributs['PB'][1], info_style, Italic = True))

    pco = [Paragraph(gras(u'Contraintes imposées au projet'),normal_style)]
    pco.append(splitParagraph(prj.attributs['CCF'][1], info_style, Italic = True))

    ppig = Paragraph(gras(u'Intitulé des parties du projet confiées à chaque groupe'),normal_style)
    
    ppbg = Paragraph(gras(u'Énoncé du besoin pour la partie du projet confiée à chaque groupe'),normal_style)
    
    ppr = [Paragraph(gras(u'Production finale attendue'),normal_style)]
    ppr.append(splitParagraph(prj.attributs['OBJ'][1], info_style, Italic = True))
    
    
    # Colonne de droite
    contenu = [projet.intitule,
               projet.origine,
               projet.problematique,
               projet.contraintes,
               projet.intituleParties,
               projet.besoinParties,
               projet.production]
    p = []
    tot = 0
    for c in contenu:
        t = ellipsizer(c, LONG_MAX_FICHE_VALID)
        tot += len(t)
        normal_style.fontSize = max(8, 11 - int(len(t)/250))
        normal_style.leading = normal_style.fontSize * 1.2
        p.append(splitParagraph(t, normal_style))
        normal_style.fontSize = 10
        normal_style.leading = 12
    
    larg = max(50, min(150, 190*tot/800))*mm
    
    data= [[ppi, p[0]],
           [ppo, p[1]],
           [ppb, p[2]],
           [pco, p[3]],
           [ppig, p[4]],
           [ppbg, p[5]],
           [ppr, p[6]]]
           
    t=Table(data, style=[('GRID',        (0,0),(-1,-1),  1,colors.black),
                         ('VALIGN',      (0,0),(-1,-1), 'TOP')],
            colWidths = [None, larg])

    story.append(t)
    
    
    #
    # Zone des signatures
    #
    story.append(Spacer(1, 5*mm))
    V1 = [Paragraph(u"Visa du chef d’établissement", normal_style),
          Paragraph(u"(Nom, prénom, date et signature)", info_style)]
    V2 = [Paragraph(u"Visa du ou des IA-IPR", normal_style),
          Paragraph(u"(Noms, prénoms, qualités, dates et signatures)", info_style)]
    data= [[V1, V2]]
    t=Table(data,style=[('VALIGN',      (0,0),(-1,-1),'TOP')])
    story.append(t)
    
    try:
        doc.build(story)
    except doctemplate.LayoutError, err:
        print "Paragraphe trop grand"
#        print err.message
#        print type(err)
#        print dir(err)
        return False