diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..2862b6a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,20 @@ +name: Build +on: + push: + branches: + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: SonarCloud Scan + uses: SonarSource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/linty.yml b/.github/workflows/linty.yml new file mode 100644 index 0000000..c7c2353 --- /dev/null +++ b/.github/workflows/linty.yml @@ -0,0 +1,26 @@ +name: Lint + +on: + push: + paths: + - '*.py' + +jobs: + flake8_py3: + runs-on: ubuntu-latest + steps: + - name: Setup Python + uses: actions/setup-python@v1 + with: + python-version: 3.11.4 + architecture: x64 + - name: Checkout PyTorch + uses: actions/checkout@master + - name: Install flake8 + run: pip install flake8 + - name: Run flake8 + uses: suo/flake8-github-action@releases/v1 + with: + checkName: 'flake8_py3' # NOTE: this needs to be the same as the job name + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 7e3c9b6..9732bfb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,6 +8,7 @@ env: - DJANGO_VERSION=1.11 - DJANGO_VERSION=2.0 - DJANGO_VERSION=4.1 + - DJANGO_VERSION=4.2 addons: sonarcloud: organization: $SC_ORG diff --git a/Makefile b/Makefile index d6ee853..2d49575 100644 --- a/Makefile +++ b/Makefile @@ -1,18 +1,18 @@ install-python: - pip install --upgrade setuptools - pip install -e . - pip install "file://`pwd`#egg=django-keycloak[dev,doc]" + # pyenv virtualenv 3.11.4 django-keycloak || pyenv activate django-keycloak + pip install --upgrade setuptools poethepoet + poe install + poe addsudo "file://`pwd`#egg=django-keycloak[dev,doc]" bump-patch: - bumpversion patch + poetry version patch bump-minor: - bumpversion minor + poetry version minor deploy-pypi: clear - python3 -c "import sys; sys.version_info >= (3, 5, 3) or sys.stdout.write('Python version must be greatest then 3.5.2\n') or exit(1)" - python3 setup.py sdist bdist_wheel - twine upload dist/* + poetry build + poetry publish clear: rm -rf dist/* diff --git a/README.rst b/README.rst index 0ea062d..908ff30 100644 --- a/README.rst +++ b/README.rst @@ -2,17 +2,17 @@ Django Keycloak =============== -.. image:: https://www.travis-ci.org/Peter-Slump/django-keycloak.svg?branch=master - :target: https://www.travis-ci.org/Peter-Slump/django-keycloak +.. image:: https://www.travis-ci.org/skamansam/django-keycloak.svg?branch=master + :target: https://www.travis-ci.org/skamansam/django-keycloak :alt: Build Status .. image:: https://readthedocs.org/projects/django-keycloak/badge/?version=latest :target: http://django-keycloak.readthedocs.io/en/latest/?badge=latest :alt: Documentation Status -.. image:: https://codecov.io/gh/Peter-Slump/django-keycloak/branch/master/graph/badge.svg - :target: https://codecov.io/gh/Peter-Slump/django-keycloak +.. image:: https://codecov.io/gh/skamansam/django-keycloak/branch/master/graph/badge.svg + :target: https://codecov.io/gh/skamansam/django-keycloak :alt: codecov .. image:: https://api.codeclimate.com/v1/badges/eb19f47dc03dec40cea7/maintainability - :target: https://codeclimate.com/github/Peter-Slump/django-keycloak/maintainability + :target: https://codeclimate.com/github/skamansam/django-keycloak/maintainability :alt: Maintainability Django app to add Keycloak support to your project. @@ -72,6 +72,7 @@ Release Notes ============= **unreleased** +**v0.1.2** **v0.2.5** diff --git a/src/django_keycloak/__init__.py b/django_keycloak/__init__.py similarity index 100% rename from src/django_keycloak/__init__.py rename to django_keycloak/__init__.py diff --git a/src/django_keycloak/admin/__init__.py b/django_keycloak/admin/__init__.py similarity index 100% rename from src/django_keycloak/admin/__init__.py rename to django_keycloak/admin/__init__.py diff --git a/src/django_keycloak/admin/realm.py b/django_keycloak/admin/realm.py similarity index 100% rename from src/django_keycloak/admin/realm.py rename to django_keycloak/admin/realm.py diff --git a/src/django_keycloak/admin/server.py b/django_keycloak/admin/server.py similarity index 100% rename from src/django_keycloak/admin/server.py rename to django_keycloak/admin/server.py diff --git a/src/django_keycloak/app_settings.py b/django_keycloak/app_settings.py similarity index 100% rename from src/django_keycloak/app_settings.py rename to django_keycloak/app_settings.py diff --git a/src/django_keycloak/apps.py b/django_keycloak/apps.py similarity index 100% rename from src/django_keycloak/apps.py rename to django_keycloak/apps.py diff --git a/src/django_keycloak/auth/__init__.py b/django_keycloak/auth/__init__.py similarity index 100% rename from src/django_keycloak/auth/__init__.py rename to django_keycloak/auth/__init__.py diff --git a/src/django_keycloak/auth/backends.py b/django_keycloak/auth/backends.py similarity index 100% rename from src/django_keycloak/auth/backends.py rename to django_keycloak/auth/backends.py diff --git a/src/django_keycloak/factories.py b/django_keycloak/factories.py similarity index 100% rename from src/django_keycloak/factories.py rename to django_keycloak/factories.py diff --git a/src/django_keycloak/hashers.py b/django_keycloak/hashers.py similarity index 100% rename from src/django_keycloak/hashers.py rename to django_keycloak/hashers.py diff --git a/src/django_keycloak/management/__init__.py b/django_keycloak/management/__init__.py similarity index 100% rename from src/django_keycloak/management/__init__.py rename to django_keycloak/management/__init__.py diff --git a/src/django_keycloak/management/commands/__init__.py b/django_keycloak/management/commands/__init__.py similarity index 100% rename from src/django_keycloak/management/commands/__init__.py rename to django_keycloak/management/commands/__init__.py diff --git a/src/django_keycloak/management/commands/keycloak_add_user.py b/django_keycloak/management/commands/keycloak_add_user.py similarity index 100% rename from src/django_keycloak/management/commands/keycloak_add_user.py rename to django_keycloak/management/commands/keycloak_add_user.py diff --git a/src/django_keycloak/management/commands/keycloak_refresh_realm.py b/django_keycloak/management/commands/keycloak_refresh_realm.py similarity index 100% rename from src/django_keycloak/management/commands/keycloak_refresh_realm.py rename to django_keycloak/management/commands/keycloak_refresh_realm.py diff --git a/src/django_keycloak/management/commands/keycloak_sync_resources.py b/django_keycloak/management/commands/keycloak_sync_resources.py similarity index 100% rename from src/django_keycloak/management/commands/keycloak_sync_resources.py rename to django_keycloak/management/commands/keycloak_sync_resources.py diff --git a/src/django_keycloak/middleware.py b/django_keycloak/middleware.py similarity index 100% rename from src/django_keycloak/middleware.py rename to django_keycloak/middleware.py diff --git a/src/django_keycloak/migrations/0001_initial.py b/django_keycloak/migrations/0001_initial.py similarity index 100% rename from src/django_keycloak/migrations/0001_initial.py rename to django_keycloak/migrations/0001_initial.py diff --git a/src/django_keycloak/migrations/0002_auto_20180322_2059.py b/django_keycloak/migrations/0002_auto_20180322_2059.py similarity index 100% rename from src/django_keycloak/migrations/0002_auto_20180322_2059.py rename to django_keycloak/migrations/0002_auto_20180322_2059.py diff --git a/src/django_keycloak/migrations/0003_auto_20190204_1949.py b/django_keycloak/migrations/0003_auto_20190204_1949.py similarity index 100% rename from src/django_keycloak/migrations/0003_auto_20190204_1949.py rename to django_keycloak/migrations/0003_auto_20190204_1949.py diff --git a/src/django_keycloak/migrations/0004_client_service_account_profile.py b/django_keycloak/migrations/0004_client_service_account_profile.py similarity index 100% rename from src/django_keycloak/migrations/0004_client_service_account_profile.py rename to django_keycloak/migrations/0004_client_service_account_profile.py diff --git a/src/django_keycloak/migrations/0005_auto_20190219_2002.py b/django_keycloak/migrations/0005_auto_20190219_2002.py similarity index 100% rename from src/django_keycloak/migrations/0005_auto_20190219_2002.py rename to django_keycloak/migrations/0005_auto_20190219_2002.py diff --git a/src/django_keycloak/migrations/0006_remove_client_service_account.py b/django_keycloak/migrations/0006_remove_client_service_account.py similarity index 100% rename from src/django_keycloak/migrations/0006_remove_client_service_account.py rename to django_keycloak/migrations/0006_remove_client_service_account.py diff --git a/src/django_keycloak/migrations/0007_alter_client_id_alter_exchangedtoken_id_and_more.py b/django_keycloak/migrations/0007_alter_client_id_alter_exchangedtoken_id_and_more.py similarity index 100% rename from src/django_keycloak/migrations/0007_alter_client_id_alter_exchangedtoken_id_and_more.py rename to django_keycloak/migrations/0007_alter_client_id_alter_exchangedtoken_id_and_more.py diff --git a/src/django_keycloak/migrations/__init__.py b/django_keycloak/migrations/__init__.py similarity index 100% rename from src/django_keycloak/migrations/__init__.py rename to django_keycloak/migrations/__init__.py diff --git a/src/django_keycloak/models.py b/django_keycloak/models.py similarity index 100% rename from src/django_keycloak/models.py rename to django_keycloak/models.py diff --git a/src/django_keycloak/remote_user.py b/django_keycloak/remote_user.py similarity index 100% rename from src/django_keycloak/remote_user.py rename to django_keycloak/remote_user.py diff --git a/src/django_keycloak/response.py b/django_keycloak/response.py similarity index 100% rename from src/django_keycloak/response.py rename to django_keycloak/response.py diff --git a/src/django_keycloak/services/__init__.py b/django_keycloak/services/__init__.py similarity index 100% rename from src/django_keycloak/services/__init__.py rename to django_keycloak/services/__init__.py diff --git a/src/django_keycloak/services/client.py b/django_keycloak/services/client.py similarity index 100% rename from src/django_keycloak/services/client.py rename to django_keycloak/services/client.py diff --git a/src/django_keycloak/services/exceptions.py b/django_keycloak/services/exceptions.py similarity index 100% rename from src/django_keycloak/services/exceptions.py rename to django_keycloak/services/exceptions.py diff --git a/src/django_keycloak/services/oidc_profile.py b/django_keycloak/services/oidc_profile.py similarity index 100% rename from src/django_keycloak/services/oidc_profile.py rename to django_keycloak/services/oidc_profile.py diff --git a/src/django_keycloak/services/permissions.py b/django_keycloak/services/permissions.py similarity index 100% rename from src/django_keycloak/services/permissions.py rename to django_keycloak/services/permissions.py diff --git a/src/django_keycloak/services/realm.py b/django_keycloak/services/realm.py similarity index 100% rename from src/django_keycloak/services/realm.py rename to django_keycloak/services/realm.py diff --git a/src/django_keycloak/services/remote_client.py b/django_keycloak/services/remote_client.py similarity index 100% rename from src/django_keycloak/services/remote_client.py rename to django_keycloak/services/remote_client.py diff --git a/src/django_keycloak/services/uma.py b/django_keycloak/services/uma.py similarity index 100% rename from src/django_keycloak/services/uma.py rename to django_keycloak/services/uma.py diff --git a/src/django_keycloak/services/users.py b/django_keycloak/services/users.py similarity index 100% rename from src/django_keycloak/services/users.py rename to django_keycloak/services/users.py diff --git a/src/django_keycloak/templates/django_keycloak/includes/session_iframe_support.html b/django_keycloak/templates/django_keycloak/includes/session_iframe_support.html similarity index 100% rename from src/django_keycloak/templates/django_keycloak/includes/session_iframe_support.html rename to django_keycloak/templates/django_keycloak/includes/session_iframe_support.html diff --git a/src/django_keycloak/templates/django_keycloak/session_iframe.html b/django_keycloak/templates/django_keycloak/session_iframe.html similarity index 100% rename from src/django_keycloak/templates/django_keycloak/session_iframe.html rename to django_keycloak/templates/django_keycloak/session_iframe.html diff --git a/src/django_keycloak/tests/__init__.py b/django_keycloak/tests/__init__.py similarity index 100% rename from src/django_keycloak/tests/__init__.py rename to django_keycloak/tests/__init__.py diff --git a/src/django_keycloak/tests/backends/__init__.py b/django_keycloak/tests/backends/__init__.py similarity index 100% rename from src/django_keycloak/tests/backends/__init__.py rename to django_keycloak/tests/backends/__init__.py diff --git a/src/django_keycloak/tests/backends/keycloak_authorization_base/__init__.py b/django_keycloak/tests/backends/keycloak_authorization_base/__init__.py similarity index 100% rename from src/django_keycloak/tests/backends/keycloak_authorization_base/__init__.py rename to django_keycloak/tests/backends/keycloak_authorization_base/__init__.py diff --git a/src/django_keycloak/tests/backends/keycloak_authorization_base/test_get_keycloak_permissions.py b/django_keycloak/tests/backends/keycloak_authorization_base/test_get_keycloak_permissions.py similarity index 100% rename from src/django_keycloak/tests/backends/keycloak_authorization_base/test_get_keycloak_permissions.py rename to django_keycloak/tests/backends/keycloak_authorization_base/test_get_keycloak_permissions.py diff --git a/src/django_keycloak/tests/backends/keycloak_authorization_base/test_has_perm.py b/django_keycloak/tests/backends/keycloak_authorization_base/test_has_perm.py similarity index 100% rename from src/django_keycloak/tests/backends/keycloak_authorization_base/test_has_perm.py rename to django_keycloak/tests/backends/keycloak_authorization_base/test_has_perm.py diff --git a/src/django_keycloak/tests/mixins.py b/django_keycloak/tests/mixins.py similarity index 100% rename from src/django_keycloak/tests/mixins.py rename to django_keycloak/tests/mixins.py diff --git a/src/django_keycloak/tests/services/__init__.py b/django_keycloak/tests/services/__init__.py similarity index 100% rename from src/django_keycloak/tests/services/__init__.py rename to django_keycloak/tests/services/__init__.py diff --git a/src/django_keycloak/tests/services/oidc_profile/__init__.py b/django_keycloak/tests/services/oidc_profile/__init__.py similarity index 100% rename from src/django_keycloak/tests/services/oidc_profile/__init__.py rename to django_keycloak/tests/services/oidc_profile/__init__.py diff --git a/src/django_keycloak/tests/services/oidc_profile/test_get_active_access_token.py b/django_keycloak/tests/services/oidc_profile/test_get_active_access_token.py similarity index 100% rename from src/django_keycloak/tests/services/oidc_profile/test_get_active_access_token.py rename to django_keycloak/tests/services/oidc_profile/test_get_active_access_token.py diff --git a/src/django_keycloak/tests/services/oidc_profile/test_get_entitlement.py b/django_keycloak/tests/services/oidc_profile/test_get_entitlement.py similarity index 100% rename from src/django_keycloak/tests/services/oidc_profile/test_get_entitlement.py rename to django_keycloak/tests/services/oidc_profile/test_get_entitlement.py diff --git a/src/django_keycloak/tests/services/oidc_profile/test_get_or_create_from_id_token.py b/django_keycloak/tests/services/oidc_profile/test_get_or_create_from_id_token.py similarity index 100% rename from src/django_keycloak/tests/services/oidc_profile/test_get_or_create_from_id_token.py rename to django_keycloak/tests/services/oidc_profile/test_get_or_create_from_id_token.py diff --git a/src/django_keycloak/tests/services/oidc_profile/test_update_or_create.py b/django_keycloak/tests/services/oidc_profile/test_update_or_create.py similarity index 100% rename from src/django_keycloak/tests/services/oidc_profile/test_update_or_create.py rename to django_keycloak/tests/services/oidc_profile/test_update_or_create.py diff --git a/src/django_keycloak/tests/services/realm/__init__.py b/django_keycloak/tests/services/realm/__init__.py similarity index 100% rename from src/django_keycloak/tests/services/realm/__init__.py rename to django_keycloak/tests/services/realm/__init__.py diff --git a/src/django_keycloak/tests/services/realm/test_get_realm_api_client.py b/django_keycloak/tests/services/realm/test_get_realm_api_client.py similarity index 100% rename from src/django_keycloak/tests/services/realm/test_get_realm_api_client.py rename to django_keycloak/tests/services/realm/test_get_realm_api_client.py diff --git a/src/django_keycloak/tests/services/realm/test_refresh_well_known_oidc.py b/django_keycloak/tests/services/realm/test_refresh_well_known_oidc.py similarity index 100% rename from src/django_keycloak/tests/services/realm/test_refresh_well_known_oidc.py rename to django_keycloak/tests/services/realm/test_refresh_well_known_oidc.py diff --git a/src/django_keycloak/tests/settings.py b/django_keycloak/tests/settings.py similarity index 100% rename from src/django_keycloak/tests/settings.py rename to django_keycloak/tests/settings.py diff --git a/src/django_keycloak/urls.py b/django_keycloak/urls.py similarity index 100% rename from src/django_keycloak/urls.py rename to django_keycloak/urls.py diff --git a/src/django_keycloak/views.py b/django_keycloak/views.py similarity index 100% rename from src/django_keycloak/views.py rename to django_keycloak/views.py diff --git a/example/docker-compose.yml b/docker-compose.yml similarity index 58% rename from example/docker-compose.yml rename to docker-compose.yml index 400abe3..0bd41d5 100644 --- a/example/docker-compose.yml +++ b/docker-compose.yml @@ -22,27 +22,42 @@ services: - resource-provider-api keycloak: - image: jboss/keycloak:3.4.3.Final # Pinned to 3.4.3 because this is currently the latest version which has commercial support from Red Hat: https://www.keycloak.org/support.html + # build: ./keycloak + image: quay.io/keycloak/keycloak:latest command: [ - "-b", "0.0.0.0", - "-Dkeycloak.migration.action=import", # Replace with 'export' in order to export everything - "-Dkeycloak.migration.provider=dir", - "-Dkeycloak.migration.dir=/opt/jboss/keycloak/standalone/configuration/export/", - "-Dkeycloak.migration.strategy=IGNORE_EXISTING" + "start-dev", + # "--help", + # "-b", "0.0.0.0", + "--import-realm", + "--log-level=debug", + "--metrics-enabled=true", + "--db=postgres", + "--db-url=postgres:5432", + "--db-username=keycloak", + "--db-password=keycloak", + "--db-schema=keycloak", + # "--verbose", + # "-Dkeycloak.migration.action=import", # Replace with 'export' in order to export everything + # "-Dkeycloak.migration.provider=dir", + # "-Dkeycloak.migration.dir=/opt/keycloak/data/import", + # "-Dkeycloak.migration.strategy=IGNORE_EXISTING" ] environment: - - POSTGRES_DATABASE=keycloak - - POSTGRES_USER=keycloak - - POSTGRES_PASSWORD=password + - KC_METRICS_ENABLED=true + # - POSTGRES_DATABASE=keycloak + # - POSTGRES_USER=keycloak + # - POSTGRES_PASSWORD=password - KEYCLOAK_HOSTNAME=identity.localhost.yarf.nl - # Legacy linking functionality is used - - POSTGRES_PORT_5432_TCP_ADDR=postgres - - POSTGRES_PORT_5432_TCP_PORT=5432 + # # Legacy linking functionality is used + # - POSTGRES_PORT_5432_TCP_ADDR=postgres + # - POSTGRES_PORT_5432_TCP_PORT=5432 - PROXY_ADDRESS_FORWARDING=true - KEYCLOAK_LOGLEVEL=DEBUG -# - JAVA_TOOL_OPTIONS=-Dkeycloak.profile.feature.admin_fine_grained_authz=enabled -Dkeycloak.profile.feature.token_exchange=enabled # Required to enable Token exchange feature in newer versions of Keycloak + # - KEYCLOAK_ADMIN=admin + # - KEYCLOAK_ADMIN_PASSWORD=admin + # # - JAVA_TOOL_OPTIONS=-Dkeycloak.profile.feature.admin_fine_grained_authz=enabled -Dkeycloak.profile.feature.token_exchange=enabled # Required to enable Token exchange feature in newer versions of Keycloak volumes: - - ./keycloak/export:/opt/jboss/keycloak/standalone/configuration/export + - ./keycloak/export:/opt/keycloak/data/import/ networks: default: aliases: diff --git a/docs/index.rst b/docs/index.rst index b9136a7..ca9cd91 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -41,7 +41,7 @@ Install requirement. .. code-block:: bash - $ pip install git+https://github.com/Peter-Slump/django-keycloak.git + $ pip install git+https://github.com/skamansam/django-keycloak.git Setup ===== @@ -85,7 +85,7 @@ add the middleware, configure the urls and point to the correct login page. urlpatterns = [ ... - url(r'^keycloak/', include('django_keycloak.urls')), + path('keycloak/', include('django_keycloak.urls')), ] diff --git a/example/keycloak/Dockerfile b/example/keycloak/Dockerfile new file mode 100644 index 0000000..47cf61b --- /dev/null +++ b/example/keycloak/Dockerfile @@ -0,0 +1,24 @@ +FROM quay.io/keycloak/keycloak:latest as builder + +# Enable health and metrics support +# ENV KC_HEALTH_ENABLED=true +# ENV KC_METRICS_ENABLED=true + +# Configure a database vendor +# ENV KC_DB=postgres + +WORKDIR /opt/keycloak +# for demonstration purposes only, please make sure to use proper certificates in production instead +RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore +RUN /opt/keycloak/bin/kc.sh build + +FROM quay.io/keycloak/keycloak:latest +COPY --from=builder /opt/keycloak/ /opt/keycloak/ + +# change these values to point to a running postgres instance +# ENV KC_DB=postgres +# ENV KC_DB_URL=localhost:5432 +# ENV KC_DB_USERNAME=admin +# ENV KC_DB_PASSWORD=admin +# ENV KC_HOSTNAME=localhost +ENTRYPOINT ["/opt/keycloak/bin/kc.sh"] \ No newline at end of file diff --git a/example/resource-provider-api/Dockerfile b/example/resource-provider-api/Dockerfile index 71be882..463aeb6 100644 --- a/example/resource-provider-api/Dockerfile +++ b/example/resource-provider-api/Dockerfile @@ -1,15 +1,14 @@ -FROM python:3-alpine +FROM python:3.11.4-alpine RUN apk update \ - && apk add git openssl-dev libffi-dev python-dev build-base + && apk add git openssl-dev libffi-dev build-base \ + && pip install poethepoet poetry -RUN mkdir -p /usr/src/app +COPY ./poetry.lock ./pyproject.toml /usr/src/app/ WORKDIR /usr/src/app -COPY requirements.txt /usr/src/app/ - -RUN pip install --no-cache-dir -r requirements.txt +RUN poetry install COPY . /usr/src/app diff --git a/example/resource-provider-api/myapp/urls.py b/example/resource-provider-api/myapp/urls.py index 047f134..1c36cb5 100644 --- a/example/resource-provider-api/myapp/urls.py +++ b/example/resource-provider-api/myapp/urls.py @@ -13,14 +13,14 @@ 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url, include +from django.urls import include, path from django.contrib import admin from myapp import views urlpatterns = [ - url(r'^api/end-point$', views.api_end_point), - url(r'^api/authenticated-end-point$', views.authenticated_end_point), - url(r'^admin/', admin.site.urls), + path(r'api/end-point', views.api_end_point), + path(r'api/authenticated-end-point', views.authenticated_end_point), + path(r'admin/', admin.site.urls), ] diff --git a/example/resource-provider-api/poetry.lock b/example/resource-provider-api/poetry.lock new file mode 100644 index 0000000..1e1befd --- /dev/null +++ b/example/resource-provider-api/poetry.lock @@ -0,0 +1,85 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.7.2" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.7" +files = [ + {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, + {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, +] + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "django" +version = "4.2.4" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Django-4.2.4-py3-none-any.whl", hash = "sha256:860ae6a138a238fc4f22c99b52f3ead982bb4b1aad8c0122bcd8c8a3a02e409d"}, + {file = "Django-4.2.4.tar.gz", hash = "sha256:7e4225ec065e0f354ccf7349a22d209de09cc1c074832be9eb84c51c1799c432"}, +] + +[package.dependencies] +asgiref = ">=3.6.0,<4" +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-dynamic-fixtures" +version = "0.2.1" +description = "Install Dynamic Django fixtures." +optional = false +python-versions = "*" +files = [ + {file = "django-dynamic-fixtures-0.2.1.tar.gz", hash = "sha256:b5c47e20e344b34bb4e5402cec5926e31dc30845cfb1ce09a860f46e94a69e2d"}, + {file = "django_dynamic_fixtures-0.2.1-py2-none-any.whl", hash = "sha256:b4cd49425d208b2f83cfc20d8b4c0726998cb37d54010c9c383fb42418710c1b"}, +] + +[package.dependencies] +Django = ">=1.7" + +[package.extras] +dev = ["bumpversion (==0.5.3)", "twine (==1.9.1)"] +doc = ["Sphinx (==1.4.4)", "sphinx-autobuild (==0.6.0)"] + +[[package]] +name = "sqlparse" +version = "0.4.4" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, + {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, +] + +[package.extras] +dev = ["build", "flake8"] +doc = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "2926b9f945aed824843f286cfe64b4f23b14471d7162c56778f766c40e43c4d8" diff --git a/example/resource-provider-api/pyproject.toml b/example/resource-provider-api/pyproject.toml new file mode 100644 index 0000000..7924390 --- /dev/null +++ b/example/resource-provider-api/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "resource-provider-api" +version = "0.1.0" +description = "api provider for django-keycloak example" +authors = ["Samuel C. Tyler "] +# readme = "README.md" +# packages = [{include = "resource_provider"}] + +[tool.poetry.dependencies] +python = "^3.11" +Django = "^4.2.4" + +[tool.poetry.group.dev.dependencies] +django-dynamic-fixtures = "^0.2.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/example/resource-provider-api/requirements.txt b/example/resource-provider-api/requirements.txt index 0425ac4..ae63bb7 100644 --- a/example/resource-provider-api/requirements.txt +++ b/example/resource-provider-api/requirements.txt @@ -1,3 +1,3 @@ django>=2.0.10 -git+git://github.com/Peter-Slump/django-keycloak.git#egg=django-keycloak +git+git://github.com/skamansam/django-keycloak.git#egg=django-keycloak django-dynamic-fixtures==0.1.7 \ No newline at end of file diff --git a/example/resource-provider/Dockerfile b/example/resource-provider/Dockerfile index bb2d7cf..317d2c9 100644 --- a/example/resource-provider/Dockerfile +++ b/example/resource-provider/Dockerfile @@ -1,15 +1,14 @@ -FROM python:3-alpine +FROM python:3.11.4-alpine RUN apk update \ - && apk add git openssl-dev libffi-dev python-dev build-base + && apk add git openssl-dev libffi-dev build-base \ + && pip install poethepoet poetry -RUN mkdir -p /usr/src/app +COPY ./poetry.lock ./pyproject.toml /usr/src/app/ WORKDIR /usr/src/app -COPY requirements.txt /usr/src/app/ - -RUN pip install --no-cache-dir -r requirements.txt +RUN poetry install COPY . /usr/src/app diff --git a/example/resource-provider/manage.py b/example/resource-provider/manage.py index 7ec07d0..c2cac2f 100755 --- a/example/resource-provider/manage.py +++ b/example/resource-provider/manage.py @@ -2,6 +2,9 @@ import os import sys +sys.path.append(os.path.abspath('../../src')) +print(sys.path) + if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings") try: diff --git a/example/resource-provider/myapp/urls.py b/example/resource-provider/myapp/urls.py index cdfbb3a..aec681e 100644 --- a/example/resource-provider/myapp/urls.py +++ b/example/resource-provider/myapp/urls.py @@ -13,16 +13,16 @@ 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url, include +from django.urls import include, path from django.contrib import admin from myapp import views urlpatterns = [ - url(r'^$', views.Home.as_view(), name='index'), - url(r'^secured$', views.Secured.as_view(), name='secured'), - url(r'^permission$', views.Permission.as_view(), name='permission'), - url(r'^keycloak/', include('django_keycloak.urls')), - url(r'^admin/', admin.site.urls), + path('/', views.Home.as_view(), name='index'), + path('secured', views.Secured.as_view(), name='secured'), + path('permission', views.Permission.as_view(), name='permission'), + path('keycloak', include('django_keycloak.urls')), + path('admin', admin.site.urls), ] diff --git a/example/resource-provider/poetry.lock b/example/resource-provider/poetry.lock new file mode 100644 index 0000000..1e1befd --- /dev/null +++ b/example/resource-provider/poetry.lock @@ -0,0 +1,85 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.7.2" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.7" +files = [ + {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, + {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, +] + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "django" +version = "4.2.4" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Django-4.2.4-py3-none-any.whl", hash = "sha256:860ae6a138a238fc4f22c99b52f3ead982bb4b1aad8c0122bcd8c8a3a02e409d"}, + {file = "Django-4.2.4.tar.gz", hash = "sha256:7e4225ec065e0f354ccf7349a22d209de09cc1c074832be9eb84c51c1799c432"}, +] + +[package.dependencies] +asgiref = ">=3.6.0,<4" +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-dynamic-fixtures" +version = "0.2.1" +description = "Install Dynamic Django fixtures." +optional = false +python-versions = "*" +files = [ + {file = "django-dynamic-fixtures-0.2.1.tar.gz", hash = "sha256:b5c47e20e344b34bb4e5402cec5926e31dc30845cfb1ce09a860f46e94a69e2d"}, + {file = "django_dynamic_fixtures-0.2.1-py2-none-any.whl", hash = "sha256:b4cd49425d208b2f83cfc20d8b4c0726998cb37d54010c9c383fb42418710c1b"}, +] + +[package.dependencies] +Django = ">=1.7" + +[package.extras] +dev = ["bumpversion (==0.5.3)", "twine (==1.9.1)"] +doc = ["Sphinx (==1.4.4)", "sphinx-autobuild (==0.6.0)"] + +[[package]] +name = "sqlparse" +version = "0.4.4" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, + {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, +] + +[package.extras] +dev = ["build", "flake8"] +doc = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "2926b9f945aed824843f286cfe64b4f23b14471d7162c56778f766c40e43c4d8" diff --git a/example/resource-provider/pyproject.toml b/example/resource-provider/pyproject.toml new file mode 100644 index 0000000..6e9bd44 --- /dev/null +++ b/example/resource-provider/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "resource-provider" +version = "0.1.0" +description = "resource provider for django-keycloak example" +authors = ["Samuel C. Tyler "] +# readme = "README.md" +# packages = [{include = "resource_provider"}] + +[tool.poetry.dependencies] +python = "^3.11" +Django = "^4.2.4" + +[tool.poetry.group.dev.dependencies] +django-dynamic-fixtures = "^0.2.1" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/example/resource-provider/requirements.txt b/example/resource-provider/requirements.txt index 0425ac4..ae63bb7 100644 --- a/example/resource-provider/requirements.txt +++ b/example/resource-provider/requirements.txt @@ -1,3 +1,3 @@ django>=2.0.10 -git+git://github.com/Peter-Slump/django-keycloak.git#egg=django-keycloak +git+git://github.com/skamansam/django-keycloak.git#egg=django-keycloak django-dynamic-fixtures==0.1.7 \ No newline at end of file diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..549e15a --- /dev/null +++ b/poetry.lock @@ -0,0 +1,576 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "asgiref" +version = "3.7.2" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.7" +files = [ + {file = "asgiref-3.7.2-py3-none-any.whl", hash = "sha256:89b2ef2247e3b562a16eef663bc0e2e703ec6468e2fa8a5cd61cd449786d4f6e"}, + {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, +] + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "coverage" +version = "7.2.7" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, + {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, + {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, + {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, + {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, + {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, + {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, + {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, + {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, + {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, + {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, + {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, + {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, + {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, + {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, + {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, + {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, + {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, + {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, + {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, + {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, + {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, + {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, + {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, + {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, + {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, + {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, + {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, + {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, + {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, + {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, + {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, + {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "django" +version = "4.2.4" +description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Django-4.2.4-py3-none-any.whl", hash = "sha256:860ae6a138a238fc4f22c99b52f3ead982bb4b1aad8c0122bcd8c8a3a02e409d"}, + {file = "Django-4.2.4.tar.gz", hash = "sha256:7e4225ec065e0f354ccf7349a22d209de09cc1c074832be9eb84c51c1799c432"}, +] + +[package.dependencies] +asgiref = ">=3.6.0,<4" +sqlparse = ">=0.3.1" +tzdata = {version = "*", markers = "sys_platform == \"win32\""} + +[package.extras] +argon2 = ["argon2-cffi (>=19.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +name = "django-dynamic-fixtures" +version = "0.2.1" +description = "Install Dynamic Django fixtures." +optional = false +python-versions = "*" +files = [ + {file = "django-dynamic-fixtures-0.2.1.tar.gz", hash = "sha256:b5c47e20e344b34bb4e5402cec5926e31dc30845cfb1ce09a860f46e94a69e2d"}, + {file = "django_dynamic_fixtures-0.2.1-py2-none-any.whl", hash = "sha256:b4cd49425d208b2f83cfc20d8b4c0726998cb37d54010c9c383fb42418710c1b"}, +] + +[package.dependencies] +Django = ">=1.7" + +[package.extras] +dev = ["bumpversion (==0.5.3)", "twine (==1.9.1)"] +doc = ["Sphinx (==1.4.4)", "sphinx-autobuild (==0.6.0)"] + +[[package]] +name = "ecdsa" +version = "0.18.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, + {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "factory-boy" +version = "3.3.0" +description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." +optional = false +python-versions = ">=3.7" +files = [ + {file = "factory_boy-3.3.0-py2.py3-none-any.whl", hash = "sha256:a2cdbdb63228177aa4f1c52f4b6d83fab2b8623bf602c7dedd7eb83c0f69c04c"}, + {file = "factory_boy-3.3.0.tar.gz", hash = "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1"}, +] + +[package.dependencies] +Faker = ">=0.7.0" + +[package.extras] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "sqlalchemy-utils", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] + +[[package]] +name = "faker" +version = "19.3.0" +description = "Faker is a Python package that generates fake data for you." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Faker-19.3.0-py3-none-any.whl", hash = "sha256:bee54278d6e1289573317604ab6f4782acca724396bf261eaf1890de228e553d"}, + {file = "Faker-19.3.0.tar.gz", hash = "sha256:7d6ed00de3eef9bd57504500c67ee034cab959e4248f9c24aca33e08af82ca93"}, +] + +[package.dependencies] +python-dateutil = ">=2.4" + +[[package]] +name = "freezegun" +version = "1.2.2" +description = "Let your Python tests travel through time" +optional = false +python-versions = ">=3.6" +files = [ + {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, + {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, +] + +[package.dependencies] +python-dateutil = ">=2.7" + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "mock" +version = "5.1.0" +description = "Rolling backport of unittest.mock for all Pythons" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mock-5.1.0-py3-none-any.whl", hash = "sha256:18c694e5ae8a208cdb3d2c20a993ca1a7b0efa258c247a1e565150f477f83744"}, + {file = "mock-5.1.0.tar.gz", hash = "sha256:5e96aad5ccda4718e0a229ed94b2024df75cc2d55575ba5762d31f5767b8767d"}, +] + +[package.extras] +build = ["blurb", "twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pyasn1" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pytest-django" +version = "4.5.2" +description = "A Django plugin for pytest." +optional = false +python-versions = ">=3.5" +files = [ + {file = "pytest-django-4.5.2.tar.gz", hash = "sha256:d9076f759bb7c36939dbdd5ae6633c18edfc2902d1a69fdbefd2426b970ce6c2"}, + {file = "pytest_django-4.5.2-py3-none-any.whl", hash = "sha256:c60834861933773109334fe5a53e83d1ef4828f2203a1d6a0fa9972f4f75ab3e"}, +] + +[package.dependencies] +pytest = ">=5.4.0" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +testing = ["Django", "django-configurations (>=2.0)"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-jose" +version = "3.3.0" +description = "JOSE implementation in Python" +optional = false +python-versions = "*" +files = [ + {file = "python-jose-3.3.0.tar.gz", hash = "sha256:55779b5e6ad599c6336191246e95eb2293a9ddebd555f796a65f838f07e5d78a"}, + {file = "python_jose-3.3.0-py2.py3-none-any.whl", hash = "sha256:9b1376b023f8b298536eedd47ae1089bcdb848f1535ab30555cd92002d78923a"}, +] + +[package.dependencies] +ecdsa = "!=0.15" +pyasn1 = "*" +rsa = "*" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pyasn1", "pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pyasn1", "pycryptodome (>=3.3.1,<4.0.0)"] + +[[package]] +name = "python-keycloak-client" +version = "0.2.3" +description = "Install Python Keycloak client." +optional = false +python-versions = "*" +files = [ + {file = "python-keycloak-client-0.2.3.tar.gz", hash = "sha256:a38be22ca376991ec2be12a3414638303386ccf55c2c72d7bb8e299a83e4863f"}, + {file = "python_keycloak_client-0.2.3-py3-none-any.whl", hash = "sha256:a4aa8c93c0099a0b55394cb035996cc9cc0261c9c4141e9346534ff11122d55d"}, +] + +[package.dependencies] +python-jose = "*" +requests = "*" + +[package.extras] +aio = ["aiohttp (>=3.4.4,<4)"] +dev = ["bumpversion (==0.5.3)", "twine"] +doc = ["Sphinx (==1.4.4)", "sphinx-autobuild (==0.6.0)"] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sqlparse" +version = "0.4.4" +description = "A non-validating SQL parser." +optional = false +python-versions = ">=3.5" +files = [ + {file = "sqlparse-0.4.4-py3-none-any.whl", hash = "sha256:5430a4fe2ac7d0f93e66f1efc6e1338a41884b7ddf2a350cedd20ccc4d9d28f3"}, + {file = "sqlparse-0.4.4.tar.gz", hash = "sha256:d446183e84b8349fa3061f0fe7f06ca94ba65b426946ffebe6e3e8295332420c"}, +] + +[package.extras] +dev = ["build", "flake8"] +doc = ["sphinx"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "urllib3" +version = "2.0.4" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[metadata] +lock-version = "2.0" +python-versions = "^3.11" +content-hash = "e96404f136948191b23a8c5b4e9f034f621242e2fa14d43bb09f7ca50eff066b" diff --git a/pyproject.toml b/pyproject.toml index 39ac9e5..42b5eac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,22 +1,49 @@ -[build-system] -requires = ["setuptools>=61.0","python-keycloak-client-pkg==0.3.0", "Django>=4.1"] -build-backend = "setuptools.build_meta" - -[project] -name = "django-keycloak-pkg" -version = "0.2.5" +[tool.poetry] +name = "django42-keycloak" +version = "0.2.9" +description = "Integrate Keycloak with Django 4.2+" +homepage = 'https://github.com/skamansam/django-keycloak' +repository = 'https://github.com/skamansam/django-keycloak' +keywords = ["django", "keycloak", "auth", "django42", "python311"] +license = "MIT" authors = [ - { name="Ahmad Dabo", email="dabo.cs@gmail.com" }, + "Samuel C. Tyler ", + "Ahmad Dabo ", + "Peter Slump ", ] -description = "Install Django Keycloak" -readme = "README.md" -requires-python = ">=3.7" +readme = "README.rst" +packages = [{include = "django_keycloak"}] classifiers = [ + "Framework :: Django", + "Framework :: Django :: 4.2", "Programming Language :: Python :: 3", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", ] +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/skamansam/django-keycloak/issues" + +[tool.poe.tasks] +test = "pytest --cov=my_app" # a simple command task +serve.script = "my_app.service:run(debug=True)" # python script based task +tunnel.shell = "ssh -N -L 0.0.0.0:8080:$PROD:8080 $PROD &" # (posix) shell based task + -[project.urls] -"Homepage" = "https://github.com/dabocs/django-keycloak" -"Bug Tracker" = "https://github.com/dabocs/django-keycloak/issues" +[tool.poetry.dependencies] +python = ">=3.11" +Django = ">=4.2" +python-keycloak-client = "^0.2.3" + +[tool.poetry.group.dev.dependencies] +django-dynamic-fixtures = "^0.2.1" + +[tool.poetry.group.test.dependencies] +pytest-django = "^4.5.2" +pytest-cov = "^4.1.0" +mock = "^5.1.0" +factory-boy = "^3.3.0" +freezegun = "^1.2.2" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 18be2c1..0000000 --- a/setup.cfg +++ /dev/null @@ -1,28 +0,0 @@ -[bumpversion] -current_version = 0.2.5 -commit = True -tag = True -parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P[a-z]+))? -serialize = - {major}.{minor}.{patch}-{release} - {major}.{minor}.{patch} - -[bumpversion:file:setup.py] - -[bumpversion:file:docs/conf.py] - -[bumpversion:file:sonar-project.properties] - -[bumpversion:file:README.rst] -search = **unreleased** -replace = **unreleased** - **v{new_version}** - -[bumpversion:part:release] -optional_value = gamma -values = - dev - gamma - -[aliases] -test = pytest diff --git a/setup.py b/setup.py index d19a371..969d936 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -VERSION = '0.2.5' +VERSION = '0.2.6' with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: README = readme.read() @@ -30,7 +30,7 @@ 'pytest-runner', 'python-keycloak-client-pkg==0.3.0', ], - + install_requires=[ 'python-keycloak-client-pkg==0.3.0', 'Django>=4.1', @@ -42,7 +42,7 @@ 'factory-boy', 'freezegun' ], - url='https://github.com/dabocs/django-keycloak', + url='https://github.com/skamansam/django-keycloak', license='MIT', author='Ahmad Dabo', author_email='dabo.cs@gmail.com', diff --git a/sonar-project.properties b/sonar-project.properties index 60f6205..cb8ffdf 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,15 +1,15 @@ -sonar.projectKey=Peter-Slump_django-keycloak -sonar.organization=peter-slump-github +sonar.projectKey=skamansam_django-keycloak +sonar.organization=skamansam sonar.projectName=Django Keycloak -sonar.projectVersion=0.1.2-dev +sonar.projectVersion=0.1.2 # ===================================================== # Meta-data for the project # ===================================================== -sonar.links.homepage=https://github.com/Peter-Slump/django-keycloak -sonar.links.ci=https://github.com/Peter-Slump/django-keycloak -sonar.links.scm=https://github.com/Peter-Slump/django-keycloak +sonar.links.homepage=https://github.com/skamansam/django-keycloak +sonar.links.ci=https://github.com/skamansam/django-keycloak +sonar.links.scm=https://github.com/skamansam/django-keycloak # ===================================================== # Properties that will be shared amongst all modules @@ -18,4 +18,5 @@ sonar.links.scm=https://github.com/Peter-Slump/django-keycloak # SQ standard properties sonar.sources=src sonar.exclusions=/src/tests/**/*.py -sonar.python.coverage.reportPath=coverage.xml \ No newline at end of file +sonar.python.coverage.reportPath=coverage.xml +sonar.python.version=3.11.4 \ No newline at end of file