diff --git a/qgis-app/plugins/migrations/0010_auto_20240422_0151.py b/qgis-app/plugins/migrations/0010_auto_20240422_0151.py
new file mode 100644
index 00000000..c276b748
--- /dev/null
+++ b/qgis-app/plugins/migrations/0010_auto_20240422_0151.py
@@ -0,0 +1,23 @@
+# Generated by Django 2.2.25 on 2024-04-22 01:51
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('plugins', '0009_merge_20240418_0349'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='pluginversion',
+ name='max_qt_version',
+ field=models.IntegerField(default=5, verbose_name='Maximum Qt version'),
+ ),
+ migrations.AddField(
+ model_name='pluginversion',
+ name='min_qt_version',
+ field=models.IntegerField(default=5, verbose_name='Minimum Qt version'),
+ ),
+ ]
diff --git a/qgis-app/plugins/models.py b/qgis-app/plugins/models.py
index 9f9cc209..b07ea961 100644
--- a/qgis-app/plugins/models.py
+++ b/qgis-app/plugins/models.py
@@ -750,6 +750,17 @@ class PluginVersion(models.Model):
blank=False,
null=True,
)
+
+ min_qt_version = models.IntegerField(
+ _("Minimum Qt version"),
+ default=5
+ )
+
+ max_qt_version = models.IntegerField(
+ _("Maximum Qt version"),
+ default=5
+ )
+
is_from_token = models.BooleanField(
_("Is uploaded using token"),
default=False
diff --git a/qgis-app/plugins/templates/plugins/plugins.xml b/qgis-app/plugins/templates/plugins/plugins.xml
index cf28e89f..0da83c85 100644
--- a/qgis-app/plugins/templates/plugins/plugins.xml
+++ b/qgis-app/plugins/templates/plugins/plugins.xml
@@ -26,5 +26,7 @@
{{version.plugin.rating_votes}}
{{version.plugin.external_deps }}
{% if version.plugin.server %}True{% else%}False{% endif %}
+ {{ version.min_qt_version }}
+ {{ version.max_qt_version }}
{% endfor %}
diff --git a/qgis-app/plugins/templates/plugins/version_detail.html b/qgis-app/plugins/templates/plugins/version_detail.html
index b9cd4874..bcb759a5 100644
--- a/qgis-app/plugins/templates/plugins/version_detail.html
+++ b/qgis-app/plugins/templates/plugins/version_detail.html
@@ -31,6 +31,8 @@
{% trans "Version" %}: {{ version }}
{% trans "Uploaded" %}{{ version.created_on|local_timezone }}
{% trans "Minimum QGIS version" %}{{ version.min_qg_version }}
{% trans "Maximum QGIS version" %}{{ version.max_qg_version }}
+ {% trans "Minimum Qt version" %}{{ version.min_qt_version }}
+ {% trans "Maximum Qt version" %}{{ version.max_qt_version }}
{% trans "External dependencies (PIP install string)" %}{{ version.external_deps }}
{% trans "Experimental" %}{{ version.experimental|yesno }}
diff --git a/qgis-app/plugins/tests/test_plugin_upload.py b/qgis-app/plugins/tests/test_plugin_upload.py
index 3539701a..46b302f6 100644
--- a/qgis-app/plugins/tests/test_plugin_upload.py
+++ b/qgis-app/plugins/tests/test_plugin_upload.py
@@ -79,5 +79,38 @@ def test_plugin_upload_form(self):
mail.outbox[0].from_email,
settings.EMAIL_HOST_USER
)
+
+ @patch("plugins.tasks.generate_plugins_xml.delay", new=do_nothing)
+ @patch("plugins.validator._check_url_link", new=do_nothing)
+ def test_plugin_qt6_upload(self):
+ # Log in the test user
+ self.client.login(username='testuser', password='testpassword')
+
+ valid_plugin = os.path.join(TESTFILE_DIR, "valid_plugin_qt6.zip_")
+ with open(valid_plugin, "rb") as file:
+ uploaded_file = SimpleUploadedFile(
+ "valid_plugin_qt6.zip_", file.read(),
+ content_type="application/zip")
+
+ # Test POST request with valid form data
+ response = self.client.post(self.url, {
+ 'package': uploaded_file,
+ })
+
+ self.assertEqual(response.status_code, 302)
+ self.assertTrue(Plugin.objects.filter(name='Test Plugin').exists())
+ self.assertEqual(
+ Plugin.objects.get(name='Test Plugin').tags.filter(
+ name__in=['python', 'example', 'test']).count(),
+ 3)
+ self.assertTrue(
+ PluginVersion.objects.filter(
+ plugin__name='Test Plugin',
+ version='0.0.1',
+ min_qt_version=6,
+ max_qt_version=6,
+ ).exists()
+ )
+
def tearDown(self):
self.client.logout()
diff --git a/qgis-app/plugins/tests/testfiles/valid_plugin_qt6.zip_ b/qgis-app/plugins/tests/testfiles/valid_plugin_qt6.zip_
new file mode 100644
index 00000000..84ed2686
Binary files /dev/null and b/qgis-app/plugins/tests/testfiles/valid_plugin_qt6.zip_ differ
diff --git a/qgis-app/plugins/validator.py b/qgis-app/plugins/validator.py
index e1482bd4..1367f0ea 100644
--- a/qgis-app/plugins/validator.py
+++ b/qgis-app/plugins/validator.py
@@ -46,6 +46,8 @@
"experimental",
"external_deps",
"server",
+ "minQtVersion",
+ "maxQtVersion",
),
)
PLUGIN_BOOLEAN_METADATA = getattr(
diff --git a/qgis-app/plugins/views.py b/qgis-app/plugins/views.py
index d1897117..2e05d4d1 100644
--- a/qgis-app/plugins/views.py
+++ b/qgis-app/plugins/views.py
@@ -454,6 +454,13 @@ def plugin_upload(request):
"external_deps": form.cleaned_data.get("external_deps", ""),
}
+ if form.cleaned_data.get("minQtVersion") and form.cleaned_data.get("maxQtVersion"):
+ try:
+ version_data["min_qt_version"] = int(form.cleaned_data.get("minQtVersion"))
+ version_data["max_qt_version"] = int(form.cleaned_data.get("maxQtVersion"))
+ except Exception as e:
+ pass
+
new_version = PluginVersion(**version_data)
new_version.save()
msg = _("The Plugin has been successfully created.")
diff --git a/qgis-app/static/style/plugins.xsl b/qgis-app/static/style/plugins.xsl
index 85152771..05924593 100644
--- a/qgis-app/static/style/plugins.xsl
+++ b/qgis-app/static/style/plugins.xsl
@@ -157,6 +157,12 @@ Minimum QGIS Version:
Maximum QGIS Version:
+Minimum Qt version:
+
+
+Maximum Qt version:
+
+
Home page: