1
|
|
|
import logging |
2
|
|
|
|
3
|
|
|
import yaml |
4
|
|
|
from satcfdi import Code, CFDI |
5
|
|
|
|
6
|
|
|
|
7
|
|
|
class LogAdapter(logging.LoggerAdapter): |
8
|
|
|
def info_yaml(self, data): |
9
|
|
|
self.info( |
10
|
|
|
yaml.safe_dump(data, allow_unicode=True, width=1280, sort_keys=False) |
11
|
|
|
) |
12
|
|
|
|
13
|
|
|
|
14
|
|
|
logger = LogAdapter(logging.getLogger()) |
15
|
|
|
|
16
|
|
|
|
17
|
|
|
class LogHandler(logging.StreamHandler): |
18
|
|
|
def __init__(self, console): |
19
|
|
|
super().__init__() |
20
|
|
|
self.buffer = "" |
21
|
|
|
self.console = console |
22
|
|
|
|
23
|
|
|
def emit(self, record): |
24
|
|
|
msg = self.format(record) |
25
|
|
|
self.buffer += msg + '\n' |
26
|
|
|
self.console.update(value=self.buffer) |
27
|
|
|
|
28
|
|
|
def clear(self): |
29
|
|
|
self.buffer = "" |
30
|
|
|
self.console.update(value="") |
31
|
|
|
|
32
|
|
|
|
33
|
|
|
def log_email(receptor, notify_invoices, facturas_pendientes): |
34
|
|
|
logger.info_yaml({ |
35
|
|
|
"Rfc": Code(receptor["Rfc"], receptor["RazonSocial"]), |
36
|
|
|
"Facturas": [f"{i.name} - {i.uuid}" for i in notify_invoices], |
37
|
|
|
"Pendientes Meses Anteriores": [f"{i.name} - {i.uuid}" for i in facturas_pendientes], |
38
|
|
|
"Correos": receptor["Email"] |
39
|
|
|
}) |
40
|
|
|
|
41
|
|
|
|
42
|
|
|
def log_line(text, exc_info=False): |
43
|
|
|
ln = (150 - len(text)) // 2 |
44
|
|
|
logger.info( |
45
|
|
|
("=" * ln) + " " + text + " " + ("=" * ln), |
46
|
|
|
exc_info=exc_info |
47
|
|
|
) |
48
|
|
|
|
49
|
|
|
|
50
|
|
|
def log_item(text, exc_info=False): |
51
|
|
|
ln = (150 - len(text)) // 2 |
52
|
|
|
logger.info( |
53
|
|
|
("*" * ln) + " " + text + " " + ("*" * ln), |
54
|
|
|
exc_info=exc_info |
55
|
|
|
) |
56
|
|
|
|
57
|
|
|
|
58
|
|
|
def cfdi_header(cfdi): |
59
|
|
|
receptor = Code(cfdi['Receptor']['Rfc'], cfdi['Receptor']['Nombre']) |
60
|
|
|
return f"{cfdi.name} - {cfdi.uuid} {receptor}" |