You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
4.1 KiB
Python
142 lines
4.1 KiB
Python
import re
|
|
from datetime import datetime, timedelta, timezone
|
|
from typing import Optional
|
|
|
|
import pytz
|
|
from dateutil.relativedelta import relativedelta
|
|
|
|
from src.config import RELIABILITY_SERVICE_API, TIMEZONE
|
|
|
|
|
|
def parse_relative_expression(date_str: str) -> Optional[datetime]:
|
|
"""
|
|
Parse relative date expressions using T (days), M (months), and Y (years)
|
|
Returns tuple of (datetime, type_description) or None if not a relative date
|
|
"""
|
|
pattern = r"^([HTMY])([+-]\d+)?$"
|
|
match = re.match(pattern, date_str)
|
|
|
|
if not match:
|
|
return None
|
|
|
|
unit, offset = match.groups()
|
|
offset = int(offset) if offset else 0
|
|
# Use UTC timezone for consistency
|
|
today = datetime.now(timezone.tzname("Asia/Jakarta"))
|
|
if unit == "H":
|
|
# For hours, keep minutes and seconds
|
|
result_time = today + timedelta(hours=offset)
|
|
return result_time
|
|
elif unit == "T":
|
|
return today + timedelta(days=offset)
|
|
elif unit == "M":
|
|
return today + relativedelta(months=offset)
|
|
elif unit == "Y":
|
|
return today + relativedelta(years=offset)
|
|
|
|
|
|
def parse_date_string(date_str: str) -> Optional[datetime]:
|
|
"""
|
|
Parse date strings in various formats including relative expressions
|
|
Returns tuple of (datetime, type)
|
|
"""
|
|
# Try parsing as relative expression first
|
|
relative_result = parse_relative_expression(date_str)
|
|
if relative_result:
|
|
return relative_result
|
|
|
|
# Try different date formats
|
|
date_formats = [
|
|
("%Y-%m-%d", "iso"), # 2024-11-08
|
|
("%Y/%m/%d", "slash"), # 2024/11/08
|
|
("%d-%m-%Y", "european"), # 08-11-2024
|
|
("%d/%m/%Y", "european_slash"), # 08/11/2024
|
|
("%Y.%m.%d", "dot"), # 2024.11.08
|
|
("%d.%m.%Y", "european_dot"), # 08.11.2024
|
|
]
|
|
|
|
for fmt, type_name in date_formats:
|
|
try:
|
|
# Parse the date and set it to start of day in UTC
|
|
dt = datetime.strptime(date_str, fmt)
|
|
dt = dt.replace(
|
|
hour=0,
|
|
minute=0,
|
|
second=0,
|
|
microsecond=0,
|
|
tzinfo=timezone.tzname("Asia/Jakarta"),
|
|
)
|
|
return dt
|
|
except ValueError:
|
|
continue
|
|
|
|
raise ValueError(
|
|
"Invalid date format. Supported formats:\n"
|
|
"Relative formats:\n"
|
|
"- T (days): T, T-n, T+n\n"
|
|
"- M (months): M, M-1, M+2\n"
|
|
"- Y (years): Y, Y-1, Y+1\n"
|
|
"Regular formats:\n"
|
|
"- YYYY-MM-DD\n"
|
|
"- YYYY/MM/DD\n"
|
|
"- DD-MM-YYYY\n"
|
|
"- DD/MM/YYYY\n"
|
|
"- YYYY.MM.DD\n"
|
|
"- DD.MM.YYYY"
|
|
)
|
|
|
|
|
|
def time_now():
|
|
return datetime.now(pytz.timezone(TIMEZONE))
|
|
|
|
|
|
import requests
|
|
|
|
|
|
def get_latest_numOfFail(location_tag, token) -> float:
|
|
today = datetime.today().strftime("%Y-%m-%d")
|
|
url_today = f"{RELIABILITY_SERVICE_API}/main/number-of-failures/{location_tag}/2016-01-01/{today}"
|
|
|
|
try:
|
|
response = requests.get(
|
|
url_today,
|
|
{
|
|
"Content-Type": "application/json",
|
|
"Authorization": f"Bearer {token}",
|
|
},
|
|
)
|
|
data = response.json()
|
|
|
|
raise Exception(data)
|
|
|
|
latest_num = data["data"][-1]["num_fail"]
|
|
|
|
raise Exception(latest_num)
|
|
|
|
if not latest_num:
|
|
latest_num = 0
|
|
|
|
return latest_num
|
|
except requests.exceptions.RequestException as e:
|
|
print(f"Error fetching data: {e}")
|
|
return 0
|
|
|
|
|
|
|
|
PASTEBIN_API_KEY = 'G9uCTzoI1CJWCupt5lcZRpijondt5jwA' # Replace this with your actual API key
|
|
|
|
def save_to_pastebin(data, title="Result Log", expire_date="1H"):
|
|
url = "https://pastebin.com/api/api_post.php"
|
|
payload = {
|
|
'api_dev_key': PASTEBIN_API_KEY,
|
|
'api_option': 'paste',
|
|
'api_paste_code': data,
|
|
'api_paste_name': title,
|
|
'api_paste_expire_date': expire_date, # Example: 10M, 1H, 1D, N (never)
|
|
}
|
|
response = requests.post(url, data=payload)
|
|
if response.status_code == 200:
|
|
return response.text # This will be the paste URL
|
|
else:
|
|
return f"Error: {response.status_code} - {response.text}"
|