modulitiz-micro 2.40.0__py311-none-any.whl → 2.42.0__py311-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- modulitiz_micro/ModuloMeteo.py +72 -72
- modulitiz_micro/ModuloSeriale.py +70 -70
- modulitiz_micro/ModuloTarghe.py +47 -46
- modulitiz_micro/database/AbstractDatabaseService.py +13 -13
- modulitiz_micro/database/AbstractSql.py +69 -69
- modulitiz_micro/database/ModuloSqlOracle.py +19 -19
- modulitiz_micro/database/ModuloSqlServer.py +43 -43
- modulitiz_micro/database/eccezioni/EccezioneDbNoData.py +6 -6
- modulitiz_micro/database/mysql/AbstractBasicMysql.py +114 -114
- modulitiz_micro/database/mysql/ModuloMysql.py +163 -163
- modulitiz_micro/database/mysql/MysqlCommonConverter.py +47 -47
- modulitiz_micro/database/mysql/eccezioni/EccezioneMysqlOffline.py +6 -6
- modulitiz_micro/database/sqlite/AbstractBasicSQLite.py +114 -114
- modulitiz_micro/database/sqlite/ModuloSQLite.py +82 -82
- modulitiz_micro/eccezioni/EccezioneCtrlC.py +7 -7
- modulitiz_micro/eccezioni/EccezioneScheduler.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttp.py +8 -8
- modulitiz_micro/eccezioni/http/EccezioneHttp404.py +7 -7
- modulitiz_micro/eccezioni/http/EccezioneHttpGeneric.py +7 -7
- modulitiz_micro/files/cache/DatabaseCache.py +91 -91
- modulitiz_micro/files/cache/decorators/cacheRam.py +26 -26
- modulitiz_micro/files/git/ModuloGit.py +28 -28
- modulitiz_micro/files/git/decorators/catchAndRaiseGitExceptions.py +19 -19
- modulitiz_micro/files/git/exceptions/EccezioneGit.py +7 -7
- modulitiz_micro/gestionedom/GestioneDom.py +44 -44
- modulitiz_micro/iot/ModuleIotDevice.py +4 -4
- modulitiz_micro/keylogger/EccezioneKeyLogger.py +7 -7
- modulitiz_micro/keylogger/ModuloKeylogger.py +73 -73
- modulitiz_micro/rete/ModuloNetworking.py +72 -72
- modulitiz_micro/rete/ModuloOpenVpn.py +15 -15
- modulitiz_micro/rete/email/EmailBean.py +5 -5
- modulitiz_micro/rete/email/ModuloEmail.py +90 -90
- modulitiz_micro/rete/http/ModuloHttp.py +119 -119
- modulitiz_micro/rete/http/ModuloHttpConnectionSafe.py +91 -91
- modulitiz_micro/rete/http/ModuloHttpUtils.py +69 -69
- modulitiz_micro/rete/http/beans/HttpResponseBean.py +5 -5
- modulitiz_micro/rete/http/decorators/catchAndRaiseHttpExceptions.py +22 -22
- modulitiz_micro/rete/ntp/AbstractModuloNtp.py +73 -73
- modulitiz_micro/rete/ntp/ModuloNtpIt.py +8 -8
- modulitiz_micro/rete/socketserver/AbstractBasicGetSocketServer.py +35 -35
- modulitiz_micro/rete/socketserver/AbstractSocketServer.py +267 -267
- modulitiz_micro/rete/ssl/ModuloSsl.py +56 -56
- modulitiz_micro/sistema/ModuloEnvVars.py +34 -34
- modulitiz_micro/sistema/ModuloSystemPipe.py +67 -67
- modulitiz_micro/social/telegram/AbstractModuloTelegram.py +53 -53
- modulitiz_micro/social/telegram/ModuloTelegramSimple.py +26 -26
- modulitiz_micro/util/beans/globalvar/AbstractBasicGlobalVarBean.py +15 -15
- modulitiz_micro/util/scheduler/{AbstractScheduler.py → ModuleScheduler.py} +26 -32
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info}/METADATA +58 -65
- modulitiz_micro-2.42.0.dist-info/RECORD +56 -0
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info}/WHEEL +1 -1
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info/licenses}/LICENSE +21 -21
- modulitiz_micro/ModuleEnum.py +0 -8
- modulitiz_micro/ModuloBase64.py +0 -61
- modulitiz_micro/ModuloColorText.py +0 -35
- modulitiz_micro/ModuloDate.py +0 -295
- modulitiz_micro/ModuloFunzioni.py +0 -71
- modulitiz_micro/ModuloListe.py +0 -150
- modulitiz_micro/ModuloNumeri.py +0 -127
- modulitiz_micro/ModuloPyinstaller.py +0 -29
- modulitiz_micro/ModuloStatistiche.py +0 -31
- modulitiz_micro/ModuloStringhe.py +0 -180
- modulitiz_micro/android/ModuloAndroid.py +0 -18
- modulitiz_micro/android/ModuloAndroidAdb.py +0 -48
- modulitiz_micro/android/ModuloAndroidSim.py +0 -130
- modulitiz_micro/android/beans/SmsBean.py +0 -12
- modulitiz_micro/android/enums/AndroidSmsTypeEnum.py +0 -17
- modulitiz_micro/eccezioni/EccezioneBase.py +0 -7
- modulitiz_micro/eccezioni/EccezioneRuntime.py +0 -7
- modulitiz_micro/eccezioni/EccezioneSoNonSupportato.py +0 -7
- modulitiz_micro/files/ModuloFiles.py +0 -173
- modulitiz_micro/files/ModuloLogging.py +0 -69
- modulitiz_micro/files/ModuloZip.py +0 -42
- modulitiz_micro/files/cache/CacheBean.py +0 -5
- modulitiz_micro/files/cache/CacheRam.py +0 -29
- modulitiz_micro/init/AbstractBasicInit.py +0 -27
- modulitiz_micro/init/AbstractInit.py +0 -11
- modulitiz_micro/multithread/ModuloThread.py +0 -26
- modulitiz_micro/multithread/ModuloThreadLogger.py +0 -8
- modulitiz_micro/multithread/ModuloThreadWithCallbackError.py +0 -25
- modulitiz_micro/nlp/ModuloNlp.py +0 -36
- modulitiz_micro/nlp/ModuloNlpDateAndTime.py +0 -59
- modulitiz_micro/sistema/EnvVarsEnum.py +0 -9
- modulitiz_micro/sistema/ModuloSystem.py +0 -298
- modulitiz_micro/util/beans/conf/AbstractBasicConfBean.py +0 -11
- modulitiz_micro/util/beans/conf/AbstractConfBean.py +0 -16
- modulitiz_micro/util/beans/fileconf/AbstractBasicFileConfBean.py +0 -11
- modulitiz_micro/util/beans/fileconf/AbstractFileConfBean.py +0 -13
- modulitiz_micro/util/beans/globalvar/AbstractGlobalVarBean.py +0 -34
- modulitiz_micro/util/decorators/noAwait.py +0 -23
- modulitiz_micro/util/pip/AbstractModuloPip.py +0 -41
- modulitiz_micro/util/pip/ModuloPip.py +0 -49
- modulitiz_micro/util/spooler/AbstractSpooler.py +0 -14
- modulitiz_micro/util/spooler/Spooler.py +0 -18
- modulitiz_micro/util/spooler/beans/QueueBean.py +0 -8
- modulitiz_micro/util/spooler/decorators/spooler.py +0 -49
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpooler.py +0 -7
- modulitiz_micro/util/spooler/eccezioni/EccezioneSpoolerFull.py +0 -7
- modulitiz_micro/util/unittesting/AbstractOverrideTestUtil.py +0 -31
- modulitiz_micro/util/unittesting/AbstractTestUtil.py +0 -11
- modulitiz_micro/util/unittesting/ModuloRunUnitTest.py +0 -25
- modulitiz_micro/util/wheel/ModuloBuildWheel.py +0 -118
- modulitiz_micro/util/wheel/ModuloCheckTestNamingConvention.py +0 -89
- modulitiz_micro/util/wheel/ModuloToml.py +0 -40
- modulitiz_micro/util/wheel/ModuloWheel.py +0 -12
- modulitiz_micro-2.40.0.dist-info/RECORD +0 -109
- {modulitiz_micro-2.40.0.dist-info → modulitiz_micro-2.42.0.dist-info}/top_level.txt +0 -0
modulitiz_micro/ModuloMeteo.py
CHANGED
@@ -1,72 +1,72 @@
|
|
1
|
-
import json
|
2
|
-
|
3
|
-
from
|
4
|
-
from
|
5
|
-
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
6
|
-
from
|
7
|
-
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
8
|
-
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
9
|
-
|
10
|
-
|
11
|
-
class ModuloMeteo(object):
|
12
|
-
"""
|
13
|
-
Utility di gestione delle previsioni meteo.
|
14
|
-
"""
|
15
|
-
OPZIONI="lang=it&units=metric"
|
16
|
-
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
17
|
-
|
18
|
-
__URL_BASE="https://api.openweathermap.org"
|
19
|
-
URL_ATTUALE=__URL_BASE+f"/data/2.5/weather?{OPZIONI}&{KEY}&q="
|
20
|
-
URL_PREVISIONE=__URL_BASE+f"/data/2.5/forecast?{OPZIONI}&{KEY}&q="
|
21
|
-
|
22
|
-
def __init__(self,logger:ModuloLogging):
|
23
|
-
self.__logger=logger
|
24
|
-
|
25
|
-
def getPrevisionePioggiaFinoADomani(self,citta:str,codStato:str)->list|None:
|
26
|
-
"""
|
27
|
-
Chiede le previsioni fino al giorno dopo e mostra solo i risultati che dicono che pioverà.
|
28
|
-
"""
|
29
|
-
adesso=ModuloDate.now()
|
30
|
-
domani=ModuloDate.setEndOfDay(ModuloDate.plusMinusDays(adesso,1))
|
31
|
-
oreDiff=ModuloDate.hoursDiff(domani, adesso)
|
32
|
-
elementi=self.__getPrevisioni(citta, codStato,True,None,oreDiff)
|
33
|
-
if elementi is None:
|
34
|
-
return None
|
35
|
-
# filtro gli elementi
|
36
|
-
lista=[]
|
37
|
-
for elem in elementi:
|
38
|
-
if ModuloListe.collectionSafeGet(elem,'rain') is not None:
|
39
|
-
lista.append(elem)
|
40
|
-
return lista
|
41
|
-
|
42
|
-
def __getPrevisioni(self,citta:str,codStato:str,includiPrimaPrevisione:bool,stepHours:int|None,maxHours:int)->list|None:
|
43
|
-
cittaEStato=citta+","+codStato
|
44
|
-
url=self.URL_PREVISIONE+ModuloHttpUtils.encodeUrl(cittaEStato)
|
45
|
-
http=ModuloHttp(url,self.__logger,False)
|
46
|
-
try:
|
47
|
-
response=http.doGet(0,False)
|
48
|
-
except EccezioneHttpGeneric:
|
49
|
-
return None
|
50
|
-
responseObj=json.loads(response.responseBody)
|
51
|
-
lista=responseObj['list']
|
52
|
-
maxLista=len(lista)
|
53
|
-
# calcolo gli indici
|
54
|
-
if maxHours is not None:
|
55
|
-
maxInd=int(maxHours/3)+1
|
56
|
-
if maxInd>=maxLista:
|
57
|
-
maxInd=maxLista-1
|
58
|
-
else:
|
59
|
-
maxInd=maxLista-1
|
60
|
-
if stepHours is None:
|
61
|
-
step=1
|
62
|
-
else:
|
63
|
-
step=int(stepHours/3)
|
64
|
-
inds=list(range(4,maxInd,step))
|
65
|
-
if includiPrimaPrevisione:
|
66
|
-
inds.insert(0,1)
|
67
|
-
# processo il json
|
68
|
-
output=[]
|
69
|
-
for ind in inds:
|
70
|
-
elem=lista[ind]
|
71
|
-
output.append(elem)
|
72
|
-
return output
|
1
|
+
import json
|
2
|
+
|
3
|
+
from modulitiz_nano.ModuloDate import ModuloDate
|
4
|
+
from modulitiz_nano.ModuloListe import ModuloListe
|
5
|
+
from modulitiz_micro.eccezioni.http.EccezioneHttpGeneric import EccezioneHttpGeneric
|
6
|
+
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
7
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
8
|
+
from modulitiz_micro.rete.http.ModuloHttpUtils import ModuloHttpUtils
|
9
|
+
|
10
|
+
|
11
|
+
class ModuloMeteo(object):
|
12
|
+
"""
|
13
|
+
Utility di gestione delle previsioni meteo.
|
14
|
+
"""
|
15
|
+
OPZIONI="lang=it&units=metric"
|
16
|
+
KEY="appid=e28cd365c35c12e3ed8f2d84e04398c9"
|
17
|
+
|
18
|
+
__URL_BASE="https://api.openweathermap.org"
|
19
|
+
URL_ATTUALE=__URL_BASE+f"/data/2.5/weather?{OPZIONI}&{KEY}&q="
|
20
|
+
URL_PREVISIONE=__URL_BASE+f"/data/2.5/forecast?{OPZIONI}&{KEY}&q="
|
21
|
+
|
22
|
+
def __init__(self,logger:ModuloLogging):
|
23
|
+
self.__logger=logger
|
24
|
+
|
25
|
+
def getPrevisionePioggiaFinoADomani(self,citta:str,codStato:str)->list|None:
|
26
|
+
"""
|
27
|
+
Chiede le previsioni fino al giorno dopo e mostra solo i risultati che dicono che pioverà.
|
28
|
+
"""
|
29
|
+
adesso=ModuloDate.now()
|
30
|
+
domani=ModuloDate.setEndOfDay(ModuloDate.plusMinusDays(adesso,1))
|
31
|
+
oreDiff=ModuloDate.hoursDiff(domani, adesso)
|
32
|
+
elementi=self.__getPrevisioni(citta, codStato,True,None,oreDiff)
|
33
|
+
if elementi is None:
|
34
|
+
return None
|
35
|
+
# filtro gli elementi
|
36
|
+
lista=[]
|
37
|
+
for elem in elementi:
|
38
|
+
if ModuloListe.collectionSafeGet(elem,'rain') is not None:
|
39
|
+
lista.append(elem)
|
40
|
+
return lista
|
41
|
+
|
42
|
+
def __getPrevisioni(self,citta:str,codStato:str,includiPrimaPrevisione:bool,stepHours:int|None,maxHours:int)->list|None:
|
43
|
+
cittaEStato=citta+","+codStato
|
44
|
+
url=self.URL_PREVISIONE+ModuloHttpUtils.encodeUrl(cittaEStato)
|
45
|
+
http=ModuloHttp(url,self.__logger,False)
|
46
|
+
try:
|
47
|
+
response=http.doGet(0,False)
|
48
|
+
except EccezioneHttpGeneric:
|
49
|
+
return None
|
50
|
+
responseObj=json.loads(response.responseBody)
|
51
|
+
lista=responseObj['list']
|
52
|
+
maxLista=len(lista)
|
53
|
+
# calcolo gli indici
|
54
|
+
if maxHours is not None:
|
55
|
+
maxInd=int(maxHours/3)+1
|
56
|
+
if maxInd>=maxLista:
|
57
|
+
maxInd=maxLista-1
|
58
|
+
else:
|
59
|
+
maxInd=maxLista-1
|
60
|
+
if stepHours is None:
|
61
|
+
step=1
|
62
|
+
else:
|
63
|
+
step=int(stepHours/3)
|
64
|
+
inds=list(range(4,maxInd,step))
|
65
|
+
if includiPrimaPrevisione:
|
66
|
+
inds.insert(0,1)
|
67
|
+
# processo il json
|
68
|
+
output=[]
|
69
|
+
for ind in inds:
|
70
|
+
elem=lista[ind]
|
71
|
+
output.append(elem)
|
72
|
+
return output
|
modulitiz_micro/ModuloSeriale.py
CHANGED
@@ -1,70 +1,70 @@
|
|
1
|
-
import serial
|
2
|
-
|
3
|
-
from
|
4
|
-
from
|
5
|
-
|
6
|
-
|
7
|
-
class ModuloSeriale(object):
|
8
|
-
"""
|
9
|
-
Utility di gestione dela connessione seriale RS232
|
10
|
-
"""
|
11
|
-
|
12
|
-
COM_PORTS=[]
|
13
|
-
|
14
|
-
def __init__(self):
|
15
|
-
self.connessione=None
|
16
|
-
|
17
|
-
@classmethod
|
18
|
-
def populate(cls):
|
19
|
-
"""
|
20
|
-
Popola le variabili di classe.
|
21
|
-
"""
|
22
|
-
if ModuloSystem.isWindows():
|
23
|
-
COM_PORTS=cls.__generaElencoPorte("COM",1)
|
24
|
-
else:
|
25
|
-
COM_PORTS=cls.__generaElencoPorte("/dev/tty",0)
|
26
|
-
COM_PORTS.extend(cls.__generaElencoPorte("/dev/ttyS",0))
|
27
|
-
COM_PORTS.extend(cls.__generaElencoPorte("/dev/ttyUSB",0))
|
28
|
-
cls.COM_PORTS=COM_PORTS
|
29
|
-
|
30
|
-
def apriPrimaPortaDisponibile(self):
|
31
|
-
"""
|
32
|
-
Prova ad aprire la prima porta disponibile che trova.
|
33
|
-
"""
|
34
|
-
for porta in self.COM_PORTS:
|
35
|
-
try:
|
36
|
-
connessioneSeriale=serial.Serial(port=porta, baudrate=9600, rtscts=True, dsrdtr=True, exclusive=True)
|
37
|
-
connessioneSeriale.dtr=True
|
38
|
-
connessioneSeriale.dtr=False
|
39
|
-
self.connessione=connessioneSeriale
|
40
|
-
return
|
41
|
-
except
|
42
|
-
pass
|
43
|
-
|
44
|
-
def isOpen(self)->bool:
|
45
|
-
"""
|
46
|
-
Controlla se la connessione alla porta è aperta.
|
47
|
-
"""
|
48
|
-
return self.connessione is not None and self.connessione.isOpen()
|
49
|
-
|
50
|
-
def read(self, port: str,baudrate: int,exitCallback):
|
51
|
-
"""
|
52
|
-
Reads serial strings and prints it to standard output.
|
53
|
-
"""
|
54
|
-
self.connessione=serial.Serial(port,baudrate,timeout=1)
|
55
|
-
while not exitCallback():
|
56
|
-
print(self.connessione.readline().decode(ModuloStringhe.CODIFICA_UTF8,"replace"),end="")
|
57
|
-
self.close()
|
58
|
-
|
59
|
-
def close(self):
|
60
|
-
"""
|
61
|
-
Chiude la connessione alla porta.
|
62
|
-
"""
|
63
|
-
if not self.isOpen():
|
64
|
-
return
|
65
|
-
self.connessione.close()
|
66
|
-
self.connessione=None
|
67
|
-
|
68
|
-
@staticmethod
|
69
|
-
def __generaElencoPorte(prefisso:str,inizio:int)->list:
|
70
|
-
return [prefisso+str(i) for i in range(inizio,16)]
|
1
|
+
import serial
|
2
|
+
|
3
|
+
from modulitiz_nano.ModuloStringhe import ModuloStringhe
|
4
|
+
from modulitiz_nano.sistema.ModuloSystem import ModuloSystem
|
5
|
+
|
6
|
+
|
7
|
+
class ModuloSeriale(object):
|
8
|
+
"""
|
9
|
+
Utility di gestione dela connessione seriale RS232
|
10
|
+
"""
|
11
|
+
|
12
|
+
COM_PORTS=[]
|
13
|
+
|
14
|
+
def __init__(self):
|
15
|
+
self.connessione=None
|
16
|
+
|
17
|
+
@classmethod
|
18
|
+
def populate(cls):
|
19
|
+
"""
|
20
|
+
Popola le variabili di classe.
|
21
|
+
"""
|
22
|
+
if ModuloSystem.isWindows():
|
23
|
+
COM_PORTS=cls.__generaElencoPorte("COM",1)
|
24
|
+
else:
|
25
|
+
COM_PORTS=cls.__generaElencoPorte("/dev/tty",0)
|
26
|
+
COM_PORTS.extend(cls.__generaElencoPorte("/dev/ttyS",0))
|
27
|
+
COM_PORTS.extend(cls.__generaElencoPorte("/dev/ttyUSB",0))
|
28
|
+
cls.COM_PORTS=COM_PORTS
|
29
|
+
|
30
|
+
def apriPrimaPortaDisponibile(self):
|
31
|
+
"""
|
32
|
+
Prova ad aprire la prima porta disponibile che trova.
|
33
|
+
"""
|
34
|
+
for porta in self.COM_PORTS:
|
35
|
+
try:
|
36
|
+
connessioneSeriale=serial.Serial(port=porta, baudrate=9600, rtscts=True, dsrdtr=True, exclusive=True)
|
37
|
+
connessioneSeriale.dtr=True
|
38
|
+
connessioneSeriale.dtr=False
|
39
|
+
self.connessione=connessioneSeriale
|
40
|
+
return
|
41
|
+
except OSError:
|
42
|
+
pass
|
43
|
+
|
44
|
+
def isOpen(self)->bool:
|
45
|
+
"""
|
46
|
+
Controlla se la connessione alla porta è aperta.
|
47
|
+
"""
|
48
|
+
return self.connessione is not None and self.connessione.isOpen()
|
49
|
+
|
50
|
+
def read(self, port: str,baudrate: int,exitCallback):
|
51
|
+
"""
|
52
|
+
Reads serial strings and prints it to standard output.
|
53
|
+
"""
|
54
|
+
self.connessione=serial.Serial(port,baudrate,timeout=1)
|
55
|
+
while not exitCallback():
|
56
|
+
print(self.connessione.readline().decode(ModuloStringhe.CODIFICA_UTF8,"replace"),end="")
|
57
|
+
self.close()
|
58
|
+
|
59
|
+
def close(self):
|
60
|
+
"""
|
61
|
+
Chiude la connessione alla porta.
|
62
|
+
"""
|
63
|
+
if not self.isOpen():
|
64
|
+
return
|
65
|
+
self.connessione.close()
|
66
|
+
self.connessione=None
|
67
|
+
|
68
|
+
@staticmethod
|
69
|
+
def __generaElencoPorte(prefisso:str,inizio:int)->list:
|
70
|
+
return [prefisso+str(i) for i in range(inizio,16)]
|
modulitiz_micro/ModuloTarghe.py
CHANGED
@@ -1,46 +1,47 @@
|
|
1
|
-
from
|
2
|
-
from
|
3
|
-
from modulitiz_micro.gestionedom.GestioneDom import GestioneDom
|
4
|
-
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
5
|
-
|
6
|
-
|
7
|
-
class ModuloTarghe(object):
|
8
|
-
"""
|
9
|
-
Utility di gestione delle targhe delle auto.
|
10
|
-
"""
|
11
|
-
|
12
|
-
URL="https://autokar.it/targhe"
|
13
|
-
|
14
|
-
@classmethod
|
15
|
-
def getAnno(cls,targa:str)->int|None:
|
16
|
-
"""
|
17
|
-
Cerca la targa e restituisce approssimativamente l'anno di immatricolazione.
|
18
|
-
:param targa: la targa dell'auto da cercare.
|
19
|
-
"""
|
20
|
-
http=ModuloHttp(cls.URL,None,False)
|
21
|
-
responseBody=http.doGet(3,True).responseBody.decode(ModuloStringhe.CODIFICA_LATIN1)
|
22
|
-
gestioneDom=GestioneDom(None,responseBody)
|
23
|
-
elementi=gestioneDom.selector(".entry-content p")
|
24
|
-
targaIniziale=targa[:2]
|
25
|
-
for elem in elementi:
|
26
|
-
anno=cls.__getAnno(elem,targaIniziale)
|
27
|
-
if anno is not None:
|
28
|
-
return anno
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
1
|
+
from modulitiz_nano.ModuloNumeri import ModuloNumeri
|
2
|
+
from modulitiz_nano.ModuloStringhe import ModuloStringhe
|
3
|
+
from modulitiz_micro.gestionedom.GestioneDom import GestioneDom
|
4
|
+
from modulitiz_micro.rete.http.ModuloHttp import ModuloHttp
|
5
|
+
|
6
|
+
|
7
|
+
class ModuloTarghe(object):
|
8
|
+
"""
|
9
|
+
Utility di gestione delle targhe delle auto.
|
10
|
+
"""
|
11
|
+
|
12
|
+
URL="https://autokar.it/targhe"
|
13
|
+
|
14
|
+
@classmethod
|
15
|
+
def getAnno(cls,targa:str)->int|None:
|
16
|
+
"""
|
17
|
+
Cerca la targa e restituisce approssimativamente l'anno di immatricolazione.
|
18
|
+
:param targa: la targa dell'auto da cercare.
|
19
|
+
"""
|
20
|
+
http=ModuloHttp(cls.URL,None,False)
|
21
|
+
responseBody=http.doGet(3,True).responseBody.decode(ModuloStringhe.CODIFICA_LATIN1)
|
22
|
+
gestioneDom=GestioneDom(None,responseBody)
|
23
|
+
elementi=gestioneDom.selector(".entry-content p")
|
24
|
+
targaIniziale=targa[:2]
|
25
|
+
for elem in elementi:
|
26
|
+
anno=cls.__getAnno(elem,targaIniziale)
|
27
|
+
if anno is not None:
|
28
|
+
return anno
|
29
|
+
return None
|
30
|
+
|
31
|
+
@classmethod
|
32
|
+
def __getAnno(cls,tag,targaIniziale:str)->int|None:
|
33
|
+
elementi=tag.contents
|
34
|
+
if len(elementi)!=2:
|
35
|
+
return None
|
36
|
+
try:
|
37
|
+
testo=elementi[0].contents[0]
|
38
|
+
except AttributeError:
|
39
|
+
return None
|
40
|
+
if targaIniziale!=testo:
|
41
|
+
return None
|
42
|
+
annoStr=elementi[1].strip()
|
43
|
+
anno=ModuloNumeri.strToInt(annoStr)
|
44
|
+
if anno is not None:
|
45
|
+
return anno
|
46
|
+
anno=int(annoStr.split(" ")[0])
|
47
|
+
return anno
|
@@ -1,13 +1,13 @@
|
|
1
|
-
import threading
|
2
|
-
from abc import ABC
|
3
|
-
|
4
|
-
from
|
5
|
-
|
6
|
-
|
7
|
-
class AbstractDatabaseService(ABC):
|
8
|
-
|
9
|
-
def __init__(self,logger:ModuloLogging):
|
10
|
-
self._logger=logger
|
11
|
-
self.lock=threading.Lock()
|
12
|
-
|
13
|
-
self.database=None
|
1
|
+
import threading
|
2
|
+
from abc import ABC
|
3
|
+
|
4
|
+
from modulitiz_nano.files.ModuloLogging import ModuloLogging
|
5
|
+
|
6
|
+
|
7
|
+
class AbstractDatabaseService(ABC):
|
8
|
+
|
9
|
+
def __init__(self,logger:ModuloLogging):
|
10
|
+
self._logger=logger
|
11
|
+
self.lock=threading.Lock()
|
12
|
+
|
13
|
+
self.database=None
|
@@ -1,69 +1,69 @@
|
|
1
|
-
import threading
|
2
|
-
from abc import ABC
|
3
|
-
|
4
|
-
from
|
5
|
-
|
6
|
-
|
7
|
-
class AbstractSql(ABC):
|
8
|
-
def __init__(self):
|
9
|
-
self.connDb=None
|
10
|
-
self.lock=threading.Lock()
|
11
|
-
|
12
|
-
def commit(self):
|
13
|
-
"""
|
14
|
-
Use to make modifications permanents.
|
15
|
-
"""
|
16
|
-
with self.lock:
|
17
|
-
self.commitNoLock()
|
18
|
-
|
19
|
-
def commitNoLock(self):
|
20
|
-
"""
|
21
|
-
Use only if lock is made externally.
|
22
|
-
"""
|
23
|
-
self.connDb.commit()
|
24
|
-
|
25
|
-
def rollback(self):
|
26
|
-
"""
|
27
|
-
Undo last uncommitted operations.
|
28
|
-
"""
|
29
|
-
with self.lock:
|
30
|
-
self.connDb.rollback()
|
31
|
-
|
32
|
-
def initCursor(self):
|
33
|
-
"""
|
34
|
-
Creates cursor objects, it's needed to read/write database.
|
35
|
-
"""
|
36
|
-
with self.lock:
|
37
|
-
cursoreDb=self.connDb.cursor()
|
38
|
-
return cursoreDb
|
39
|
-
|
40
|
-
def fetchOne(self,cursoreDb):
|
41
|
-
"""
|
42
|
-
Retrieve first row of query
|
43
|
-
"""
|
44
|
-
with cursoreDb:
|
45
|
-
with self.lock:
|
46
|
-
result=cursoreDb.fetchone()
|
47
|
-
if not result:
|
48
|
-
return None
|
49
|
-
return result[0]
|
50
|
-
|
51
|
-
def count(self,cursoreDb)->int:
|
52
|
-
with cursoreDb:
|
53
|
-
with self.lock:
|
54
|
-
result=cursoreDb.fetchone()
|
55
|
-
if not result:
|
56
|
-
return 0
|
57
|
-
return result[0]
|
58
|
-
|
59
|
-
def close(self):
|
60
|
-
with self.lock:
|
61
|
-
if self.connDb is not None:
|
62
|
-
self.connDb.close()
|
63
|
-
self.connDb=None
|
64
|
-
|
65
|
-
@staticmethod
|
66
|
-
def ifEmptyThenNull(testo:str|None)->str|None:
|
67
|
-
if ModuloStringhe.isEmpty(testo) or testo=="NULL":
|
68
|
-
return None
|
69
|
-
return testo
|
1
|
+
import threading
|
2
|
+
from abc import ABC
|
3
|
+
|
4
|
+
from modulitiz_nano.ModuloStringhe import ModuloStringhe
|
5
|
+
|
6
|
+
|
7
|
+
class AbstractSql(ABC):
|
8
|
+
def __init__(self):
|
9
|
+
self.connDb=None
|
10
|
+
self.lock=threading.Lock()
|
11
|
+
|
12
|
+
def commit(self):
|
13
|
+
"""
|
14
|
+
Use to make modifications permanents.
|
15
|
+
"""
|
16
|
+
with self.lock:
|
17
|
+
self.commitNoLock()
|
18
|
+
|
19
|
+
def commitNoLock(self):
|
20
|
+
"""
|
21
|
+
Use only if lock is made externally.
|
22
|
+
"""
|
23
|
+
self.connDb.commit()
|
24
|
+
|
25
|
+
def rollback(self):
|
26
|
+
"""
|
27
|
+
Undo last uncommitted operations.
|
28
|
+
"""
|
29
|
+
with self.lock:
|
30
|
+
self.connDb.rollback()
|
31
|
+
|
32
|
+
def initCursor(self):
|
33
|
+
"""
|
34
|
+
Creates cursor objects, it's needed to read/write database.
|
35
|
+
"""
|
36
|
+
with self.lock:
|
37
|
+
cursoreDb=self.connDb.cursor()
|
38
|
+
return cursoreDb
|
39
|
+
|
40
|
+
def fetchOne(self,cursoreDb):
|
41
|
+
"""
|
42
|
+
Retrieve first row of query
|
43
|
+
"""
|
44
|
+
with cursoreDb:
|
45
|
+
with self.lock:
|
46
|
+
result=cursoreDb.fetchone()
|
47
|
+
if not result:
|
48
|
+
return None
|
49
|
+
return result[0]
|
50
|
+
|
51
|
+
def count(self,cursoreDb)->int:
|
52
|
+
with cursoreDb:
|
53
|
+
with self.lock:
|
54
|
+
result=cursoreDb.fetchone()
|
55
|
+
if not result:
|
56
|
+
return 0
|
57
|
+
return result[0]
|
58
|
+
|
59
|
+
def close(self):
|
60
|
+
with self.lock:
|
61
|
+
if self.connDb is not None:
|
62
|
+
self.connDb.close()
|
63
|
+
self.connDb=None
|
64
|
+
|
65
|
+
@staticmethod
|
66
|
+
def ifEmptyThenNull(testo:str|None)->str|None:
|
67
|
+
if ModuloStringhe.isEmpty(testo) or testo=="NULL":
|
68
|
+
return None
|
69
|
+
return testo
|
@@ -1,19 +1,19 @@
|
|
1
|
-
import oracledb
|
2
|
-
|
3
|
-
from modulitiz_micro.database.ModuloSqlServer import ModuloSqlServer
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloSqlOracle(ModuloSqlServer):
|
7
|
-
DEFAULT_PORTA=1521
|
8
|
-
|
9
|
-
def __init__(self,porta:int|None,*args,**kwargs):
|
10
|
-
super().__init__(*args,**kwargs)
|
11
|
-
if porta is None:
|
12
|
-
porta=self.DEFAULT_PORTA
|
13
|
-
self.porta=porta
|
14
|
-
|
15
|
-
def connessione(self):
|
16
|
-
dsn="{}/{}@{}:{}/xe".format(self.username,self.password,self.host,self.porta)
|
17
|
-
self.connDb=oracledb.connect(dsn)
|
18
|
-
self.connDb=dsn
|
19
|
-
|
1
|
+
import oracledb
|
2
|
+
|
3
|
+
from modulitiz_micro.database.ModuloSqlServer import ModuloSqlServer
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloSqlOracle(ModuloSqlServer):
|
7
|
+
DEFAULT_PORTA=1521
|
8
|
+
|
9
|
+
def __init__(self,porta:int|None,*args,**kwargs):
|
10
|
+
super().__init__(*args,**kwargs)
|
11
|
+
if porta is None:
|
12
|
+
porta=self.DEFAULT_PORTA
|
13
|
+
self.porta=porta
|
14
|
+
|
15
|
+
def connessione(self):
|
16
|
+
dsn="{}/{}@{}:{}/xe".format(self.username,self.password,self.host,self.porta)
|
17
|
+
self.connDb=oracledb.connect(dsn)
|
18
|
+
self.connDb=dsn
|
19
|
+
|
@@ -1,43 +1,43 @@
|
|
1
|
-
import pypyodbc
|
2
|
-
|
3
|
-
from modulitiz_micro.database.AbstractSql import AbstractSql
|
4
|
-
|
5
|
-
|
6
|
-
class ModuloSqlServer(AbstractSql):
|
7
|
-
ERROR_CODE__UNIQUE_INDEX=23000
|
8
|
-
|
9
|
-
def __init__(self,host:str,nome_db:str,username:str,password:str):
|
10
|
-
super().__init__()
|
11
|
-
self.host=host
|
12
|
-
self.nome_db=nome_db
|
13
|
-
self.username=username
|
14
|
-
self.password=password
|
15
|
-
|
16
|
-
def connessione(self):
|
17
|
-
connDb=pypyodbc.connect("Driver={SQL Server};Server="+self.host+";Database="+self.nome_db+";uid="+self.username+";pwd="+self.password+";")
|
18
|
-
self.connDb=connDb
|
19
|
-
|
20
|
-
def select(self,sql:str,params:list):
|
21
|
-
with self.initCursor() as cursoreDb:
|
22
|
-
cursoreDb.execute(sql,params)
|
23
|
-
results=list(cursoreDb)
|
24
|
-
return results
|
25
|
-
|
26
|
-
def select_count(self,cursoreDb,sql:str,params:list)->int:
|
27
|
-
with cursoreDb:
|
28
|
-
cursoreDb.execute(sql,params)
|
29
|
-
output=self.count(cursoreDb)
|
30
|
-
return output
|
31
|
-
|
32
|
-
def modifica(self,cursoreDb,sql:str,params:list,ignore_unique_index:bool):
|
33
|
-
"""
|
34
|
-
Use it for data modifications like: insert, update, delete
|
35
|
-
"""
|
36
|
-
try:
|
37
|
-
cursoreDb.execute(sql,params)
|
38
|
-
except pypyodbc.IntegrityError as ie:
|
39
|
-
if ignore_unique_index:
|
40
|
-
error_code=int(ie.value[0])
|
41
|
-
if error_code!=self.ERROR_CODE__UNIQUE_INDEX:
|
42
|
-
raise ie
|
43
|
-
|
1
|
+
import pypyodbc
|
2
|
+
|
3
|
+
from modulitiz_micro.database.AbstractSql import AbstractSql
|
4
|
+
|
5
|
+
|
6
|
+
class ModuloSqlServer(AbstractSql):
|
7
|
+
ERROR_CODE__UNIQUE_INDEX=23000
|
8
|
+
|
9
|
+
def __init__(self,host:str,nome_db:str,username:str,password:str):
|
10
|
+
super().__init__()
|
11
|
+
self.host=host
|
12
|
+
self.nome_db=nome_db
|
13
|
+
self.username=username
|
14
|
+
self.password=password
|
15
|
+
|
16
|
+
def connessione(self):
|
17
|
+
connDb=pypyodbc.connect("Driver={SQL Server};Server="+self.host+";Database="+self.nome_db+";uid="+self.username+";pwd="+self.password+";")
|
18
|
+
self.connDb=connDb
|
19
|
+
|
20
|
+
def select(self,sql:str,params:list):
|
21
|
+
with self.initCursor() as cursoreDb:
|
22
|
+
cursoreDb.execute(sql,params)
|
23
|
+
results=list(cursoreDb)
|
24
|
+
return results
|
25
|
+
|
26
|
+
def select_count(self,cursoreDb,sql:str,params:list)->int:
|
27
|
+
with cursoreDb:
|
28
|
+
cursoreDb.execute(sql,params)
|
29
|
+
output=self.count(cursoreDb)
|
30
|
+
return output
|
31
|
+
|
32
|
+
def modifica(self,cursoreDb,sql:str,params:list,ignore_unique_index:bool):
|
33
|
+
"""
|
34
|
+
Use it for data modifications like: insert, update, delete
|
35
|
+
"""
|
36
|
+
try:
|
37
|
+
cursoreDb.execute(sql,params)
|
38
|
+
except pypyodbc.IntegrityError as ie:
|
39
|
+
if ignore_unique_index:
|
40
|
+
error_code=int(ie.value[0])
|
41
|
+
if error_code!=self.ERROR_CODE__UNIQUE_INDEX:
|
42
|
+
raise ie
|
43
|
+
|