fix: datetime comparison in QB (#26364)
closes https://github.com/frappe/frappe/issues/26363
This commit is contained in:
parent
c2d5ef175c
commit
5de5e25df6
3 changed files with 20 additions and 3 deletions
|
|
@ -1105,7 +1105,7 @@ class Database:
|
|||
"""Return True if at least one row exists."""
|
||||
return frappe.get_all(doctype, limit=1, order_by=None, as_list=True)
|
||||
|
||||
def exists(self, dt, dn=None, cache=False):
|
||||
def exists(self, dt, dn=None, cache=False, *, debug=False):
|
||||
"""Return the document name of a matching document, or None.
|
||||
|
||||
Note: `cache` only works if `dt` and `dn` are of type `str`.
|
||||
|
|
@ -1138,7 +1138,7 @@ class Database:
|
|||
dt = dt.copy() # don't modify the original dict
|
||||
dt, dn = dt.pop("doctype"), dt
|
||||
|
||||
return self.get_value(dt, dn, ignore=True, cache=cache, order_by=None)
|
||||
return self.get_value(dt, dn, ignore=True, cache=cache, order_by=None, debug=debug)
|
||||
|
||||
def count(self, dt, filters=None, debug=False, cache=False, distinct: bool = True):
|
||||
"""Return `COUNT(*)` for given DocType and filters."""
|
||||
|
|
|
|||
|
|
@ -1,10 +1,11 @@
|
|||
from datetime import time, timedelta
|
||||
from datetime import datetime, time, timedelta
|
||||
from typing import Any
|
||||
|
||||
from pypika.queries import QueryBuilder
|
||||
from pypika.terms import Criterion, Function, ValueWrapper
|
||||
from pypika.utils import format_alias_sql
|
||||
|
||||
import frappe
|
||||
from frappe.utils.data import format_time, format_timedelta
|
||||
|
||||
|
||||
|
|
@ -56,6 +57,8 @@ class ParameterizedValueWrapper(ValueWrapper):
|
|||
self.value = format_timedelta(self.value)
|
||||
elif isinstance(self.value, time):
|
||||
self.value = format_time(self.value)
|
||||
elif isinstance(self.value, datetime):
|
||||
self.value = frappe.db.format_datetime(self.value)
|
||||
|
||||
sql = self.get_value_sql(
|
||||
quote_char=quote_char,
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ from frappe.query_builder.functions import Concat_ws
|
|||
from frappe.tests.test_query_builder import db_type_is, run_only_if
|
||||
from frappe.tests.utils import FrappeTestCase, patch_hooks, timeout
|
||||
from frappe.utils import add_days, now, random_string, set_request
|
||||
from frappe.utils.data import now_datetime
|
||||
from frappe.utils.testutils import clear_custom_fields
|
||||
|
||||
|
||||
|
|
@ -504,6 +505,19 @@ class TestDB(FrappeTestCase):
|
|||
|
||||
self.assertEqual(frappe.db.exists(dt, [["name", "=", dn]]), dn)
|
||||
|
||||
def test_datetime_serialization(self):
|
||||
dt = now_datetime()
|
||||
dt = dt.replace(microsecond=0)
|
||||
self.assertEqual(str(dt), str(frappe.db.sql("select %s", dt)[0][0]))
|
||||
|
||||
frappe.db.exists("User", {"creation": (">", dt)})
|
||||
self.assertIn(str(dt), str(frappe.db.last_query))
|
||||
|
||||
before = now_datetime()
|
||||
note = frappe.get_doc(doctype="Note", title=frappe.generate_hash(), content="something").insert()
|
||||
after = now_datetime()
|
||||
self.assertEqual(note.name, frappe.db.exists("Note", {"creation": ("between", (before, after))}))
|
||||
|
||||
def test_bulk_insert(self):
|
||||
current_count = frappe.db.count("ToDo")
|
||||
test_body = f"test_bulk_insert - {random_string(10)}"
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue