diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 52696b4ea3a36ca51109ae53816acf8bfcf5191c..8f64b353f87b0e8b3283ab8ca8fa5c67b4087bbb 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -12,13 +12,19 @@ Unreleased Changed ~~~~~~~ -* Rename every occurence of "social account" by "third-party account". +* Rename every occurance of "social account" by "third-party account". +* Use own templates and views for PWA meta and manifest. Fixed ~~~~~ * Fix installation documentation (nginx, uWSGI). +Removed +~~~~~~~ + +* Drop django-pwa completely. + `2.0b0`_ - 2021-05-21 --------------------- diff --git a/aleksis/core/settings.py b/aleksis/core/settings.py index b3ab162a9ee4c0541ac695636458ecff3b3f8844..4929c4004f4a6028be800866296f1ef8d741c01a 100644 --- a/aleksis/core/settings.py +++ b/aleksis/core/settings.py @@ -5,13 +5,7 @@ from django.utils.translation import gettext_lazy as _ from dynaconf import LazySettings -from .util.core_helpers import ( - get_app_packages, - lazy_get_favicons, - lazy_preference, - merge_app_settings, - monkey_patch, -) +from .util.core_helpers import get_app_packages, merge_app_settings, monkey_patch monkey_patch() @@ -130,7 +124,6 @@ INSTALLED_APPS = [ "impersonate", "two_factor", "material", - "pwa", "ckeditor", "ckeditor_uploader", "django_js_reverse", @@ -652,29 +645,14 @@ DEFAULT_FAVICON_PATHS = { "pwa_icon": os.path.join(STATIC_ROOT, "img/aleksis-icon.png"), "favicon": os.path.join(STATIC_ROOT, "img/aleksis-icon.png"), } -PWA_APP_NAME = lazy_preference("general", "title") -PWA_APP_DESCRIPTION = lazy_preference("general", "description") -PWA_APP_THEME_COLOR = lazy_preference("theme", "primary") -PWA_APP_BACKGROUND_COLOR = "#ffffff" -PWA_APP_DISPLAY = "standalone" -PWA_APP_ORIENTATION = "any" -PWA_APP_ICONS = lazy_get_favicons( - "pwa_icon", default=DEFAULT_FAVICON_PATHS["pwa_icon"], config={"android": [192, 512]} -) -PWA_APP_ICONS_APPLE = lazy_get_favicons( - "pwa_icon", default=DEFAULT_FAVICON_PATHS["pwa_icon"], config={"apple": [76, 114, 152, 180]} -) -PWA_APP_SPLASH_SCREEN = lazy_get_favicons( - "pwa_icon", - default=DEFAULT_FAVICON_PATHS["pwa_icon"], - config={"apple": [192]}, - add_attrs={ - "media": "(device-width: 320px) and (device-height: 568px) and" - "(-webkit-device-pixel-ratio: 2)" - }, -) +PWA_ICONS_CONFIG = { + "android": [192, 512], + "apple": [76, 114, 152, 180], + "apple_splash": [192], + "microsoft": [144], +} -PWA_SERVICE_WORKER_PATH = os.path.join(STATIC_ROOT, "js", "serviceworker.js") +SERVICE_WORKER_PATH = os.path.join(STATIC_ROOT, "js", "serviceworker.js") SITE_ID = 1 diff --git a/aleksis/core/static/js/main.js b/aleksis/core/static/js/main.js index df44aaf966b1f446a5e7463a7dd207dc4109e861..0447bbda10f8120460831706e1c3569d0a7a2d62 100644 --- a/aleksis/core/static/js/main.js +++ b/aleksis/core/static/js/main.js @@ -112,6 +112,18 @@ $(document).ready(function () { var el = $(e.target).parent(); el.addClass("closed").removeClass("opened"); }); + + // Initialize the service worker + if ('serviceWorker' in navigator) { + console.debug("Start registration of service worker."); + navigator.serviceWorker.register('/serviceworker.js', { + scope: '/' + }).then(function() { + console.debug("Service worker has been registered."); + }).catch(function() { + console.debug("Service worker registration has failed.") + }); + } }); // Show notice if serviceworker broadcasts that the current page comes from its cache diff --git a/aleksis/core/templates/core/base.html b/aleksis/core/templates/core/base.html index cfa282265261e2fb7d3274ad54da41e878cc748c..95712b2ab1599fe6203cb2d97e184da735f44374 100644 --- a/aleksis/core/templates/core/base.html +++ b/aleksis/core/templates/core/base.html @@ -1,6 +1,6 @@ {# -*- engine:django -*- #} -{% load i18n menu_generator static sass_tags any_js pwa rules %} +{% load i18n menu_generator static sass_tags any_js rules %} {% get_current_language as LANGUAGE_CODE %} diff --git a/aleksis/core/templates/core/partials/meta.html b/aleksis/core/templates/core/partials/meta.html index 04f917cf102276a4e6c8d8ab06b9cad0d69033d8..8fdbea9e15dd2c9520d8d6643ab251337da68609 100644 --- a/aleksis/core/templates/core/partials/meta.html +++ b/aleksis/core/templates/core/partials/meta.html @@ -1,4 +1,4 @@ -{% load pwa favtags %} +{% load favtags %} <meta charset="utf-8"/> <meta http-equiv="X-UA-Compatible" content="IE=edge"/> @@ -6,5 +6,31 @@ <meta name="description" content="{{ request.site.preferences.general__description }}"/> <meta name="generator" content="AlekSIS School Information System"/> +<meta name="theme-color" content="red"> +<meta name="mobile-web-app-capable" content="yes"> + +<meta name="apple-mobile-web-app-title" content="{{ request.site.preferences.general__title }}"> +<meta name="apple-mobile-web-app-capable" content="yes"> +<meta name="apple-mobile-web-app-status-bar-style" content="default"> + +<meta name="msapplication-navbutton-color" content="{{ request.site.preferences.theme__primary }}"> +<meta name="msapplication-TileColor" content="{{ request.site.preferences.theme__primary }}"> +<meta name="msapplication-TileImage" content="{{ PWA_ICONS.microsoft.144.faviconImage.url }}"> +<meta name="application-name" content="{{ request.site.preferences.general__title }}"> +<meta name="msapplication-starturl" content="/"> +<meta name="msapplication-tap-highlight" content="no"> +<meta name="browsermode" content="application"> + +<link href="/manifest.json" rel="manifest"> + {% place_favicon %} -{% progressive_web_app_meta %} + +{% for icon in PWA_ICONS.apple.values %} + <link rel="apple-touch-icon" href="{{ icon.faviconImage.url }}" sizes="{{ icon.size }}x{{ icon.size }}"> +{% endfor %} + +{% with icon=PWA_ICONS.apple_splash.192 %} + <link href="{{ icon.faviconImage.url }}" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" rel="apple-touch-startup-image"/> +{% endwith %} + + diff --git a/aleksis/core/urls.py b/aleksis/core/urls.py index 05d56aa5574f3b7bf2bd2d88e63a695be200877c..63de04ac714a9a7236ae26bfb95d9d417b081a32 100644 --- a/aleksis/core/urls.py +++ b/aleksis/core/urls.py @@ -18,8 +18,10 @@ from . import views urlpatterns = [ path("", include("django_prometheus.urls")), - path("", include("pwa.urls"), name="pwa"), path(settings.MEDIA_URL.removeprefix("/"), include("titofisto.urls")), + path("manifest.json", views.ManifestView.as_view(), name="manifest"), + path("serviceworker.js", views.ServiceWorkerView.as_view(), name="service_worker"), + path("offline/", views.OfflineView.as_view(), name="offline"), path("about/", views.about, name="about_aleksis"), path("accounts/logout/", auth_views.LogoutView.as_view(), name="logout"), path( diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py index 1124ad65ca344a0ea2e849f40011c0674ad4ec41..c7b4b591e662dd0ae15384a5b8028539033359fb 100644 --- a/aleksis/core/util/core_helpers.py +++ b/aleksis/core/util/core_helpers.py @@ -158,30 +158,12 @@ def get_or_create_favicon(title: str, default: str, is_favicon: bool = False) -> return favicon -def lazy_get_favicons( - title: str, - config: dict[str, list[int]], - default: str, - add_attrs: Optional[dict[str, Any]] = None, -) -> Callable[[], list[dict[str, str]]]: - """Lazily load a dictionary for PWA settings from favicon generation rules.""" - if add_attrs is None: - add_attrs = {} - - def _get_favicons() -> list[dict[str, str]]: - favicon = get_or_create_favicon(title, default) - favicon_imgs = favicon.get_favicons(config_override=config) - - return [ - { - "src": favicon_img.faviconImage.url, - "sizes": [f"{favicon_img.size}x{favicon_img.size}"], - } - | add_attrs - for favicon_img in favicon_imgs - ] +def get_pwa_icons(): + from django.conf import settings # noqa - return lazy(_get_favicons, list)() + favicon = get_or_create_favicon("pwa_icon", settings.DEFAULT_FAVICON_PATHS["pwa_icon"]) + favicon_imgs = favicon.get_favicons(config_override=settings.PWA_ICONS_CONFIG) + return favicon_imgs def is_impersonate(request: HttpRequest) -> bool: @@ -220,6 +202,12 @@ def custom_information_processor(request: HttpRequest) -> dict: """Provide custom information in all templates.""" from ..models import CustomMenu + pwa_icons = get_pwa_icons() + regrouped_pwa_icons = {} + for pwa_icon in pwa_icons: + regrouped_pwa_icons.setdefault(pwa_icon.rel, {}) + regrouped_pwa_icons[pwa_icon.rel][pwa_icon.size] = pwa_icon + return { "FOOTER_MENU": CustomMenu.get_default("footer"), "ALTERNATIVE_LOGIN_VIEWS_LIST": [ @@ -231,6 +219,7 @@ def custom_information_processor(request: HttpRequest) -> dict: a for a in settings.ALTERNATIVE_LOGIN_VIEWS if a[0] in settings.AUTHENTICATION_BACKENDS ], "ADMINS": settings.ADMINS, + "PWA_ICONS": regrouped_pwa_icons, } diff --git a/aleksis/core/views.py b/aleksis/core/views.py index ad762e3ebb7c06a5ffc858d5bdfb9e76589098df..416417406cdc6258335ec70553d7ac2259f2dbec 100644 --- a/aleksis/core/views.py +++ b/aleksis/core/views.py @@ -13,10 +13,13 @@ from django.http import ( HttpResponse, HttpResponseNotFound, HttpResponseRedirect, + JsonResponse, ) +from django.http.response import FileResponse from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse, reverse_lazy from django.utils.decorators import method_decorator +from django.utils.translation import get_language from django.utils.translation import gettext_lazy as _ from django.views.decorators.cache import never_cache from django.views.generic.base import TemplateView, View @@ -96,6 +99,7 @@ from .util.apps import AppConfig from .util.celery_progress import render_progress_page from .util.core_helpers import ( get_allowed_object_ids, + get_pwa_icons, get_site_preferences, has_person, objectgetter_optional, @@ -115,6 +119,56 @@ class RenderPDFView(TemplateView): return render_pdf(request, self.template_name, context) +class ServiceWorkerView(View): + """Render serviceworker.js under root URL. + + This can't be done by static files, + because the PWA has a scope and + only accepts service worker files from the root URL. + """ + + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + return FileResponse(open(settings.SERVICE_WORKER_PATH)) + + +class ManifestView(View): + """Build manifest.json for PWA.""" + + def get(self, request: HttpRequest, *args, **kwargs) -> HttpResponse: + prefs = get_site_preferences() + pwa_imgs = get_pwa_icons() + + icons = [ + { + "src": favicon_img.faviconImage.url, + "sizes": f"{favicon_img.size}x{favicon_img.size}", + } + for favicon_img in pwa_imgs + ] + + manifest = { + "name": prefs["general__title"], + "short_name": prefs["general__title"], + "description": prefs["general__description"], + "start_url": "/", + "scope": "/", + "lang": get_language(), + "display": "standalone", + "orientation": "any", + "status_bar": "default", + "background_color": "#ffffff", + "theme_color": prefs["theme__primary"], + "icons": icons, + } + return JsonResponse(manifest) + + +class OfflineView(TemplateView): + """Show an error page if there is no internet connection.""" + + template_name = "offline.html" + + @permission_required("core.view_dashboard_rule") def index(request: HttpRequest) -> HttpResponse: """View for dashboard.""" diff --git a/poetry.lock b/poetry.lock index 51ecbc5bdf3730537603b03c33e22aac064adc00..d3234cf58b7f5080a361249ee9f6e85f2eae8d57 100644 --- a/poetry.lock +++ b/poetry.lock @@ -215,20 +215,20 @@ python-versions = "*" [[package]] name = "boto3" -version = "1.17.78" +version = "1.17.83" description = "The AWS SDK for Python" category = "main" optional = true python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] -botocore = ">=1.20.78,<1.21.0" +botocore = ">=1.20.83,<1.21.0" jmespath = ">=0.7.1,<1.0.0" s3transfer = ">=0.4.0,<0.5.0" [[package]] name = "botocore" -version = "1.20.78" +version = "1.20.83" description = "Low-level, data-driven core of boto 3." category = "main" optional = true @@ -266,20 +266,20 @@ django = ["Django (>=2.2,<4.0)"] [[package]] name = "celery" -version = "5.0.5" +version = "5.1.0" description = "Distributed Task Queue." category = "main" optional = false python-versions = ">=3.6," [package.dependencies] -billiard = ">=3.6.3.0,<4.0" +billiard = ">=3.6.4.0,<4.0" click = ">=7.0,<8.0" click-didyoumean = ">=0.0.3" click-plugins = ">=1.1.1" click-repl = ">=0.1.6" Django = {version = ">=1.11", optional = true, markers = "extra == \"django\""} -kombu = ">=5.0.0,<6.0" +kombu = ">=5.1.0,<6.0" pytz = ">0.0-dev" redis = {version = ">=3.2.0", optional = true, markers = "extra == \"redis\""} vine = ">=5.0.0,<6.0" @@ -287,10 +287,10 @@ vine = ">=5.0.0,<6.0" [package.extras] arangodb = ["pyArango (>=1.3.2)"] auth = ["cryptography"] -azureblockblob = ["azure-storage (==0.36.0)", "azure-common (==1.1.5)", "azure-storage-common (==1.1.0)"] +azureblockblob = ["azure-storage-blob (==12.6.0)"] brotli = ["brotli (>=1.0.0)", "brotlipy (>=0.7.0)"] cassandra = ["cassandra-driver (<3.21.0)"] -consul = ["python-consul"] +consul = ["python-consul2"] cosmosdbsql = ["pydocumentdb (==2.3.2)"] couchbase = ["couchbase (>=3.0.0)"] couchdb = ["pycouchdb"] @@ -300,7 +300,6 @@ elasticsearch = ["elasticsearch"] eventlet = ["eventlet (>=0.26.1)"] gevent = ["gevent (>=1.0.0)"] librabbitmq = ["librabbitmq (>=1.5.0)"] -lzma = ["backports.lzma"] memcache = ["pylibmc"] mongodb = ["pymongo[srv] (>=3.3.0)"] msgpack = ["msgpack"] @@ -783,7 +782,7 @@ Django = ">=2.2" [[package]] name = "django-guardian" -version = "2.3.0" +version = "2.4.0" description = "Implementation of per object permissions for Django." category = "main" optional = false @@ -993,17 +992,6 @@ python-versions = "*" [package.dependencies] prometheus-client = ">=0.7" -[[package]] -name = "django-pwa" -version = "1.0.10" -description = "A Django app to include a manifest.json and Service Worker instance to enable progressive web app behavior" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -django = ">=1.8" - [[package]] name = "django-redis" version = "4.12.1" @@ -1274,7 +1262,7 @@ yaml = ["ruamel.yaml"] [[package]] name = "faker" -version = "8.2.1" +version = "8.4.0" description = "Faker is a Python package that generates fake data for you." category = "main" optional = false @@ -1602,17 +1590,18 @@ cryptography = ">=2.3" [[package]] name = "kombu" -version = "5.0.2" +version = "5.1.0" description = "Messaging library for Python." category = "main" optional = false python-versions = ">=3.6" [package.dependencies] -amqp = ">=5.0.0,<6.0.0" +amqp = ">=5.0.6,<6.0.0" +vine = "*" [package.extras] -azureservicebus = ["azure-servicebus (>=0.21.1)"] +azureservicebus = ["azure-servicebus (>=7.0.0)"] azurestoragequeues = ["azure-storage-queue"] consul = ["python-consul (>=0.6.0)"] librabbitmq = ["librabbitmq (>=1.5.2)"] @@ -1623,7 +1612,7 @@ qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] redis = ["redis (>=3.3.11)"] slmq = ["softlayer-messaging (>=1.0.3)"] sqlalchemy = ["sqlalchemy"] -sqs = ["boto3 (>=1.4.4)", "pycurl (==7.43.0.2)"] +sqs = ["boto3 (>=1.4.4)", "pycurl (==7.43.0.2)", "urllib3 (<1.26)"] yaml = ["PyYAML (>=3.10)"] zookeeper = ["kazoo (>=1.3.1)"] @@ -1792,7 +1781,7 @@ scramp = "1.4.0" [[package]] name = "phonenumbers" -version = "8.12.23" +version = "8.12.24" description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers." category = "main" optional = false @@ -2415,11 +2404,11 @@ python-versions = "*" [[package]] name = "sphinxcontrib-htmlhelp" -version = "1.0.3" +version = "2.0.0" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.extras] lint = ["flake8", "mypy", "docutils-stubs"] @@ -2450,7 +2439,7 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-serializinghtml" -version = "1.1.4" +version = "1.1.5" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." category = "dev" optional = false @@ -2544,7 +2533,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tqdm" -version = "4.60.0" +version = "4.61.0" description = "Fast, Extensible Progress Meter" category = "main" optional = false @@ -2601,16 +2590,16 @@ python-versions = "*" [[package]] name = "urllib3" -version = "1.26.4" +version = "1.26.5" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] +brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] -brotli = ["brotlipy (>=0.6.0)"] [[package]] name = "uwsgi" @@ -2670,7 +2659,7 @@ s3 = ["boto3", "django-storages"] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "9009e40aa54a752649e5539cba2b0b12dc0580c7e93999d177b19f041bdaf85b" +content-hash = "90224f9149be3a385e33e37cec650a35637055343fe58e28f4e7e5041de1a0ab" [metadata.files] alabaster = [ @@ -2679,6 +2668,7 @@ alabaster = [ ] aleksis-builddeps = [ {file = "AlekSIS-Builddeps-4.tar.gz", hash = "sha256:aaaa22965228b9b9b7de812e3e7fa9cbfdbf8635bb22d6f3a201dc0cc6d8d307"}, + {file = "AlekSIS_Builddeps-4-py3-none-any.whl", hash = "sha256:02a93e503f5810e6c93a8bc829bc8cbda735ccbf78b91954d2f6507dfea3d01f"}, ] amqp = [ {file = "amqp-5.0.6-py3-none-any.whl", hash = "sha256:493a2ac6788ce270a2f6a765b017299f60c1998f5a8617908ee9be082f7300fb"}, @@ -2742,12 +2732,12 @@ bleach = [ {file = "boolean.py-3.8.tar.gz", hash = "sha256:cc24e20f985d60cd4a3a5a1c0956dd12611159d32a75081dabd0c9ab981acaa4"}, ] boto3 = [ - {file = "boto3-1.17.78-py2.py3-none-any.whl", hash = "sha256:1a87855123df1f18081a5fb8c1abde28d0096a03f6f3ebb06bcfb77cdffdae5e"}, - {file = "boto3-1.17.78.tar.gz", hash = "sha256:2a5caee63d45fbdcc85e710c7f4146112f5d10b22fd0176643d2f2914cce54df"}, + {file = "boto3-1.17.83-py2.py3-none-any.whl", hash = "sha256:40ccb6ec2d7e5e4d250d630a245aae7aa1fcd43c3519e9808b444f083ca4014a"}, + {file = "boto3-1.17.83.tar.gz", hash = "sha256:e6fa13cd8f16a6c222104ab17e0439e24b6974f60e7af113a38a80f252457cb0"}, ] botocore = [ - {file = "botocore-1.20.78-py2.py3-none-any.whl", hash = "sha256:37105b9434d73f9c4d4960ee54c8eb129120f4c6681eb16edf483f03c5e2326d"}, - {file = "botocore-1.20.78.tar.gz", hash = "sha256:e74775f9e64e975787d76390fc5ac5aba875d726bb9ece3b7bd900205b430389"}, + {file = "botocore-1.20.83-py2.py3-none-any.whl", hash = "sha256:b36c14cfe208969ee9f658b645cfc718c1700c593313787a3fd59b335f7a6e2c"}, + {file = "botocore-1.20.83.tar.gz", hash = "sha256:55d450b6bf0df642809fe88a6840d90dab6b6ad5ff3dccaa1faf9e085dfd864a"}, ] bs4 = [ {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, @@ -2757,8 +2747,8 @@ calendarweek = [ {file = "calendarweek-0.5.0.tar.gz", hash = "sha256:32f5c8663799a2f5a0b8909976c7a3ae77397acd7e7c31d1456ece5b452988a5"}, ] celery = [ - {file = "celery-5.0.5-py3-none-any.whl", hash = "sha256:5e8d364e058554e83bbb116e8377d90c79be254785f357cb2cec026e79febe13"}, - {file = "celery-5.0.5.tar.gz", hash = "sha256:f4efebe6f8629b0da2b8e529424de376494f5b7a743c321c8a2ddc2b1414921c"}, + {file = "celery-5.1.0-py3-none-any.whl", hash = "sha256:1329de1edeaf734ef859e630cb42df2c116d53e59d2f46433b13aed196e85620"}, + {file = "celery-5.1.0.tar.gz", hash = "sha256:65f061c04578cf189cd7352c192e1a79fdeb370b916bff792bcc769560e81184"}, ] celery-haystack-ng = [ {file = "celery-haystack-ng-0.20.post2.tar.gz", hash = "sha256:d2e077851f13dddc36fc86134c7c8a937e46ae75e576eb8e77e03b03977fc7bb"}, @@ -2788,24 +2778,36 @@ cffi = [ {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, + {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, + {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, + {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, + {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, @@ -3011,8 +3013,8 @@ django-formtools = [ {file = "django_formtools-2.3-py3-none-any.whl", hash = "sha256:4699937e19ee041d803943714fe0c1c7ad4cab802600eb64bbf4cdd0a1bfe7d9"}, ] django-guardian = [ - {file = "django-guardian-2.3.0.tar.gz", hash = "sha256:ed2de26e4defb800919c5749fb1bbe370d72829fbd72895b6cf4f7f1a7607e1b"}, - {file = "django_guardian-2.3.0-py3-none-any.whl", hash = "sha256:0e70706c6cda88ddaf8849bddb525b8df49de05ba0798d4b3506049f0d95cbc8"}, + {file = "django-guardian-2.4.0.tar.gz", hash = "sha256:c58a68ae76922d33e6bdc0e69af1892097838de56e93e78a8361090bcd9f89a0"}, + {file = "django_guardian-2.4.0-py3-none-any.whl", hash = "sha256:440ca61358427e575323648b25f8384739e54c38b3d655c81d75e0cd0d61b697"}, ] django-hattori = [ {file = "django-hattori-0.2.1.tar.gz", hash = "sha256:6953d40881317252f19f62c4e7fe8058924b852c7498bc42beb7bc4d268c252c"}, @@ -3082,10 +3084,6 @@ django-prometheus = [ {file = "django-prometheus-2.1.0.tar.gz", hash = "sha256:dd3f8da1399140fbef5c00d1526a23d1ade286b144281c325f8e409a781643f2"}, {file = "django_prometheus-2.1.0-py2.py3-none-any.whl", hash = "sha256:c338d6efde1ca336e90c540b5e87afe9287d7bcc82d651a778f302b0be17a933"}, ] -django-pwa = [ - {file = "django-pwa-1.0.10.tar.gz", hash = "sha256:07ed9dd57108838e3fe44b551a82032ca4ed76e31cb3c3e8d51604e0fe7e81e9"}, - {file = "django_pwa-1.0.10-py3-none-any.whl", hash = "sha256:b1a2057b1e72c40c3a14beb90b958482da185f1d40a141fcae3d76580984b930"}, -] django-redis = [ {file = "django-redis-4.12.1.tar.gz", hash = "sha256:306589c7021e6468b2656edc89f62b8ba67e8d5a1c8877e2688042263daa7a63"}, {file = "django_redis-4.12.1-py3-none-any.whl", hash = "sha256:1133b26b75baa3664164c3f44b9d5d133d1b8de45d94d79f38d1adc5b1d502e5"}, @@ -3165,8 +3163,8 @@ dynaconf = [ {file = "dynaconf-3.1.4.tar.gz", hash = "sha256:b2f472d83052f809c5925565b8a2ba76a103d5dc1dbb9748b693ed67212781b9"}, ] faker = [ - {file = "Faker-8.2.1-py3-none-any.whl", hash = "sha256:765cb52df0ca2dc5af0393048c1f60b2fec736095b379954c42c5c552f65838a"}, - {file = "Faker-8.2.1.tar.gz", hash = "sha256:7397915ce793ac1e162eb89450a268c4404121389ca46264648a2a8c56d88624"}, + {file = "Faker-8.4.0-py3-none-any.whl", hash = "sha256:5b1c0781c0c2f6b177adf4018feec265bbcd0118b301dbec64a1908c29124ed6"}, + {file = "Faker-8.4.0.tar.gz", hash = "sha256:c94240c40073400b269c50b14da765fd4d3b4dda8ae25c2753afc809c72f1062"}, ] flake8 = [ {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, @@ -3177,6 +3175,7 @@ flake8-bandit = [ ] flake8-black = [ {file = "flake8-black-0.2.1.tar.gz", hash = "sha256:f26651bc10db786c03f4093414f7c9ea982ed8a244cec323c984feeffdf4c118"}, + {file = "flake8_black-0.2.1-py3-none-any.whl", hash = "sha256:941514149cb8b489cb17a4bb1cf18d84375db3b34381bb018de83509437931a0"}, ] flake8-builtins = [ {file = "flake8-builtins-1.5.3.tar.gz", hash = "sha256:09998853b2405e98e61d2ff3027c47033adbdc17f9fe44ca58443d876eb00f3b"}, @@ -3271,8 +3270,8 @@ jwcrypto = [ {file = "jwcrypto-0.8.tar.gz", hash = "sha256:b7fee2635bbefdf145399392f5be26ad54161c8271c66b5fe107b4b452f06c24"}, ] kombu = [ - {file = "kombu-5.0.2-py2.py3-none-any.whl", hash = "sha256:6dc509178ac4269b0e66ab4881f70a2035c33d3a622e20585f965986a5182006"}, - {file = "kombu-5.0.2.tar.gz", hash = "sha256:f4965fba0a4718d47d470beeb5d6446e3357a62402b16c510b6a2f251e05ac3c"}, + {file = "kombu-5.1.0-py3-none-any.whl", hash = "sha256:e2dedd8a86c9077c350555153825a31e456a0dc20c15d5751f00137ec9c75f0a"}, + {file = "kombu-5.1.0.tar.gz", hash = "sha256:01481d99f4606f6939cdc9b637264ed353ee9e3e4f62cfb582324142c41a572d"}, ] libsass = [ {file = "libsass-0.21.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb"}, @@ -3397,8 +3396,8 @@ pg8000 = [ {file = "pg8000-1.19.5.tar.gz", hash = "sha256:dcb9afb9cb87acc79388ae633c45cf7f806aabe3bb5d8cf154572b699393f937"}, ] phonenumbers = [ - {file = "phonenumbers-8.12.23-py2.py3-none-any.whl", hash = "sha256:4b9d2f2165309613f32fe5057ff0604eb8e4bbb7be44f7ba77baef760d7d60e2"}, - {file = "phonenumbers-8.12.23.tar.gz", hash = "sha256:8b0cf3df6ab75d22717af91014ca690423a85e77abc7b199748d1b3598b49a37"}, + {file = "phonenumbers-8.12.24-py2.py3-none-any.whl", hash = "sha256:10204e005b1b887c7c96ce17c8b8ba4694693f3158199887874f9f857398b32d"}, + {file = "phonenumbers-8.12.24.tar.gz", hash = "sha256:c6c8c7fa69c553edbc88a95bfa5a0e9630ad19ac55f40c014a86cd061ad661ae"}, ] pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, @@ -3640,18 +3639,26 @@ pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, @@ -3819,8 +3826,8 @@ sphinxcontrib-django = [ {file = "sphinxcontrib_django-0.5.1-py2.py3-none-any.whl", hash = "sha256:73ef7fdbf2ed6d4f35b7ae709032bd5ac493d93cedd0624ea7b51bf5fce41267"}, ] sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, - {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, ] sphinxcontrib-jsmath = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, @@ -3831,8 +3838,8 @@ sphinxcontrib-qthelp = [ {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, - {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sqlparse = [ {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, @@ -3866,8 +3873,8 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.60.0-py2.py3-none-any.whl", hash = "sha256:daec693491c52e9498632dfbe9ccfc4882a557f5fa08982db1b4d3adbe0887c3"}, - {file = "tqdm-4.60.0.tar.gz", hash = "sha256:ebdebdb95e3477ceea267decfc0784859aa3df3e27e22d23b83e9b272bf157ae"}, + {file = "tqdm-4.61.0-py2.py3-none-any.whl", hash = "sha256:736524215c690621b06fc89d0310a49822d75e599fcd0feb7cc742b98d692493"}, + {file = "tqdm-4.61.0.tar.gz", hash = "sha256:cd5791b5d7c3f2f1819efc81d36eb719a38e0906a7380365c556779f585ea042"}, ] traitlets = [ {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, @@ -3914,8 +3921,8 @@ typing-extensions = [ {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] urllib3 = [ - {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, - {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, + {file = "urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c"}, + {file = "urllib3-1.26.5.tar.gz", hash = "sha256:a7acd0977125325f516bda9735fa7142b909a8d01e8b2e4c8108d0984e6e0098"}, ] uwsgi = [ {file = "uWSGI-2.0.19.1.tar.gz", hash = "sha256:faa85e053c0b1be4d5585b0858d3a511d2cd10201802e8676060fd0a109e5869"}, diff --git a/pyproject.toml b/pyproject.toml index 414a638a268a6f5767e92ed39140ac3b72cbc8bd..756ee93b365b2ddb00d05da1e8cf4f13fd481f24 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -67,7 +67,6 @@ django_select2 = "^7.1" django-two-factor-auth = { version = "^1.12.1", extras = [ "yubikey", "phonenumbers", "call", "sms" ] } django-yarnpkg = "^6.0" django-material = "^1.6.0" -django-pwa = "^1.0.8" django-dynamic-preferences = "^1.9" django_widget_tweaks = "^1.4.5" django-filter = "^2.2.0"