From 1cce5184fdd27e31d9d5d30d8a6be18d40000f7f Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 13:45:33 +0200 Subject: [PATCH 01/14] Add files via upload --- src/globs.py | 2 +- src/lang.py | 6 ++++-- src/main.py | 41 +++++++++++++++++++++++++++++++++++------ src/updater.py | 6 +++--- src/version.res | 10 +++++----- 5 files changed, 48 insertions(+), 17 deletions(-) diff --git a/src/globs.py b/src/globs.py index 742343e..e960336 100644 --- a/src/globs.py +++ b/src/globs.py @@ -27,7 +27,7 @@ import os # CNIRevelator version verType = "final release" -version = [3, 1, 3] +version = [3, 1, 4] verstring_full = "{}.{}.{} {}".format(version[0], version[1], version[2], verType) verstring = "{}.{}".format(version[0], version[1]) diff --git a/src/lang.py b/src/lang.py index 66505a7..fd49eab 100644 --- a/src/lang.py +++ b/src/lang.py @@ -141,7 +141,8 @@ french = \ "Coller :\t\t\t\tCtrl-V \n" "Forcer une nouvelle détection du document :\tEchap\n", -"CHANGELOG" : "Version 3.1.3 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug de la détection automatique de documents\n- Ajout d'une fonctionnalité de rapport d'erreur\n\n" + \ +"CHANGELOG" : "Version 3.1.4 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug affectant la rotation de documents dans l'afficheur d'images\n\n" + \ +"Version 3.1.3 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug de la détection automatique de documents\n- Ajout d'une fonctionnalité de rapport d'erreur\n\n" + \ "Version 3.1.2 \nMise-à-jour mineure avec les progressions suivantes :\n- Montée de version de Tesseract OCR : 5.0\n- Correction de noms des documents\n- Résolution d'un problème avec le système de mise-à-jour\n- Amélioration des effets sur images\n\n" + \ "Version 3.1.1 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug sévère du système de mise à jour\n\n" + \ "Version 3.1.0 \nMise-à-jour majeure avec les progressions suivantes :\n- Modifications cosmétiques de l'interface utilisateur\n- Stabilisation des changements effectués sur la version mineure 3.0 : interface utilisateur, OCR, VISA A et B, logging\n- Rationalisation du système de langues\n- Ajout des canaux de mise-à-jour\n\n" + \ @@ -846,7 +847,8 @@ english = \ "Paste:\t\t\t\tCtrl-V\n" "Force a new document detection:\tEchap\n", -"CHANGELOG" : "Version 3.1.3 \nMinor update with the following progressions:\n- Correction of a bug affecting automated document detection\n- Added bug reporting functionnality\n\n" + \ +"CHANGELOG" : "Version 3.1.4 \nMinor update with the following progressions:\n- Correction of a bug affecting rotation of document in image viewer\n\n" + \ +"Version 3.1.3 \nMinor update with the following progressions:\n- Correction of a bug affecting automated document detection\n- Added bug reporting functionnality\n\n" + \ "Version 3.1.2 \nMinor update with the following progressions: \n- Tesseract OCR version upgrade : 5.0\n- Correction of document names\n- Fixed a problem with the update system\n- Some enhancements about effects on images\n\n" + \ "Version 3.1.1 \nMinor update with the following progressions: \n- Fixed a severe bug in the update system\n\n" + \ "Version 3.1.0 \nMajor update with the following progressions: \n- Cosmetic modifications of the user interface \n- Stabilization of the changes made on the minor version 3.0 : user interface, OCR, VISA A and B, logging\n- Rationalization of the language system\n- Added update channels\n\n" + \ diff --git a/src/main.py b/src/main.py index 0274f76..67d9031 100644 --- a/src/main.py +++ b/src/main.py @@ -40,6 +40,7 @@ import PIL.Image, PIL.ImageTk import os, shutil import webbrowser import sys, os +import numpy import critical # critical.py import ihm # ihm.py @@ -370,7 +371,7 @@ class mainWindow(Tk): self.geometry('%dx%d+%d+%d' % (self.w, self.h, self.x, self.y)) self.update() self.deiconify() - self.attributes("-topmost", 1) + #self.attributes("-topmost", 1) self.maxsize(self.w, self.h) self.minsize(int(2.15 * (self.ws / 2 * 0.3333333333333333)), self.h) self.currentw = self.w @@ -426,6 +427,7 @@ class mainWindow(Tk): elif self.imageViewer.blackhat == 2: cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) cv_img = cv2.medianBlur(cv_img, 3) + try: # Get the image dimensions (OpenCV stores image data as NumPy ndarray) height, width, channels_no = cv_img.shape @@ -436,9 +438,9 @@ class mainWindow(Tk): height, width = cv_img.shape # Get the image dimensions (OpenCV stores image data as NumPy ndarray) height, width = cv_img.shape + # Rotate - rotationMatrix=cv2.getRotationMatrix2D((width/2, height/2),int(self.imageViewer.rotateCount*90),1) - cv_img=cv2.warpAffine(cv_img,rotationMatrix,(width,height)) + cv_img, width, height = self.rotateBound(cv_img, int(self.imageViewer.rotateCount*90)) # Resize dim = (int(width * (self.imageViewer.imgZoom + 100) / 100), int(height * (self.imageViewer.imgZoom + 100) / 100)) cv_img = cv2.resize(cv_img, dim, interpolation = cv2.INTER_AREA) @@ -932,6 +934,32 @@ class mainWindow(Tk): self.imageViewer.blackhat = 0 self.resizeScan(cv_img) + def rotateBound(self, image, angle): + """ + Computes the rotation matrix and the new shapes in order to rotate an image + """ + # grab the dimensions of the image and then determine the + # center + (h, w) = image.shape[:2] + (cX, cY) = (w // 2, h // 2) + + # grab the rotation matrix , then grab the sine and cosine + # (i.e., the rotation components of the matrix) + M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0) + cos = numpy.abs(M[0, 0]) + sin = numpy.abs(M[0, 1]) + + # compute the new bounding dimensions of the image + nW = int((h * sin) + (w * cos)) + nH = int((h * cos) + (w * sin)) + + # adjust the rotation matrix to take into account translation + M[0, 2] += (nW / 2) - cX + M[1, 2] += (nH / 2) - cY + + # perform the actual rotation and return the image + return cv2.warpAffine(image, M, (nW, nH)), nW, nH + def resizeScan(self, cv_img = None): """ Reloads the image according to settings @@ -948,7 +976,7 @@ class mainWindow(Tk): elif self.imageViewer.blackhat == 2: cv_img = cv2.cvtColor(cv_img, cv2.COLOR_BGR2GRAY) cv_img = cv2.medianBlur(cv_img, 3) - + try: # Get the image dimensions (OpenCV stores image data as NumPy ndarray) height, width, channels_no = cv_img.shape @@ -959,12 +987,13 @@ class mainWindow(Tk): height, width = cv_img.shape # Get the image dimensions (OpenCV stores image data as NumPy ndarray) height, width = cv_img.shape + # Rotate - rotationMatrix=cv2.getRotationMatrix2D((width/2, height/2),int(self.imageViewer.rotateCount*90),1) - cv_img=cv2.warpAffine(cv_img,rotationMatrix,(width,height)) + cv_img, width, height = self.rotateBound(cv_img, int(self.imageViewer.rotateCount*90)) # Resize dim = (int(width * (self.imageViewer.imgZoom + 100) / 100), int(height * (self.imageViewer.imgZoom + 100) / 100)) cv_img = cv2.resize(cv_img, dim, interpolation = cv2.INTER_AREA) + # Use PIL (Pillow) to convert the NumPy ndarray to a PhotoImage photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(cv_img)) self.DisplayUpdate( photo) diff --git a/src/updater.py b/src/updater.py index 4f69f94..e8ef15d 100644 --- a/src/updater.py +++ b/src/updater.py @@ -332,7 +332,7 @@ def umain(): if len(sys.argv) > 2 and str(sys.argv[1]) == "DELETE": globs.CNIRNewVersion = True launcherWindow.printmsg(lang.all[globs.CNIRlang]["Deleting old version"]) - logfile.printdbg("Old install detected : {}".format(sys.argv[1])) + logfile.printdbg("Old install detected : {}".format(sys.argv[2])) while os.path.exists(str(sys.argv[2])): try: shutil.rmtree(str(sys.argv[2])) @@ -359,7 +359,7 @@ def umain(): # check we want open a file elif len(sys.argv) > 1 and str(sys.argv[1]) != "DELETE": globs.CNIROpenFile = True - print(sys.argv) + logfile.printdbg("Command line received : {}".format(sys.argv)) try: try: @@ -415,7 +415,7 @@ def umain(): except: critical.crashCNIR() launcherWindow.exit() - sys.exit(2) + exitProcess(2) return 2 time.sleep(2) diff --git a/src/version.res b/src/version.res index 43adb08..289e4fc 100644 --- a/src/version.res +++ b/src/version.res @@ -6,8 +6,8 @@ VSVersionInfo( ffi=FixedFileInfo( # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) # Set not needed items to zero 0. -filevers=(3, 1, 3, 0), -prodvers=(3, 1, 3, 0), +filevers=(3, 1, 4, 0), +prodvers=(3, 1, 4, 0), # Contains a bitmask that specifies the valid bits 'flags'r mask=0x3f, # Contains a bitmask that specifies the Boolean attributes of the file. @@ -31,12 +31,12 @@ StringFileInfo( u'040904B0', [StringStruct(u'CompanyName', u'Adrien Bourmault (neox95)'), StringStruct(u'FileDescription', u'This file is part of CNIRevelator.'), - StringStruct(u'FileVersion', u'3.1.3'), + StringStruct(u'FileVersion', u'3.1.4'), StringStruct(u'InternalName', u'CNIRevelator'), StringStruct(u'LegalCopyright', u'Copyright (c) Adrien Bourmault (neox95)'), StringStruct(u'OriginalFilename', u'CNIRevelator.exe'), - StringStruct(u'ProductName', u'CNIRevelator 3'), - StringStruct(u'ProductVersion', u'3.1.3')]) + StringStruct(u'ProductName', u'CNIRevelator 3.1'), + StringStruct(u'ProductVersion', u'3.1.4')]) ]), VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) ] From 98cae9b951450a526f3f909d2e37905f76820659 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 13:46:00 +0200 Subject: [PATCH 02/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 5a70410..0eba209 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.3|https://github.com/neox95/CNIRevelator/releases/download/3.1.3e/CNIRevelator.zip|f42bb2cc8e72aa21caae4ea058ca1603e4153f48|| +3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4b/CNIRevelator.zip|ce1feb6a2eed11b1697e7488cad5e698d1d70ea9|| From 30e1b15dd18fdf81c2c62d5a7bcb60f34d801fa4 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 16:50:51 +0200 Subject: [PATCH 04/14] Added temporization on update to prevent updating every launch --- src/globs.py | 17 +--------------- src/updater.py | 55 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 45 insertions(+), 27 deletions(-) diff --git a/src/globs.py b/src/globs.py index e960336..bb8f289 100644 --- a/src/globs.py +++ b/src/globs.py @@ -31,22 +31,6 @@ version = [3, 1, 4] verstring_full = "{}.{}.{} {}".format(version[0], version[1], version[2], verType) verstring = "{}.{}".format(version[0], version[1]) -CNIRTesserHash = '5b58db27f7bc08c58a2cb33d01533b034b067cf8' -CNIRFolder = os.getcwd() -CNIRLColor = "#006699" -CNIRName = "CNIRevelator {}".format(verstring) -CNIRCryptoKey = '82Xh!efX3#@P~2eG' -CNIRNewVersion = False - -CNIRConfig = CNIRFolder + '\\config\\conf.ig' -CNIRTesser = CNIRFolder + '\\Tesseract-OCR5\\' -CNIRErrLog = CNIRFolder + '\\logs\\error.log' -CNIRMainLog = CNIRFolder + '\\logs\\main.log' -CNIRUrlConfig = CNIRFolder + '\\config\\urlconf.ig' -CNIRVerStock = CNIRFolder + '\\downloads\\versions.lst' -CNIREnv = CNIRFolder + '\\Data\\' - - CNIRTesserHash = '947224361ffab8c01f05c9394b44b1bd7c8c3d4d' CNIRFolder = os.path.dirname(os.path.realpath(__file__)) CNIRLColor = "#006699" @@ -61,6 +45,7 @@ CNIRTesser = CNIRFolder + '\\Tesseract-OCR5\\' CNIRErrLog = CNIRFolder + '\\logs\\error.log' CNIRMainLog = CNIRFolder + '\\logs\\main.log' CNIRUrlConfig = CNIRFolder + '\\config\\urlconf.ig' +CNIRLastUpdate = CNIRFolder + '\\config\\lastupdate.ig' CNIRVerStock = CNIRFolder + '\\downloads\\versions.lst' CNIREnv = CNIRFolder + '\\Data\\' diff --git a/src/updater.py b/src/updater.py index e8ef15d..ac30b06 100644 --- a/src/updater.py +++ b/src/updater.py @@ -36,6 +36,7 @@ import zipfile import hashlib import subprocess import psutil +import datetime import critical # critical.py import github # github.py @@ -316,17 +317,6 @@ def umain(): # Global Handlers logfile = logger.logCur - - credentials = downloader.newcredentials() - - if not credentials.valid: - logfile.printerr("Credentials Error. No effective update !") - launcherWindow.printmsg(lang.all[globs.CNIRlang]["Credentials Error. No effective update !"]) - time.sleep(2) - launcherWindow.exit() - return 0 - - github.credentials = credentials # Cleaner for the old version if detected if len(sys.argv) > 2 and str(sys.argv[1]) == "DELETE": @@ -361,6 +351,49 @@ def umain(): globs.CNIROpenFile = True logfile.printdbg("Command line received : {}".format(sys.argv)) + credentials = downloader.newcredentials() + + if not credentials.valid: + logfile.printerr("Credentials Error. No effective update !") + launcherWindow.printmsg(lang.all[globs.CNIRlang]["Credentials Error. No effective update !"]) + time.sleep(2) + launcherWindow.exit() + return 0 + + github.credentials = credentials + + # Check if update is needed + currentDate = datetime.datetime.now() + + if os.path.isfile(globs.CNIRLastUpdate): + with open(globs.CNIRLastUpdate, 'r') as (configFile): + try: + # Reading it + lastUpdate = datetime.datetime.strptime(configFile.read(),"%d/%m/%Y") + except Exception as e: + critical.crashCNIR() + raise IOError(str(e)) + else: + # Recreating the url file + lastUpdate = currentDate + try: + os.mkdir(globs.CNIRFolder + '\\config') + except: + pass + + with open(globs.CNIRLastUpdate, 'w') as (configFile): + try: + # Writing it + configFile.write("{}/{}/{}".format(currentDate.day, currentDate.month, currentDate.year)) + except Exception as e: + critical.crashCNIR() + raise IOError(str(e)) + + if (currentDate - lastUpdate).min !=0 and (currentDate - lastUpdate).days < 7: + launcherWindow.exit() + return 0 + + # Update batch try: try: # EXECUTING THE UPDATE BATCH From b69e312cf77ef28ca99e4eb6f5170e4cd25408b2 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Mon, 26 Aug 2019 16:54:03 +0200 Subject: [PATCH 05/14] Add files via upload --- CNIRevelator Documentation.docx | Bin 1446731 -> 1445076 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/CNIRevelator Documentation.docx b/CNIRevelator Documentation.docx index d361ab2d6a00b24c98d2da5f8ab7e95ead3bd525..91a978fbb3f35814497944aeba0cb85fca1970c7 100644 GIT binary patch delta 24109 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 delta 25650 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 Date: Mon, 26 Aug 2019 16:58:08 +0200 Subject: [PATCH 06/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 0eba209..03c1756 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4b/CNIRevelator.zip|ce1feb6a2eed11b1697e7488cad5e698d1d70ea9|| +3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4c/CNIRevelator.zip|630419cf9c89d38d9801b21fd302a15b42862f04|| From f44fd1add724ebd010ac039014b7a301964dfa23 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 09:26:16 +0200 Subject: [PATCH 07/14] Release 3.1.4 --- src/lang.py | 4 ++-- src/updater.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lang.py b/src/lang.py index fd49eab..8de56b4 100644 --- a/src/lang.py +++ b/src/lang.py @@ -141,7 +141,7 @@ french = \ "Coller :\t\t\t\tCtrl-V \n" "Forcer une nouvelle détection du document :\tEchap\n", -"CHANGELOG" : "Version 3.1.4 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug affectant la rotation de documents dans l'afficheur d'images\n\n" + \ +"CHANGELOG" : "Version 3.1.4 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug affectant la rotation de documents dans l'afficheur d'images\n- Ajout d'une période de mise-à-jour afin d'éviter de rechercher les mises-à-jour tous les jours\n\n" + \ "Version 3.1.3 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug de la détection automatique de documents\n- Ajout d'une fonctionnalité de rapport d'erreur\n\n" + \ "Version 3.1.2 \nMise-à-jour mineure avec les progressions suivantes :\n- Montée de version de Tesseract OCR : 5.0\n- Correction de noms des documents\n- Résolution d'un problème avec le système de mise-à-jour\n- Amélioration des effets sur images\n\n" + \ "Version 3.1.1 \nMise-à-jour mineure avec les progressions suivantes :\n- Correction d'un bug sévère du système de mise à jour\n\n" + \ @@ -847,7 +847,7 @@ english = \ "Paste:\t\t\t\tCtrl-V\n" "Force a new document detection:\tEchap\n", -"CHANGELOG" : "Version 3.1.4 \nMinor update with the following progressions:\n- Correction of a bug affecting rotation of document in image viewer\n\n" + \ +"CHANGELOG" : "Version 3.1.4 \nMinor update with the following progressions:\n- Correction of a bug affecting rotation of document in image viewer\n- Added a new update period to prevent updating everyday\n\n" + \ "Version 3.1.3 \nMinor update with the following progressions:\n- Correction of a bug affecting automated document detection\n- Added bug reporting functionnality\n\n" + \ "Version 3.1.2 \nMinor update with the following progressions: \n- Tesseract OCR version upgrade : 5.0\n- Correction of document names\n- Fixed a problem with the update system\n- Some enhancements about effects on images\n\n" + \ "Version 3.1.1 \nMinor update with the following progressions: \n- Fixed a severe bug in the update system\n\n" + \ diff --git a/src/updater.py b/src/updater.py index ac30b06..5ca8d0e 100644 --- a/src/updater.py +++ b/src/updater.py @@ -389,7 +389,7 @@ def umain(): critical.crashCNIR() raise IOError(str(e)) - if (currentDate - lastUpdate).min !=0 and (currentDate - lastUpdate).days < 7: + if not globs.CNIRNewVersion and os.path.exists(globs.CNIRFolder + '\\Tesseract-OCR5\\') and (currentDate - lastUpdate).days < 7: launcherWindow.exit() return 0 From b78d2842bfb4d9a1645f116568968b165a7b542e Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 09:34:18 +0200 Subject: [PATCH 08/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 03c1756..c157408 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4c/CNIRevelator.zip|630419cf9c89d38d9801b21fd302a15b42862f04|| +3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4d/CNIRevelator.zip|8a52a51a6b608279bc6417eec25f9a9140e6b392|| From 7aed2c66232900c0093bc5d67c870974b8b9ae0c Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 09:37:15 +0200 Subject: [PATCH 09/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index c157408..289bcf0 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ -# ver|url|checksum, and | as separator, one version per || +# ver|url|checksum, and | as separator, one version per || 3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4d/CNIRevelator.zip|8a52a51a6b608279bc6417eec25f9a9140e6b392|| From a7a22be15250c6dfe2781eb029c757d225e66edf Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 09:37:49 +0200 Subject: [PATCH 10/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 289bcf0..3a0b8b9 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ -# ver|url|checksum, and | as separator, one version per || +# ver|url|checksum, and | as separator, one version per || 3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4d/CNIRevelator.zip|8a52a51a6b608279bc6417eec25f9a9140e6b392|| From 072f1a251015338921a5b7b2325d489cc1c48efc Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 13:24:12 +0200 Subject: [PATCH 11/14] Correction of a bug in bug reporting system --- src/critical.py | 3 ++- src/github.py | 10 +++++++++- src/globs.py | 5 +++-- src/main.py | 4 +++- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/critical.py b/src/critical.py index d04f643..74cb1d2 100644 --- a/src/critical.py +++ b/src/critical.py @@ -57,12 +57,13 @@ def crashCNIR(shutdown=True): with open(globs.CNIRMainLog, 'r') as file: data = file.read() except: - pass + logfile.printerr("Can't read the log file.") # send it success = github.reportBug(traceback.format_exc(), data) if not success: + logfile.printerr("Can't send to Github.") res = askquestion(lang.all[globs.CNIRlang]["CNIRevelator Fatal Eror"], lang.all[globs.CNIRlang]["Would you like to open the log file ?"]) if res == "yes": webbrowser.open_new(globs.CNIRErrLog) diff --git a/src/github.py b/src/github.py index 47c4730..1fd0e88 100644 --- a/src/github.py +++ b/src/github.py @@ -28,18 +28,26 @@ from pypac import PACSession from requests import Session import json +import logger # logger.py +import globs # globs.py + credentials = False def reportBug(reason="",log=""): + logfile = logger.logCur + if not credentials: + logfile.printerr("No credentials") return False session = credentials.sessionHandler payload = {'title':"CNIRevelator Bug Report", 'body':"**An error has been reported by a CNIRevelator instance.**\n\n**Here is the full reason of this issue:**\n{}\n\n**The full log is here:** {}".format(reason, log), "assignees":["neox95"], "labels":["bug", "AUTO"]} - handler = session.post('https://api.github.com/repos/neox95/cnirevelator/issues', headers={'Authorization': 'token %s' % "1a3c589eafc2b6557a1da852a3b2cc279bd5bf33"}, data=json.dumps(payload)) + handler = session.post('https://api.github.com/repos/neox95/cnirevelator/issues', headers={'Authorization': 'token %s' % globs.CNIRGitToken}, data=json.dumps(payload)) + + logfile.printdbg(handler.reason) if handler.reason == "Created": return True diff --git a/src/globs.py b/src/globs.py index bb8f289..8909ecd 100644 --- a/src/globs.py +++ b/src/globs.py @@ -26,12 +26,13 @@ import os # CNIRevelator version -verType = "final release" +verType = "stable release" version = [3, 1, 4] verstring_full = "{}.{}.{} {}".format(version[0], version[1], version[2], verType) verstring = "{}.{}".format(version[0], version[1]) -CNIRTesserHash = '947224361ffab8c01f05c9394b44b1bd7c8c3d4d' +CNIRTesserHash = "947224361ffab8c01f05c9394b44b1bd7c8c3d4d" +CNIRGitToken = "23027ea52a48016d56f4ef759b8609981d564a46" CNIRFolder = os.path.dirname(os.path.realpath(__file__)) CNIRLColor = "#006699" CNIRName = "CNIRevelator {}".format(verstring) diff --git a/src/main.py b/src/main.py index 67d9031..6430527 100644 --- a/src/main.py +++ b/src/main.py @@ -385,7 +385,8 @@ class mainWindow(Tk): self.imageViewer.pagenumber = 0 # Some bindings - self.bind('', self.entryValidation) + self.bind('', self.entryValidation) + self.termtext.bind('', self.entryValidation) self.termtext.bind('<>', self.pasteValidation) self.speed731text.bind('', self.speedValidation) self.imageViewer.ZONE.bind("", self.rectangleSelectScan) @@ -632,6 +633,7 @@ class mainWindow(Tk): if not regex.fullmatch(event.char): self.logOnTerm(lang.all[globs.CNIRlang]["Character not accepted !\n"]) return "break" + # Adds the entry tempChar = self.termtext.get("1.0", "end")[:-1] self.mrzChar = tempChar[:pos+1] + event.char + tempChar[pos+1:] + '\n' From 5e616e52839fdd5a2f7f1d8c53b59304ae5d59e3 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 13:30:16 +0200 Subject: [PATCH 12/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index 3a0b8b9..feccdb6 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4d/CNIRevelator.zip|8a52a51a6b608279bc6417eec25f9a9140e6b392|| +3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4e/CNIRevelator.zip|f2059f834cf70ff6ba9bc09fcdd5af8243327255|| From 6a7d8ea5fb15b219467c07c5f5232655283b5482 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 14:06:33 +0200 Subject: [PATCH 13/14] Correcting bug reporting bug ;) --- src/globs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/globs.py b/src/globs.py index 8909ecd..b7dbe85 100644 --- a/src/globs.py +++ b/src/globs.py @@ -32,7 +32,7 @@ verstring_full = "{}.{}.{} {}".format(version[0], version[1], version[2], v verstring = "{}.{}".format(version[0], version[1]) CNIRTesserHash = "947224361ffab8c01f05c9394b44b1bd7c8c3d4d" -CNIRGitToken = "23027ea52a48016d56f4ef759b8609981d564a46" +CNIRGitToken = "ef7737dd1e5ad8a35d3cc5fdbeb273e69a09f25f" CNIRFolder = os.path.dirname(os.path.realpath(__file__)) CNIRLColor = "#006699" CNIRName = "CNIRevelator {}".format(verstring) From 1fe97b425a1b934580bb73f48d92d49a0d251e40 Mon Sep 17 00:00:00 2001 From: Adrien Bourmault Date: Tue, 27 Aug 2019 14:07:31 +0200 Subject: [PATCH 14/14] Update VERSIONS.LST --- VERSIONS.LST | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSIONS.LST b/VERSIONS.LST index feccdb6..d2ca4a2 100644 --- a/VERSIONS.LST +++ b/VERSIONS.LST @@ -1,2 +1,2 @@ # ver|url|checksum, and | as separator, one version per || -3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4e/CNIRevelator.zip|f2059f834cf70ff6ba9bc09fcdd5af8243327255|| +3.1.4|https://github.com/neox95/CNIRevelator/releases/download/3.1.4e/CNIRevelator.zip|1acf3b6158506218b0b16948af1df51b11d81eea||