pyqt5toqt6: Catch QDateTime(QDate) constructor and replace with

QDateTime(QDate, QTime)
This commit is contained in:
Nyall Dawson 2024-01-31 13:05:19 +10:00 committed by Julien Cabieces
parent 6851f26fdd
commit 0acf51e8e5
2 changed files with 27 additions and 7 deletions

View File

@ -234,7 +234,27 @@ def fix_file(filename: str, qgis3_compat: bool) -> int:
assert tokens[i].src == ','
tokens[i] = tokens[i]._replace(src='),')
custom_updates[Offset(node.lineno, node.col_offset)] = _fix_qdatetime_construct
custom_updates[Offset(_node.lineno, _node.col_offset)] = _fix_qdatetime_construct
elif len(_node.args) == 1 and isinstance(_node.args[0], ast.Call) and _node.args[0].func.id == 'QDate':
# QDateTime(QDate(..)) doesn't work anymore,
# so port to more reliable QDateTime(QDate(...), QTime(0,0,0)) form
extra_imports['qgis.PyQt.QtCore'].update({'QTime'})
def _fix_qdatetime_construct(start_index: int, tokens):
assert tokens[start_index].src == 'QDateTime'
assert tokens[start_index + 1].src == '('
assert tokens[start_index + 2].src == 'QDate'
assert tokens[start_index + 3].src == '('
i = start_index + 4
while tokens[i].offset < Offset(_node.args[0].end_lineno,
_node.args[0].end_col_offset):
i += 1
assert tokens[i - 1].src == ')'
tokens[i - 1] = tokens[i - 1]._replace(src='), QTime(0, 0, 0)')
custom_updates[Offset(_node.lineno,
_node.col_offset)] = _fix_qdatetime_construct
def visit_attribute(_node: ast.Attribute, _parent):
if isinstance(_node.value, ast.Name):

View File

@ -161,16 +161,16 @@ def createJoinLayer():
"joinlayer", "memory")
pr = joinLayer.dataProvider()
f1 = QgsFeature()
f1.setAttributes(["foo", 123, 321, QDateTime(QDate(2010, 1, 1))])
f1.setAttributes(["foo", 123, 321, QDateTime(QDate(2010, 1, 1), QTime(0, 0, 0))])
f1.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(1, 1)))
f2 = QgsFeature()
f2.setAttributes(["bar", 456, 654, QDateTime(QDate(2020, 1, 1))])
f2.setAttributes(["bar", 456, 654, QDateTime(QDate(2020, 1, 1), QTime(0, 0, 0))])
f2.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2, 2)))
f3 = QgsFeature()
f3.setAttributes(["qar", 457, 111, None])
f3.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2, 2)))
f4 = QgsFeature()
f4.setAttributes(["a", 458, 19, QDateTime(QDate(2012, 1, 1))])
f4.setAttributes(["a", 458, 19, QDateTime(QDate(2012, 1, 1), QTime(0, 0, 0))])
f4.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2, 2)))
assert pr.addFeatures([f1, f2, f3, f4])
assert joinLayer.featureCount() == 4
@ -2043,9 +2043,9 @@ class TestQgsVectorLayer(QgisTestCase, FeatureSourceTestCase):
self.assertEqual(layer.minimumAndMaximumValue(3), (111, 321))
# dates (maximumValue also tests we properly handle null values by skipping those)
self.assertEqual(layer.minimumValue(4), QDateTime(QDate(2010, 1, 1)))
self.assertEqual(layer.maximumValue(4), QDateTime(QDate(2010, 1, 1)))
self.assertEqual(layer.minimumAndMaximumValue(4), (QDateTime(QDate(2010, 1, 1)), QDateTime(QDate(2010, 1, 1))))
self.assertEqual(layer.minimumValue(4), QDateTime(QDate(2010, 1, 1), QTime(0, 0, 0)))
self.assertEqual(layer.maximumValue(4), QDateTime(QDate(2010, 1, 1), QTime(0, 0, 0)))
self.assertEqual(layer.minimumAndMaximumValue(4), (QDateTime(QDate(2010, 1, 1), QTime(0, 0, 0)), QDateTime(QDate(2010, 1, 1), QTime(0, 0, 0))))
self.assertEqual(set(layer.uniqueValues(3)), {111, 321})