From acaa854a77a2c5cc0eac21388fc44e998097bc7c Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Mon, 13 Nov 2023 15:31:17 -0500 Subject: [PATCH 01/10] run tests against python 3.8 through 3.11 - no longer runs tests against 3.7 as it as been EOLed --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9bc9ae6..dcf4fb0 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -12,7 +12,7 @@ jobs: strategy: matrix: - python-version: [ "3.7", "3.8", "3.9" ] + python-version: [ "3.8", "3.9", "3.10", "3.11" ] steps: - uses: actions/checkout@v4 From 9145e40861dded181f12bfda0d9599919d2cf570 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Mon, 13 Nov 2023 15:35:19 -0500 Subject: [PATCH 02/10] run tests against both django 3.2 and 4.2 --- .github/workflows/tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index dcf4fb0..4682478 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -13,6 +13,7 @@ jobs: strategy: matrix: python-version: [ "3.8", "3.9", "3.10", "3.11" ] + django-version: [ "3.2.*", "4.2.*" ] steps: - uses: actions/checkout@v4 @@ -21,7 +22,7 @@ jobs: python-version: ${{ matrix.python-version }} - name: install dependencies run: | - pip install django==3.2.* + pip install django==${{ matrix.django-version }} pip install -e . pip install coverage coveralls - name: run tests From a4537ab51890c9860e300f1276fe54c0894b8c0d Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Tue, 14 Nov 2023 14:42:50 -0500 Subject: [PATCH 03/10] update setup.py to reflect current state - support python 3.8 - 3.11 - support django 3 and 4, drop support for 2 --- setup.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index a188f37..14d5da4 100644 --- a/setup.py +++ b/setup.py @@ -30,9 +30,9 @@ def get_readme(): packages=find_packages(), zip_safe=False, install_requires=[ - # avoid django 2 <2.2.10 and django 3 < 3.0.7 + # avoid django 3 < 3.0.7 # https://github.com/advisories/GHSA-hmr4-m2h5-33qx - 'django>=2.2.13,!=3.0.0,!=3.0.1,!=3.0.2,!=3.0.3,!=3.0.4,!=3.0.5,!=3.0.6,<4', + 'django>=3.0.7,<5', 'jsonfield>=1.0.3,<4', 'simplejson', ], @@ -45,9 +45,10 @@ def get_readme(): 'Operating System :: OS Independent', 'Programming Language :: Python', 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', 'Topic :: Software Development :: Libraries :: Python Modules', ], options={"bdist_wheel": {"universal": "1"}}, From ebfcaae15d6abbfd1459c54fbe965bb1ac78a678 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Tue, 14 Nov 2023 15:54:54 -0500 Subject: [PATCH 04/10] update gitignore --- .gitignore | 58 +++--------------------------------------------------- 1 file changed, 3 insertions(+), 55 deletions(-) diff --git a/.gitignore b/.gitignore index b20c1f5..d2953df 100644 --- a/.gitignore +++ b/.gitignore @@ -1,58 +1,6 @@ -*.py[cod] -*~ -\#* -.\#* -.history -.mypy_cache -.vscode +.python-version -# README.txt is just for the Cheeseshop; README.md is the authoritative one -/README.txt -/commcare_export/VERSION - -# OSX droppings -.DS_Store - -# C extensions -*.so - -# Packages -*.egg -*.egg-info -dist -build -eggs -parts -bin -var -sdist -develop-eggs -.installed.cfg -lib -lib64 -/pip-wheel-metadata - -# Installer logs -pip-log.txt - -# Unit test / coverage reports .coverage -.tox -nosetests.xml -# Translations -*.mo - -# Mr Developer -.mr.developer.cfg -.project -.pydevproject - -# PyCharm -.idea - -# Excel -~*.xlsx - -/docs/_build -/django-prbac.db +*.egg-info +__pycache__/ From 19f547c7f8f219df89f5524d6152f932437149e5 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Wed, 15 Nov 2023 09:21:30 -0500 Subject: [PATCH 05/10] breaking change: import django.urls.re_path instead of django.conf.urls.url --- django_prbac/urls.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_prbac/urls.py b/django_prbac/urls.py index d69c573..5f4d44e 100644 --- a/django_prbac/urls.py +++ b/django_prbac/urls.py @@ -1,8 +1,8 @@ -from django.conf.urls import url +from django.urls import re_path from django.contrib import admin admin.autodiscover() urlpatterns = [ - url(r'^admin/', admin.site.urls), + re_path(r'^admin/', admin.site.urls), ] From d4e5004316c36aa79dbaccab12baec27d4848219 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Wed, 15 Nov 2023 22:51:14 -0500 Subject: [PATCH 06/10] Fix django 4 change to unsaved models --- django_prbac/tests/test_models.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/django_prbac/tests/test_models.py b/django_prbac/tests/test_models.py index ef0bb1d..6e32a3a 100644 --- a/django_prbac/tests/test_models.py +++ b/django_prbac/tests/test_models.py @@ -71,10 +71,16 @@ def test_has_permission_immediate_params(self): self.assertFalse(subrole.instantiate({}).has_privilege(superrole1.instantiate(dict(one='baz')))) def test_unsaved_role_does_not_have_permission(self): + import django role1 = Role() role2 = arbitrary.role() - self.assertFalse(role1.has_privilege(role2)) - self.assertFalse(role2.has_privilege(role1)) + if django.VERSION >= (4, 0): + with self.assertRaises(ValueError): + self.assertFalse(role1.has_privilege(role2)) + self.assertFalse(role2.has_privilege(role1)) + else: + self.assertFalse(role1.has_privilege(role2)) + self.assertFalse(role2.has_privilege(role1)) class TestGrant(TestCase): From 3f7105b5bf87e5472a9ef5f45b56ca42eb2005d0 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Thu, 16 Nov 2023 21:56:59 -0500 Subject: [PATCH 07/10] use django-admin instead of django-admin.py --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4682478..def60f1 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -27,7 +27,7 @@ jobs: pip install coverage coveralls - name: run tests run: | - coverage run --source='django_prbac' `which django-admin.py` test django_prbac --settings django_prbac.mock_settings --traceback + coverage run --source='django_prbac' `which django-admin` test django_prbac --settings django_prbac.mock_settings --traceback - name: report coverage stats env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 9c0f27706e9dd3ede3e6aeb4e216c9e446156a16 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Sat, 18 Nov 2023 12:20:36 -0500 Subject: [PATCH 08/10] Handle ValueError raised in get_privileges Django 4 raises a ValueError when attempting to read a fk relationship on an unsaved model, rather than return an empty list. --- django_prbac/models.py | 8 ++++++-- django_prbac/tests/test_models.py | 10 ++-------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/django_prbac/models.py b/django_prbac/models.py index 0f88fd3..9a4c94a 100644 --- a/django_prbac/models.py +++ b/django_prbac/models.py @@ -144,8 +144,12 @@ def get_privileges(self, assignment): return self._granted_privileges except AttributeError: pass - return [membership.instantiated_to_role(assignment) - for membership in self.memberships_granted.all()] + try: + return [membership.instantiated_to_role(assignment) + for membership in self.memberships_granted.all()] + except ValueError: + # Django 4 raises ValueError if fk relationship is accessed prior to save + return [] def instantiate(self, assignment): """ diff --git a/django_prbac/tests/test_models.py b/django_prbac/tests/test_models.py index 6e32a3a..ef0bb1d 100644 --- a/django_prbac/tests/test_models.py +++ b/django_prbac/tests/test_models.py @@ -71,16 +71,10 @@ def test_has_permission_immediate_params(self): self.assertFalse(subrole.instantiate({}).has_privilege(superrole1.instantiate(dict(one='baz')))) def test_unsaved_role_does_not_have_permission(self): - import django role1 = Role() role2 = arbitrary.role() - if django.VERSION >= (4, 0): - with self.assertRaises(ValueError): - self.assertFalse(role1.has_privilege(role2)) - self.assertFalse(role2.has_privilege(role1)) - else: - self.assertFalse(role1.has_privilege(role2)) - self.assertFalse(role2.has_privilege(role1)) + self.assertFalse(role1.has_privilege(role2)) + self.assertFalse(role2.has_privilege(role1)) class TestGrant(TestCase): From d375bbefb54a7010f9df0cab54d80a8b51a77df6 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Mon, 20 Nov 2023 13:09:09 -0500 Subject: [PATCH 09/10] Minimize try block to code that we expect to potetially raise ValueError Co-authored-by: Daniel Miller --- django_prbac/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django_prbac/models.py b/django_prbac/models.py index 9a4c94a..9ab78fe 100644 --- a/django_prbac/models.py +++ b/django_prbac/models.py @@ -145,11 +145,11 @@ def get_privileges(self, assignment): except AttributeError: pass try: - return [membership.instantiated_to_role(assignment) - for membership in self.memberships_granted.all()] + memberships = self.memberships_granted.all() except ValueError: # Django 4 raises ValueError if fk relationship is accessed prior to save return [] + return [m.instantiated_to_role(assignment) for m in memberships] def instantiate(self, assignment): """ From 538989a99f24ea2f330de223b2c694df0839d307 Mon Sep 17 00:00:00 2001 From: Graham Herceg Date: Mon, 20 Nov 2023 13:15:39 -0500 Subject: [PATCH 10/10] Revert gitignore update that clobbered it Reverts ebfcaae15d6abbfd1459c54fbe965bb1ac78a678 and adds line to ignore .python-version --- .gitignore | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index d2953df..3c77127 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,61 @@ -.python-version +*.py[cod] +*~ +\#* +.\#* +.history +.mypy_cache +.vscode -.coverage +# README.txt is just for the Cheeseshop; README.md is the authoritative one +/README.txt +/commcare_export/VERSION + +# OSX droppings +.DS_Store + +# C extensions +*.so +# Packages +*.egg *.egg-info -__pycache__/ +dist +build +eggs +parts +bin +var +sdist +develop-eggs +.installed.cfg +lib +lib64 +/pip-wheel-metadata + +# Installer logs +pip-log.txt + +# Unit test / coverage reports +.coverage +.tox +nosetests.xml + +# Translations +*.mo + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# PyCharm +.idea + +# Excel +~*.xlsx + +/docs/_build +/django-prbac.db + +# virtualenv +.python-version