Optionally save file to store path
This commit is contained in:
parent
8a07cbf2aa
commit
55b6d565b0
|
@ -20,6 +20,7 @@ def get_section(obj: T.Dict[T.Text, T.Any], key: T.Text) -> T.Any:
|
||||||
class Config(object):
|
class Config(object):
|
||||||
smtp: T.Dict[T.Text, T.Any] = {}
|
smtp: T.Dict[T.Text, T.Any] = {}
|
||||||
to: T.List[T.Text] = []
|
to: T.List[T.Text] = []
|
||||||
|
store: T.Optional[T.Text] = None
|
||||||
|
|
||||||
def __init__(self, path: T.Text) -> None:
|
def __init__(self, path: T.Text) -> None:
|
||||||
self.from_file(path)
|
self.from_file(path)
|
||||||
|
@ -46,5 +47,7 @@ class Config(object):
|
||||||
|
|
||||||
self.smtp["smtp_from"] = smtp.get("smtp_from")
|
self.smtp["smtp_from"] = smtp.get("smtp_from")
|
||||||
|
|
||||||
|
self.store = content.get("store")
|
||||||
|
|
||||||
def __str__(self) -> T.Text:
|
def __str__(self) -> T.Text:
|
||||||
return f"Config<smtp={self.smtp},to={self.to}>"
|
return f"Config<smtp={self.smtp},to={self.to}>"
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
# -*- encoding: utf-8 -*-
|
# -*- encoding: utf-8 -*-
|
||||||
|
from datetime import datetime, timedelta
|
||||||
import functools
|
import functools
|
||||||
import logging
|
import logging
|
||||||
import sys
|
import sys
|
||||||
|
@ -48,3 +49,10 @@ def retry_and_log(logger: logging.Logger, retries: int):
|
||||||
return inner
|
return inner
|
||||||
|
|
||||||
return wrapper
|
return wrapper
|
||||||
|
|
||||||
|
|
||||||
|
def get_date() -> T.Text:
|
||||||
|
"""
|
||||||
|
Get yesterday's date in %Y-%m-%d format.
|
||||||
|
"""
|
||||||
|
return (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
||||||
|
|
|
@ -34,7 +34,7 @@ def main(config: Config):
|
||||||
if not data:
|
if not data:
|
||||||
out.send_no_data(config.to)
|
out.send_no_data(config.to)
|
||||||
|
|
||||||
excel = to_excel(data)
|
excel = to_excel(data, config.store)
|
||||||
out.send_result(config.to, excel)
|
out.send_result(config.to, excel)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
# -*- encoding: utf-8 -*-
|
# -*- encoding: utf-8 -*-
|
||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from datetime import datetime, timedelta
|
|
||||||
from email import encoders
|
from email import encoders
|
||||||
from email.mime.base import MIMEBase
|
from email.mime.base import MIMEBase
|
||||||
from email.mime.multipart import MIMEMultipart
|
from email.mime.multipart import MIMEMultipart
|
||||||
|
@ -10,8 +9,7 @@ import smtplib
|
||||||
import ssl
|
import ssl
|
||||||
import typing as T
|
import typing as T
|
||||||
|
|
||||||
|
from latecomers.helpers import retry_and_log, get_date
|
||||||
from latecomers.helpers import retry_and_log
|
|
||||||
|
|
||||||
|
|
||||||
RETRIES = 3
|
RETRIES = 3
|
||||||
|
@ -58,7 +56,7 @@ class Notifier(object):
|
||||||
|
|
||||||
@retry_and_log(logger, RETRIES)
|
@retry_and_log(logger, RETRIES)
|
||||||
def send_result(self, to: T.List[T.Text], result: bytes) -> None:
|
def send_result(self, to: T.List[T.Text], result: bytes) -> None:
|
||||||
date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
date = get_date()
|
||||||
body = f"Resoconto dei voli dal sito di AdR per l'aereoporto di Ciampino in data {date}" # noqa: E501
|
body = f"Resoconto dei voli dal sito di AdR per l'aereoporto di Ciampino in data {date}" # noqa: E501
|
||||||
|
|
||||||
message = MIMEMultipart()
|
message = MIMEMultipart()
|
||||||
|
@ -84,7 +82,7 @@ class Notifier(object):
|
||||||
|
|
||||||
@retry_and_log(logger, RETRIES)
|
@retry_and_log(logger, RETRIES)
|
||||||
def send_no_data(self, to: T.List[T.Text]) -> None:
|
def send_no_data(self, to: T.List[T.Text]) -> None:
|
||||||
date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
date = get_date()
|
||||||
body = f"""Attenzione
|
body = f"""Attenzione
|
||||||
|
|
||||||
Nessun dato è stato trovato per i voli in data {date} dal sito di AdR per
|
Nessun dato è stato trovato per i voli in data {date} dal sito di AdR per
|
||||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,10 +1,11 @@
|
||||||
# -*- encoding: utf-8 -*-
|
# -*- encoding: utf-8 -*-
|
||||||
import logging
|
import logging
|
||||||
|
import os.path
|
||||||
from tempfile import NamedTemporaryFile
|
from tempfile import NamedTemporaryFile
|
||||||
import typing as T
|
import typing as T
|
||||||
|
|
||||||
from latecomers.parse import Details
|
from latecomers.parse import Details
|
||||||
from latecomers.helpers import logit
|
from latecomers.helpers import logit, get_date
|
||||||
|
|
||||||
import pandas as pd
|
import pandas as pd
|
||||||
|
|
||||||
|
@ -13,7 +14,7 @@ logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@logit(logger)
|
@logit(logger)
|
||||||
def to_excel(data: T.List[Details]) -> bytes:
|
def to_excel(data: T.List[Details], dst: T.Optional[T.Text] = None) -> bytes:
|
||||||
"""
|
"""
|
||||||
This function takes the list of parsed rows as input and returns
|
This function takes the list of parsed rows as input and returns
|
||||||
the bytes corresponding to the excel file derived from such lines.
|
the bytes corresponding to the excel file derived from such lines.
|
||||||
|
@ -38,4 +39,12 @@ def to_excel(data: T.List[Details]) -> bytes:
|
||||||
tmp.seek(0)
|
tmp.seek(0)
|
||||||
content = tmp.read()
|
content = tmp.read()
|
||||||
|
|
||||||
|
if dst:
|
||||||
|
filepath = os.path.join(dst, f"{get_date()}.xlsx")
|
||||||
|
try:
|
||||||
|
with open(filepath, "wb") as out:
|
||||||
|
out.write(content)
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Cannot save to path '{filepath}': {e}")
|
||||||
|
|
||||||
return content
|
return content
|
||||||
|
|
Loading…
Reference in New Issue
Block a user