Add /time and /date endpoints
This commit is contained in:
parent
7195875792
commit
1d5bc48e8e
3 changed files with 80 additions and 2 deletions
|
@ -3,3 +3,5 @@ flask_sqlalchemy==3.1.1
|
|||
gunicorn==23.0.0
|
||||
prometheus-flask-exporter==0.23.1
|
||||
requests==2.32.3
|
||||
phonenumbers==8.13.53
|
||||
pytz==2024.2
|
|
@ -1,12 +1,33 @@
|
|||
from flask import jsonify, request
|
||||
|
||||
from utils import logger, validate_data_presence, _get_weather, _get_cords, strq
|
||||
from utils import logger, validate_data_presence, _get_weather, _get_cords, _get_date, _get_time, strq
|
||||
|
||||
# from config import
|
||||
from . import routes as app
|
||||
from . import by_path_counter
|
||||
|
||||
|
||||
@app.route("/time", methods=["GET"])
|
||||
@by_path_counter
|
||||
def time():
|
||||
if "caller" in request.values:
|
||||
phone_number = request.values["caller"]
|
||||
else:
|
||||
phone_number = "1"
|
||||
|
||||
return strq(_get_time(phone_number))
|
||||
|
||||
|
||||
@app.route("/date", methods=["GET"])
|
||||
@by_path_counter
|
||||
def date():
|
||||
if "caller" in request.values:
|
||||
phone_number = request.values["caller"]
|
||||
else:
|
||||
phone_number = 1
|
||||
|
||||
return strq(_get_date(phone_number))
|
||||
|
||||
@app.route("/city", methods=["GET"])
|
||||
@by_path_counter
|
||||
def city():
|
||||
|
|
55
app/utils.py
55
app/utils.py
|
@ -6,6 +6,9 @@ import re
|
|||
import typing as t
|
||||
import requests
|
||||
import traceback
|
||||
import phonenumbers
|
||||
from phonenumbers import timezone as pntz
|
||||
import pytz
|
||||
|
||||
from models import db, Stats, Weather, Zipcode
|
||||
from config import env_OWM_KEY, env_OWM_UNITS, env_CACHE_TIME
|
||||
|
@ -56,6 +59,58 @@ def validate_data_presence(data: t.Dict[str, t.Any], keys: list[str]) -> bool:
|
|||
def strq(str: str) -> str:
|
||||
return "\"" + str + "\""
|
||||
|
||||
|
||||
def _get_time(phone_number):
|
||||
try:
|
||||
# Get and print the current time in that timezone
|
||||
time_object = _get_phone_time(phone_number)
|
||||
time = f"{time_object.strftime('The time is %I:%M %p.')}"
|
||||
return time
|
||||
except Exception as e:
|
||||
logger.error("Error in _get_time: " + str(e))
|
||||
logger.error(traceback.format_exc())
|
||||
return "An error has occured and the time could not be retrieved."
|
||||
|
||||
|
||||
def _get_date(phone_number):
|
||||
try:
|
||||
# Get and print the current date in that timezone
|
||||
time_object = _get_phone_time(phone_number)
|
||||
date = f"{time_object.strftime('Today is %A, %B %d.')}"
|
||||
return date
|
||||
except Exception as e:
|
||||
logger.error("Error in _get_date: " + str(e))
|
||||
logger.error(traceback.format_exc())
|
||||
return "An error has occured and the date could not be retrieved."
|
||||
|
||||
|
||||
def _get_phone_time(phone_number):
|
||||
|
||||
try:
|
||||
# Parse the cleaned phone number into a PhoneNumber object
|
||||
number = phonenumbers.parse(phone_number, "US")
|
||||
|
||||
valid = phonenumbers.is_valid_number(number)
|
||||
if not valid:
|
||||
raise TypeError("Number not valid")
|
||||
|
||||
# Determine the timezone based on the area code or country code
|
||||
tz_str = pntz.time_zones_for_number(number)
|
||||
tz_str = tz_str[0]
|
||||
except Exception as e:
|
||||
logger.error("Error parsing phone number " + str(phone_number) + " : " + str(e))
|
||||
# Default to America/New_York if there's an error during conversion
|
||||
tz_str = "America/New_York"
|
||||
|
||||
tz = pytz.timezone(tz_str)
|
||||
|
||||
# Get current datetime in the target timezone
|
||||
now_utc = datetime.now(timezone.utc)
|
||||
local_time = now_utc.astimezone(tz)
|
||||
|
||||
return local_time
|
||||
|
||||
|
||||
def _get_weather(lat, long):
|
||||
try:
|
||||
if lat is None or long is None:
|
||||
|
|
Loading…
Reference in a new issue