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
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
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
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
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)
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
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)
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
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()
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
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
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
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
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