Selaa lähdekoodia

Merge pull request #18184 from akurungadam/version-14-hotfix

fix: pypika does not parse datetime.time
version-14
Aradhya Tripathi 2 vuotta sitten
committed by GitHub
vanhempi
commit
e245c09a3e
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
3 muutettua tiedostoa jossa 53 lisäystä ja 3 poistoa
  1. +4
    -0
      frappe/query_builder/functions.py
  2. +6
    -3
      frappe/query_builder/terms.py
  3. +43
    -0
      frappe/tests/test_query_builder.py

+ 4
- 0
frappe/query_builder/functions.py Näytä tiedosto

@@ -1,3 +1,4 @@
from datetime import time
from enum import Enum

from pypika.functions import *
@@ -35,6 +36,9 @@ Match = ImportMapper({db_type_is.MARIADB: MATCH, db_type_is.POSTGRES: TO_TSVECTO

class _PostgresTimestamp(ArithmeticExpression):
def __init__(self, datepart, timepart, alias=None):
"""Postgres would need both datepart and timepart to be a string for concatenation"""
if isinstance(timepart, time) or isinstance(datepart, time):
timepart, datepart = str(timepart), str(datepart)
if isinstance(datepart, str):
datepart = Cast(datepart, "date")
if isinstance(timepart, str):


+ 6
- 3
frappe/query_builder/terms.py Näytä tiedosto

@@ -1,11 +1,11 @@
from datetime import timedelta
from datetime import 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

from frappe.utils.data import format_timedelta
from frappe.utils.data import format_time, format_timedelta


class NamedParameterWrapper:
@@ -55,9 +55,12 @@ class ParameterizedValueWrapper(ValueWrapper):
value_sql = self.get_value_sql(quote_char=quote_char, **kwargs)
sql = param_wrapper.get_sql(param_value=value_sql, **kwargs)
else:
# * BUG: pypika doesen't parse timedeltas
# * BUG: pypika doesen't parse timedeltas and datetime.time
if isinstance(self.value, timedelta):
self.value = format_timedelta(self.value)
elif isinstance(self.value, time):
self.value = format_time(self.value)

sql = self.get_value_sql(
quote_char=quote_char,
secondary_quote_char=secondary_quote_char,


+ 43
- 0
frappe/tests/test_query_builder.py Näytä tiedosto

@@ -1,5 +1,6 @@
import unittest
from collections.abc import Callable
from datetime import time

import frappe
from frappe.query_builder import Case
@@ -74,6 +75,26 @@ class TestCustomFunctionsMariaDB(FrappeTestCase):
str(select_query).lower(),
)

def test_time(self):
note = frappe.qb.DocType("Note")
self.assertEqual(
"TIMESTAMP('2021-01-01','00:00:21')", CombineDatetime("2021-01-01", time(0, 0, 21)).get_sql()
)

select_query = frappe.qb.from_(note).select(
CombineDatetime(note.posting_date, note.posting_time)
)
self.assertIn("select timestamp(`posting_date`,`posting_time`)", str(select_query).lower())

select_query = select_query.where(
CombineDatetime(note.posting_date, note.posting_time)
>= CombineDatetime("2021-01-01", time(0, 0, 1))
)
self.assertIn(
"timestamp(`posting_date`,`posting_time`)>=timestamp('2021-01-01','00:00:01')",
str(select_query).lower(),
)

def test_cast(self):
note = frappe.qb.DocType("Note")
self.assertEqual("CONCAT(name,'')", Cast_(note.name, "varchar").get_sql())
@@ -141,6 +162,28 @@ class TestCustomFunctionsPostgres(FrappeTestCase):
'"tabnote"."posting_date"+"tabnote"."posting_time" "timestamp"', str(select_query).lower()
)

def test_time(self):
note = frappe.qb.DocType("Note")

self.assertEqual(
"CAST('2021-01-01' AS DATE)+CAST('00:00:21' AS TIME)",
CombineDatetime("2021-01-01", time(0, 0, 21)).get_sql(),
)

select_query = frappe.qb.from_(note).select(
CombineDatetime(note.posting_date, note.posting_time)
)
self.assertIn('select "posting_date"+"posting_time"', str(select_query).lower())

select_query = select_query.where(
CombineDatetime(note.posting_date, note.posting_time)
>= CombineDatetime("2021-01-01", time(0, 0, 1))
)
self.assertIn(
"""where "posting_date"+"posting_time">=cast('2021-01-01' as date)+cast('00:00:01' as time)""",
str(select_query).lower(),
)

def test_cast(self):
note = frappe.qb.DocType("Note")
self.assertEqual("CAST(name AS VARCHAR)", Cast_(note.name, "varchar").get_sql())


Ladataan…
Peruuta
Tallenna