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: