Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix min_qg_version query in plugins.xml #224

Merged
merged 3 commits into from
Apr 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions qgis-app/plugins/tests/test_view.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from django.test import TestCase

from plugins.views import _add_patch_version


class TestTruncateVersion(TestCase):
"""Test _add_patch_version function"""

def test__add_patch_version_with_3_segment_version_number(self):
version = '1.2.3'
self.assertEqual(_add_patch_version(version, '99'), '1.2.3')

def test__add_patch_version_with_2_segment_version_number(self):
version = '1.2'
self.assertEqual(_add_patch_version(version, '00'), '1.2.00')

def test__add_patch_version_with_1_segment_version_number(self):
version = '1'
self.assertEqual(_add_patch_version(version, '99'), '1')

def test__add_patch_version_with_None(self):
version = None
self.assertEqual(_add_patch_version(version, '99'), None)

def test__add_patch_version_with_empty_string(self):
version = ''
self.assertEqual(_add_patch_version(version, '99'), '')
45 changes: 33 additions & 12 deletions qgis-app/plugins/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,25 @@ def version_detail(request, package_name, version):
from django.views.decorators.cache import cache_page


def _add_patch_version(version: str, additional_patch: str ) -> str:
"""To add patch number in version.

e.g qgis version = 3.16 we add patch number (99) in versioning -> 3.16.99
We use this versioning to query against PluginVersion min_qg_version,
so that the query result will include all PluginVersion with
minimum QGIS version 3.16 regardless of the patch number.
"""

if not version:
return version
separator = '.'
v = version.split(separator)
if len(v) == 2:
two_first_segment = separator.join(v[:2])
version = f'{two_first_segment}.{additional_patch}'
return version


@cache_page(60 * 15)
def xml_plugins(request, qg_version=None, stable_only=None, package_name=None):
"""
Expand All @@ -924,10 +943,10 @@ def xml_plugins(request, qg_version=None, stable_only=None, package_name=None):
object_list = []

if qg_version:
filters.update({'pluginversion__min_qg_version__lte' : qg_version})
version_filters.update({'min_qg_version__lte' : qg_version})
filters.update({'pluginversion__max_qg_version__gte' : qg_version})
version_filters.update({'max_qg_version__gte' : qg_version})
filters.update({'pluginversion__min_qg_version__lte' : _add_patch_version(qg_version, '99')})
version_filters.update({'min_qg_version__lte' : _add_patch_version(qg_version, '99')})
filters.update({'pluginversion__max_qg_version__gte' : _add_patch_version(qg_version, '0')})
version_filters.update({'max_qg_version__gte' : _add_patch_version(qg_version, '0')})


# Get all versions for the given plugin)
Expand Down Expand Up @@ -1001,10 +1020,10 @@ def xml_plugins_new(request, qg_version=None, stable_only=None, package_name=Non
object_list = []

if qg_version:
filters.update({'pluginversion__min_qg_version__lte' : qg_version})
version_filters.update({'min_qg_version__lte' : qg_version})
filters.update({'pluginversion__max_qg_version__gte' : qg_version})
version_filters.update({'max_qg_version__gte' : qg_version})
filters.update({'pluginversion__min_qg_version__lte' : _add_patch_version(qg_version, '99')})
version_filters.update({'min_qg_version__lte' : _add_patch_version(qg_version, '99')})
filters.update({'pluginversion__max_qg_version__gte' : _add_patch_version(qg_version, '0')})
version_filters.update({'max_qg_version__gte' : _add_patch_version(qg_version, '0')})

# Get all versions for the given plugin
if package_name:
Expand Down Expand Up @@ -1045,8 +1064,8 @@ def xml_plugins_new(request, qg_version=None, stable_only=None, package_name=Non
FROM %(pv_table)s pv
WHERE (
pv.approved = True
AND pv."max_qg_version" >= '%(qg_version)s'
AND pv."min_qg_version" <= '%(qg_version)s'
AND pv."max_qg_version" >= '%(qg_version_with_patch_0)s'
AND pv."min_qg_version" <= '%(qg_version_with_patch_99)s'
AND pv.experimental = %(experimental)s
)
ORDER BY pv.plugin_id, pv.version DESC
Expand All @@ -1056,7 +1075,8 @@ def xml_plugins_new(request, qg_version=None, stable_only=None, package_name=Non
object_list_new = PluginVersion.objects.raw(sql % {
'pv_table': PluginVersion._meta.db_table,
'p_table': Plugin._meta.db_table,
'qg_version': qg_version,
'qg_version_with_patch_0': _add_patch_version(qg_version, '0'),
'qg_version_with_patch_99': _add_patch_version(qg_version, '99'),
'experimental': 'False',
'trusted_users_ids': str(trusted_users_ids),
})
Expand All @@ -1068,7 +1088,8 @@ def xml_plugins_new(request, qg_version=None, stable_only=None, package_name=Non
object_list_new += [o for o in PluginVersion.objects.raw(sql % {
'pv_table': PluginVersion._meta.db_table,
'p_table': Plugin._meta.db_table,
'qg_version': qg_version,
'qg_version_with_patch_0': _add_patch_version(qg_version, '0'),
'qg_version_with_patch_99': _add_patch_version(qg_version, '99'),
'experimental': 'True',
'trusted_users_ids': str(trusted_users_ids),
})]
Expand Down