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 == ',' assert tokens[i].src == ','
tokens[i] = tokens[i]._replace(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): def visit_attribute(_node: ast.Attribute, _parent):
if isinstance(_node.value, ast.Name): if isinstance(_node.value, ast.Name):

View File

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