44from typing import TypeVar
55
66import sqlalchemy .engine
7+ from dateutil import parser as date_parser
78from psycopg2 .errors import UniqueViolation
89from sqlalchemy import BinaryExpression , create_engine , func
910from sqlalchemy .exc import DataError , IntegrityError
@@ -22,6 +23,26 @@ class AbstractDatabaseObjectsInterface:
2223
2324 logger = CustomLogger ("database_objects_handler" , logger_type = "default" )
2425
26+ @staticmethod
27+ def _is_date_valid (date_string : str ) -> bool :
28+ """
29+ Validates if a date string is in a valid date format.
30+
31+ Args:
32+ date_string: The string to validate
33+
34+ Returns:
35+ bool: True if the date is valid, False otherwise
36+ """
37+ if not isinstance (date_string , str ):
38+ return False
39+ try :
40+ # dateutil.parser can handle many date formats
41+ date_parser .parse (date_string )
42+ return True
43+ except (ValueError , TypeError ):
44+ return False
45+
2546 def __init__ (self , database_url : str , db_objects_to_treat : list = None , logger_level = "DEBUG" ):
2647 if db_objects_to_treat is None :
2748 db_objects_to_treat = []
@@ -60,10 +81,10 @@ def _connect_to_database(self, database_url):
6081 def _insert_object (self , db_object : Base ) -> bool | None :
6182 with self .session as session :
6283 try :
63- session .begin (nested = True )
64- session .add (db_object )
65- session .commit ()
66- return True
84+ with session .begin (nested = True ):
85+ session .add (db_object )
86+ session .commit ()
87+ return True
6788 except IntegrityError as e :
6889 session .rollback ()
6990 if isinstance (e .orig , UniqueViolation ):
0 commit comments