Compare commits
11 Commits
Author | SHA1 | Date |
---|---|---|
blallo | fa0023d2d1 | |
blallo | 4d1596c4a2 | |
blallo | 821335d719 | |
blallo | 635780b353 | |
blallo | 51b4e6c112 | |
blallo | 9750623929 | |
blallo | f3ed2b0cc9 | |
blallo | 365105f4b4 | |
blallo | 8860db44b4 | |
blallo | 00baa4a2f2 | |
blallo | 55b6d565b0 |
|
@ -20,6 +20,8 @@ def get_section(obj: T.Dict[T.Text, T.Any], key: T.Text) -> T.Any:
|
|||
class Config(object):
|
||||
smtp: T.Dict[T.Text, T.Any] = {}
|
||||
to: T.List[T.Text] = []
|
||||
cc: T.List[T.Text] = []
|
||||
store: T.Optional[T.Text] = None
|
||||
|
||||
def __init__(self, path: T.Text) -> None:
|
||||
self.from_file(path)
|
||||
|
@ -34,6 +36,9 @@ class Config(object):
|
|||
|
||||
self.to = get_section(content, "to")
|
||||
|
||||
if cc := content.get("cc"):
|
||||
self.cc = cc
|
||||
|
||||
smtp = get_section(content, "smtp")
|
||||
for key in [
|
||||
"smtp_addr",
|
||||
|
@ -46,5 +51,7 @@ class Config(object):
|
|||
|
||||
self.smtp["smtp_from"] = smtp.get("smtp_from")
|
||||
|
||||
self.store = content.get("store")
|
||||
|
||||
def __str__(self) -> T.Text:
|
||||
return f"Config<smtp={self.smtp},to={self.to}>"
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
from datetime import datetime, timedelta
|
||||
import functools
|
||||
import logging
|
||||
import sys
|
||||
|
@ -48,3 +49,10 @@ def retry_and_log(logger: logging.Logger, retries: int):
|
|||
return inner
|
||||
|
||||
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")
|
||||
|
|
|
@ -32,10 +32,10 @@ def main(config: Config):
|
|||
data.append(get_details(row, aux_data))
|
||||
|
||||
if not data:
|
||||
out.send_no_data(config.to)
|
||||
out.send_no_data(config.to, config.cc)
|
||||
|
||||
excel = to_excel(data)
|
||||
out.send_result(config.to, excel)
|
||||
excel = to_excel(data, config.store)
|
||||
out.send_result(config.to, config.cc, excel)
|
||||
|
||||
|
||||
def cli():
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
from contextlib import contextmanager
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime
|
||||
from email import encoders
|
||||
from email.mime.base import MIMEBase
|
||||
from email.mime.multipart import MIMEMultipart
|
||||
|
@ -10,8 +10,7 @@ import smtplib
|
|||
import ssl
|
||||
import typing as T
|
||||
|
||||
|
||||
from latecomers.helpers import retry_and_log
|
||||
from latecomers.helpers import retry_and_log, get_date
|
||||
|
||||
|
||||
RETRIES = 3
|
||||
|
@ -57,13 +56,18 @@ class Notifier(object):
|
|||
conn.sendmail(self._from, to, email)
|
||||
|
||||
@retry_and_log(logger, RETRIES)
|
||||
def send_result(self, to: T.List[T.Text], result: bytes) -> None:
|
||||
date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
||||
def send_result(
|
||||
self, to: T.List[T.Text], cc: T.List[T.Text], result: bytes
|
||||
) -> None:
|
||||
date = get_date()
|
||||
body = f"Resoconto dei voli dal sito di AdR per l'aereoporto di Ciampino in data {date}" # noqa: E501
|
||||
|
||||
message = MIMEMultipart()
|
||||
message["Date"] = datetime.now().strftime("%a, %d %b %Y %H:%M:%S %z")
|
||||
message["From"] = self._from
|
||||
message["To"] = ",".join(to)
|
||||
if cc:
|
||||
message["Cc"] = ",".join(cc)
|
||||
message["Subject"] = f"[{date}] Resoconto CIA da AdR"
|
||||
|
||||
message.attach(MIMEText(body, "plain"))
|
||||
|
@ -80,11 +84,14 @@ class Notifier(object):
|
|||
|
||||
email = message.as_string()
|
||||
|
||||
self.send(to, email)
|
||||
rcpt = to
|
||||
rcpt.extend(cc)
|
||||
|
||||
self.send(rcpt, email)
|
||||
|
||||
@retry_and_log(logger, RETRIES)
|
||||
def send_no_data(self, to: T.List[T.Text]) -> None:
|
||||
date = (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
|
||||
def send_no_data(self, to: T.List[T.Text], cc: T.List[T.Text]) -> None:
|
||||
date = get_date()
|
||||
body = f"""Attenzione
|
||||
|
||||
Nessun dato è stato trovato per i voli in data {date} dal sito di AdR per
|
||||
|
@ -93,11 +100,17 @@ il vostro tecnico preferito.
|
|||
"""
|
||||
|
||||
message = MIMEMultipart()
|
||||
message["Date"] = datetime.now().strftime("%a, %d %b %Y %H:%M:%S %z")
|
||||
message["From"] = self._from
|
||||
message["To"] = ",".join(to)
|
||||
if cc:
|
||||
message["Cc"] = ",".join(cc)
|
||||
message["Subject"] = f"ATTENZIONE: [{date}] Resoconto CIA da AdR"
|
||||
|
||||
message.attach(MIMEText(body, "plain"))
|
||||
email = message.as_string()
|
||||
|
||||
self.send(to, email)
|
||||
rcpt = to
|
||||
rcpt.extend(cc)
|
||||
|
||||
self.send(rcpt, email)
|
||||
|
|
|
@ -211,9 +211,9 @@ def parse_fr24(
|
|||
]: # noqa: E501
|
||||
try:
|
||||
id_num = flight["flight"]["identification"]["number"]
|
||||
if (_code := id_num.get("default")):
|
||||
if _code := id_num.get("default"):
|
||||
code = _code
|
||||
elif (_code := id_num.get("alternative")):
|
||||
elif _code := id_num.get("alternative"):
|
||||
code = _code
|
||||
else:
|
||||
# skip if no flight code found
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1,10 +1,11 @@
|
|||
# -*- encoding: utf-8 -*-
|
||||
import logging
|
||||
import os.path
|
||||
from tempfile import NamedTemporaryFile
|
||||
import typing as T
|
||||
|
||||
from latecomers.parse import Details
|
||||
from latecomers.helpers import logit
|
||||
from latecomers.helpers import logit, get_date
|
||||
|
||||
import pandas as pd
|
||||
|
||||
|
@ -13,7 +14,7 @@ logger = logging.getLogger(__name__)
|
|||
|
||||
|
||||
@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
|
||||
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)
|
||||
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
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
[project]
|
||||
name = "latecomers"
|
||||
version = "0.2.1"
|
||||
version = "0.3.3"
|
||||
description = "Retrieve and save data from ADR Ciampino airport"
|
||||
authors = [{name="Leonardo Barcaroli", email="blallo@autistici.org"}]
|
||||
license = {text="Public Domain"}
|
||||
|
|
Loading…
Reference in New Issue