From ddd733282a810665f18684b5b75551f691fc3a2e Mon Sep 17 00:00:00 2001 From: Lendemor Date: Fri, 22 Nov 2024 01:42:56 +0100 Subject: [PATCH] add LiteralDatetimeVar --- reflex/vars/datetime.py | 62 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/reflex/vars/datetime.py b/reflex/vars/datetime.py index cd2208fb2..806a807d0 100644 --- a/reflex/vars/datetime.py +++ b/reflex/vars/datetime.py @@ -2,13 +2,23 @@ from __future__ import annotations +import dataclasses +import json +import sys from datetime import date, datetime from typing import Any, NoReturn, TypeVar, Union, overload from reflex.utils.exceptions import VarTypeError from reflex.vars.number import BooleanVar -from .base import CustomVarOperationReturn, Var, var_operation, var_operation_return +from .base import ( + CustomVarOperationReturn, + LiteralVar, + Var, + VarData, + var_operation, + var_operation_return, +) DATETIME_T = TypeVar("DATETIME_T", datetime, date) @@ -176,9 +186,57 @@ def date_compare_operation( The result of the operation. """ return var_operation_return( - f"isTrue({lhs} { '<' if strict else '<='} {rhs})", + f"({lhs} { '<' if strict else '<='} {rhs})", bool, ) +@dataclasses.dataclass( + eq=False, + frozen=True, + **{"slots": True} if sys.version_info >= (3, 10) else {}, +) +class LiteralDatetimeVar(LiteralVar, DateTimeVar): + """Base class for immutable datetime and date vars.""" + + _var_value: datetime | date = dataclasses.field(default=datetime.now()) + + def json(self) -> str: + """Return the JSON representation of the datetime. + + Returns: + The JSON representation of the datetime. + """ + return json.dumps(self._var_value) + + def __hash__(self) -> int: + """Calculate the hash value of the object. + + Returns: + int: The hash value of the object. + """ + return hash((self.__class__.__name__, self._var_value)) + + @classmethod + def create(cls, value: datetime | date, _var_data: VarData | None = None): + """Create a new instance of the class. + + Args: + value: The value to set. + + Returns: + LiteralDatetimeVar: The new instance of the class. + """ + if isinstance(value, datetime): + js_expr = f"new Date({value.year}, {value.month - 1}, {value.day}, {value.hour}, {value.minute}, {value.second}, {value.microsecond})" + elif isinstance(value, date): + js_expr = f"new Date({value.year}, {value.month - 1}, {value.day})" + return cls( + _js_expr=js_expr, + _var_type=type(value), + _var_value=value, + _var_data=_var_data, + ) + + DATETIME_TYPES = (datetime, date, DateTimeVar)