From 2f572468ca87960b70395030cc7da395b49a7f6c Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 28 Feb 2021 18:03:42 +0000 Subject: [PATCH 01/23] Add django-cors-headers --- django/poetry.lock | 436 +++++++++++++++------------ django/pyproject.toml | 1 + django/thunderstore/core/settings.py | 2 + 3 files changed, 238 insertions(+), 201 deletions(-) diff --git a/django/poetry.lock b/django/poetry.lock index 6898bcc38..453ea73ad 100644 --- a/django/poetry.lock +++ b/django/poetry.lock @@ -101,20 +101,20 @@ d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] [[package]] name = "boto3" -version = "1.17.5" +version = "1.17.26" description = "The AWS SDK for Python" category = "main" optional = false python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] -botocore = ">=1.20.5,<1.21.0" +botocore = ">=1.20.26,<1.21.0" jmespath = ">=0.7.1,<1.0.0" s3transfer = ">=0.3.0,<0.4.0" [[package]] name = "botocore" -version = "1.20.5" +version = "1.20.26" description = "Low-level, data-driven core of boto 3." category = "main" optional = false @@ -195,7 +195,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.4" +version = "1.14.5" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -301,7 +301,7 @@ jinja2 = "*" [[package]] name = "coverage" -version = "5.4" +version = "5.5" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -312,7 +312,7 @@ toml = ["toml"] [[package]] name = "cryptography" -version = "3.4.4" +version = "3.4.6" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -331,7 +331,7 @@ test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pret [[package]] name = "defusedxml" -version = "0.7.0rc2" +version = "0.7.1" description = "XML bomb protection for Python stdlib modules" category = "main" optional = false @@ -347,7 +347,7 @@ python-versions = "*" [[package]] name = "django" -version = "3.1.6" +version = "3.1.7" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." category = "main" optional = false @@ -398,6 +398,17 @@ python-versions = "*" [package.dependencies] celery = ">=4.4,<6.0" +[[package]] +name = "django-cors-headers" +version = "3.7.0" +description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +Django = ">=2.2" + [[package]] name = "django-debug-toolbar" version = "3.2" @@ -563,7 +574,7 @@ doc = ["sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] [[package]] name = "faker" -version = "6.1.1" +version = "6.6.0" description = "Faker is a Python package that generates fake data for you." category = "dev" optional = false @@ -618,7 +629,7 @@ flake8 = ">=3.5,<4.0" [[package]] name = "flake8-bugbear" -version = "20.11.1" +version = "21.3.2" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." category = "dev" optional = false @@ -739,7 +750,7 @@ test = ["dnspython (>=1.16.0,<2.0)", "idna", "requests", "objgraph", "cffi (>=1. [[package]] name = "google-api-core" -version = "1.26.0" +version = "1.26.1" description = "Google API client core library" category = "main" optional = false @@ -761,7 +772,7 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] [[package]] name = "google-auth" -version = "1.26.0" +version = "1.27.1" description = "Google Authentication Library" category = "main" optional = false @@ -775,6 +786,7 @@ six = ">=1.9.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +pyopenssl = ["pyopenssl (>=20.0.0)"] [[package]] name = "google-cloud-core" @@ -794,7 +806,7 @@ grpc = ["grpcio (>=1.8.2,<2.0dev)"] [[package]] name = "google-cloud-storage" -version = "1.36.0" +version = "1.36.2" description = "Google Cloud Storage API client library" category = "main" optional = false @@ -838,14 +850,14 @@ requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.52.0" +version = "1.53.0" description = "Common protobufs used in Google APIs" category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.6" [package.dependencies] -protobuf = ">=3.6.0" +protobuf = ">=3.12.0" [package.extras] grpc = ["grpcio (>=1.0.0)"] @@ -880,11 +892,11 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "identify" -version = "1.5.13" +version = "2.1.2" description = "File identification library for Python" category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +python-versions = ">=3.6.1" [package.extras] license = ["editdistance"] @@ -985,7 +997,7 @@ zookeeper = ["kazoo (>=1.3.1)"] [[package]] name = "markdown" -version = "3.3.3" +version = "3.3.4" description = "Python implementation of Markdown." category = "main" optional = false @@ -1012,7 +1024,7 @@ python-versions = "*" [[package]] name = "mypy" -version = "0.800" +version = "0.812" description = "Optional static typing for Python" category = "dev" optional = false @@ -1106,7 +1118,7 @@ dev = ["pre-commit", "tox"] [[package]] name = "pre-commit" -version = "2.10.1" +version = "2.11.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "dev" optional = false @@ -1122,7 +1134,7 @@ virtualenv = ">=20.0.8" [[package]] name = "prompt-toolkit" -version = "3.0.16" +version = "3.0.17" description = "Library for building powerful interactive command lines in Python" category = "main" optional = false @@ -1133,7 +1145,7 @@ wcwidth = "*" [[package]] name = "protobuf" -version = "3.14.0" +version = "3.15.6" description = "Protocol Buffers" category = "main" optional = false @@ -1424,7 +1436,7 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] [[package]] name = "rsa" -version = "4.7" +version = "4.7.2" description = "Pure-Python RSA implementation" category = "main" optional = false @@ -1435,14 +1447,14 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel.yaml" -version = "0.16.12" +version = "0.16.13" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "main" optional = false python-versions = "*" [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.9\""} +"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} [package.extras] docs = ["ryd"] @@ -1517,26 +1529,26 @@ social-auth-core = ">=3.3.0" [[package]] name = "social-auth-core" -version = "4.0.3" +version = "4.1.0" description = "Python social authentication made simple." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] cryptography = ">=1.4" -defusedxml = {version = ">=0.5.0rc1", markers = "python_version >= \"3.0\""} +defusedxml = ">=0.5.0rc1" oauthlib = ">=1.0.3" PyJWT = ">=2.0.0" -python3-openid = {version = ">=3.0.10", markers = "python_version >= \"3.0\""} +python3-openid = ">=3.0.10" requests = ">=2.9.1" requests-oauthlib = ">=0.6.1" [package.extras] -all = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)", "python3-saml (>=1.2.1)", "cryptography (>=2.1.1)"] -allpy3 = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)", "python3-saml (>=1.2.1)", "cryptography (>=2.1.1)", "defusedxml (>=0.5.0rc1)", "python3-openid (>=3.0.10)"] +all = ["python-jose (>=3.0.0)", "python3-saml (>=1.2.1)", "cryptography (>=2.1.1)"] +allpy3 = ["python-jose (>=3.0.0)", "python3-saml (>=1.2.1)", "cryptography (>=2.1.1)"] azuread = ["cryptography (>=2.1.1)"] -openidconnect = ["python-jose (>=3.0.0)", "pyjwt (>=1.7.1)"] +openidconnect = ["python-jose (>=3.0.0)"] saml = ["python3-saml (>=1.2.1)"] [[package]] @@ -1696,7 +1708,7 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "6a958581de27418d1c268a305f3b6357e0e9d88dbdbd0aed0989cef0a22fbf1b" +content-hash = "5291f076f70a73d49207bb9bc8ab30b3adcb0d4b92cf15eebdb5f97341eb567f" [metadata.files] amqp = [ @@ -1735,12 +1747,12 @@ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] boto3 = [ - {file = "boto3-1.17.5-py2.py3-none-any.whl", hash = "sha256:0d126d429a8a9ea2c8409a1ee36ce5a34e11db788d7730a714016264f10bbb89"}, - {file = "boto3-1.17.5.tar.gz", hash = "sha256:d6aafb804fca2b67c65dda78ad8b4afed901e004071208b84c804d345ad9ebba"}, + {file = "boto3-1.17.26-py2.py3-none-any.whl", hash = "sha256:8e9ff8006c41889ed8a11831dee62adf922e071f14d54c52946d1f7855ae7a8e"}, + {file = "boto3-1.17.26.tar.gz", hash = "sha256:64a8900b3a110e2d6ff4d87f4d8cd56f0c8527361d9fc9385fcb50efe7a4975a"}, ] botocore = [ - {file = "botocore-1.20.5-py2.py3-none-any.whl", hash = "sha256:3c55f0db5e08920727f4fa24a87aed60060643f4b0b5665c62ec762f79e82d6b"}, - {file = "botocore-1.20.5.tar.gz", hash = "sha256:04a1df759681f5f171accb354d863bfed0774d64a4e8ee35ff49835755660a4e"}, + {file = "botocore-1.20.26-py2.py3-none-any.whl", hash = "sha256:d27cbe115a25bfa82b851861b62d71fc771c2883bf5645bf37a7c0114789407c"}, + {file = "botocore-1.20.26.tar.gz", hash = "sha256:4a785847a351e59f2329627fc9a19cf50f07644ea68996a1595d5a20487a423f"}, ] cachetools = [ {file = "cachetools-4.2.1-py3-none-any.whl", hash = "sha256:1d9d5f567be80f7c07d765e21b814326d78c61eb0c3a637dffc0e5d1796cb2e2"}, @@ -1755,43 +1767,43 @@ certifi = [ {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, ] cffi = [ - {file = "cffi-1.14.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06"}, - {file = "cffi-1.14.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26"}, - {file = "cffi-1.14.4-cp27-cp27m-win32.whl", hash = "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c"}, - {file = "cffi-1.14.4-cp27-cp27m-win_amd64.whl", hash = "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d"}, - {file = "cffi-1.14.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca"}, - {file = "cffi-1.14.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b"}, - {file = "cffi-1.14.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293"}, - {file = "cffi-1.14.4-cp35-cp35m-win32.whl", hash = "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2"}, - {file = "cffi-1.14.4-cp35-cp35m-win_amd64.whl", hash = "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7"}, - {file = "cffi-1.14.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec"}, - {file = "cffi-1.14.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b"}, - {file = "cffi-1.14.4-cp36-cp36m-win32.whl", hash = "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668"}, - {file = "cffi-1.14.4-cp36-cp36m-win_amd64.whl", hash = "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009"}, - {file = "cffi-1.14.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03"}, - {file = "cffi-1.14.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01"}, - {file = "cffi-1.14.4-cp37-cp37m-win32.whl", hash = "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e"}, - {file = "cffi-1.14.4-cp37-cp37m-win_amd64.whl", hash = "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35"}, - {file = "cffi-1.14.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53"}, - {file = "cffi-1.14.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e"}, - {file = "cffi-1.14.4-cp38-cp38-win32.whl", hash = "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d"}, - {file = "cffi-1.14.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375"}, - {file = "cffi-1.14.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a"}, - {file = "cffi-1.14.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:7ef7d4ced6b325e92eb4d3502946c78c5367bc416398d387b39591532536734e"}, - {file = "cffi-1.14.4-cp39-cp39-win32.whl", hash = "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3"}, - {file = "cffi-1.14.4-cp39-cp39-win_amd64.whl", hash = "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b"}, - {file = "cffi-1.14.4.tar.gz", hash = "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c"}, + {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, + {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, + {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, + {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, + {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, + {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, + {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, + {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, + {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, + {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, + {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-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-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-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-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"}, ] cfgv = [ {file = "cfgv-3.2.0-py2.py3-none-any.whl", hash = "sha256:32e43d604bbe7896fe7c248a9c2276447dbef840feb28fe20494f62af110211d"}, @@ -1829,76 +1841,84 @@ coreschema = [ {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"}, ] coverage = [ - {file = "coverage-5.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6d9c88b787638a451f41f97446a1c9fd416e669b4d9717ae4615bd29de1ac135"}, - {file = "coverage-5.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:66a5aae8233d766a877c5ef293ec5ab9520929c2578fd2069308a98b7374ea8c"}, - {file = "coverage-5.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9754a5c265f991317de2bac0c70a746efc2b695cf4d49f5d2cddeac36544fb44"}, - {file = "coverage-5.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:fbb17c0d0822684b7d6c09915677a32319f16ff1115df5ec05bdcaaee40b35f3"}, - {file = "coverage-5.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b7f7421841f8db443855d2854e25914a79a1ff48ae92f70d0a5c2f8907ab98c9"}, - {file = "coverage-5.4-cp27-cp27m-win32.whl", hash = "sha256:4a780807e80479f281d47ee4af2eb2df3e4ccf4723484f77da0bb49d027e40a1"}, - {file = "coverage-5.4-cp27-cp27m-win_amd64.whl", hash = "sha256:87c4b38288f71acd2106f5d94f575bc2136ea2887fdb5dfe18003c881fa6b370"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6809ebcbf6c1049002b9ac09c127ae43929042ec1f1dbd8bb1615f7cd9f70a0"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ba7ca81b6d60a9f7a0b4b4e175dcc38e8fef4992673d9d6e6879fd6de00dd9b8"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:89fc12c6371bf963809abc46cced4a01ca4f99cba17be5e7d416ed7ef1245d19"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a8eb7785bd23565b542b01fb39115a975fefb4a82f23d407503eee2c0106247"}, - {file = "coverage-5.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:7e40d3f8eb472c1509b12ac2a7e24158ec352fc8567b77ab02c0db053927e339"}, - {file = "coverage-5.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1ccae21a076d3d5f471700f6d30eb486da1626c380b23c70ae32ab823e453337"}, - {file = "coverage-5.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:755c56beeacac6a24c8e1074f89f34f4373abce8b662470d3aa719ae304931f3"}, - {file = "coverage-5.4-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:322549b880b2d746a7672bf6ff9ed3f895e9c9f108b714e7360292aa5c5d7cf4"}, - {file = "coverage-5.4-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:60a3307a84ec60578accd35d7f0c71a3a971430ed7eca6567399d2b50ef37b8c"}, - {file = "coverage-5.4-cp35-cp35m-win32.whl", hash = "sha256:1375bb8b88cb050a2d4e0da901001347a44302aeadb8ceb4b6e5aa373b8ea68f"}, - {file = "coverage-5.4-cp35-cp35m-win_amd64.whl", hash = "sha256:16baa799ec09cc0dcb43a10680573269d407c159325972dd7114ee7649e56c66"}, - {file = "coverage-5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2f2cf7a42d4b7654c9a67b9d091ec24374f7c58794858bff632a2039cb15984d"}, - {file = "coverage-5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b62046592b44263fa7570f1117d372ae3f310222af1fc1407416f037fb3af21b"}, - {file = "coverage-5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:812eaf4939ef2284d29653bcfee9665f11f013724f07258928f849a2306ea9f9"}, - {file = "coverage-5.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:859f0add98707b182b4867359e12bde806b82483fb12a9ae868a77880fc3b7af"}, - {file = "coverage-5.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:04b14e45d6a8e159c9767ae57ecb34563ad93440fc1b26516a89ceb5b33c1ad5"}, - {file = "coverage-5.4-cp36-cp36m-win32.whl", hash = "sha256:ebfa374067af240d079ef97b8064478f3bf71038b78b017eb6ec93ede1b6bcec"}, - {file = "coverage-5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:84df004223fd0550d0ea7a37882e5c889f3c6d45535c639ce9802293b39cd5c9"}, - {file = "coverage-5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1b811662ecf72eb2d08872731636aee6559cae21862c36f74703be727b45df90"}, - {file = "coverage-5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6b588b5cf51dc0fd1c9e19f622457cc74b7d26fe295432e434525f1c0fae02bc"}, - {file = "coverage-5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3fe50f1cac369b02d34ad904dfe0771acc483f82a1b54c5e93632916ba847b37"}, - {file = "coverage-5.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:32ab83016c24c5cf3db2943286b85b0a172dae08c58d0f53875235219b676409"}, - {file = "coverage-5.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:68fb816a5dd901c6aff352ce49e2a0ffadacdf9b6fae282a69e7a16a02dad5fb"}, - {file = "coverage-5.4-cp37-cp37m-win32.whl", hash = "sha256:a636160680c6e526b84f85d304e2f0bb4e94f8284dd765a1911de9a40450b10a"}, - {file = "coverage-5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:bb32ca14b4d04e172c541c69eec5f385f9a075b38fb22d765d8b0ce3af3a0c22"}, - {file = "coverage-5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4d7165a4e8f41eca6b990c12ee7f44fef3932fac48ca32cecb3a1b2223c21f"}, - {file = "coverage-5.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a565f48c4aae72d1d3d3f8e8fb7218f5609c964e9c6f68604608e5958b9c60c3"}, - {file = "coverage-5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fff1f3a586246110f34dc762098b5afd2de88de507559e63553d7da643053786"}, - {file = "coverage-5.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a839e25f07e428a87d17d857d9935dd743130e77ff46524abb992b962eb2076c"}, - {file = "coverage-5.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:6625e52b6f346a283c3d563d1fd8bae8956daafc64bb5bbd2b8f8a07608e3994"}, - {file = "coverage-5.4-cp38-cp38-win32.whl", hash = "sha256:5bee3970617b3d74759b2d2df2f6a327d372f9732f9ccbf03fa591b5f7581e39"}, - {file = "coverage-5.4-cp38-cp38-win_amd64.whl", hash = "sha256:03ed2a641e412e42cc35c244508cf186015c217f0e4d496bf6d7078ebe837ae7"}, - {file = "coverage-5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14a9f1887591684fb59fdba8feef7123a0da2424b0652e1b58dd5b9a7bb1188c"}, - {file = "coverage-5.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9564ac7eb1652c3701ac691ca72934dd3009997c81266807aef924012df2f4b3"}, - {file = "coverage-5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0f48fc7dc82ee14aeaedb986e175a429d24129b7eada1b7e94a864e4f0644dde"}, - {file = "coverage-5.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:107d327071061fd4f4a2587d14c389a27e4e5c93c7cba5f1f59987181903902f"}, - {file = "coverage-5.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:0cdde51bfcf6b6bd862ee9be324521ec619b20590787d1655d005c3fb175005f"}, - {file = "coverage-5.4-cp39-cp39-win32.whl", hash = "sha256:c67734cff78383a1f23ceba3b3239c7deefc62ac2b05fa6a47bcd565771e5880"}, - {file = "coverage-5.4-cp39-cp39-win_amd64.whl", hash = "sha256:c669b440ce46ae3abe9b2d44a913b5fd86bb19eb14a8701e88e3918902ecd345"}, - {file = "coverage-5.4-pp36-none-any.whl", hash = "sha256:c0ff1c1b4d13e2240821ef23c1efb1f009207cb3f56e16986f713c2b0e7cd37f"}, - {file = "coverage-5.4-pp37-none-any.whl", hash = "sha256:cd601187476c6bed26a0398353212684c427e10a903aeafa6da40c63309d438b"}, - {file = "coverage-5.4.tar.gz", hash = "sha256:6d2e262e5e8da6fa56e774fb8e2643417351427604c2b177f8e8c5f75fc928ca"}, + {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, + {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, + {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, + {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, + {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, + {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, + {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, + {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, + {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, + {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, + {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, + {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, + {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, + {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, + {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, + {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, + {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, + {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, + {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, + {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, + {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, + {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, + {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, + {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, ] cryptography = [ - {file = "cryptography-3.4.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:287032b6a7d86abc98e8e977b20138c53fea40e5b24e29090d5a675a973dcd10"}, - {file = "cryptography-3.4.4-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:7eed937ad9b53280a5f53570d3a7dc93cb4412b6a3d58d4c6bb78cc26319c729"}, - {file = "cryptography-3.4.4-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:f21be9ec6b44c223b2024bbe59d394fadc7be320d18a8d595419afadb6cd5620"}, - {file = "cryptography-3.4.4-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:dab437c2e84628703e3358f0f06555a6259bc5039209d51aa3b05af667ff4fd0"}, - {file = "cryptography-3.4.4-cp36-abi3-win32.whl", hash = "sha256:f6ea140d2736b7e1f0de4f988c43f76b0b3f3d365080e091715429ba218dce28"}, - {file = "cryptography-3.4.4-cp36-abi3-win_amd64.whl", hash = "sha256:288c65eea20bd89b11102c47b118bc1e0749386b0a0dfebba414076c5d4c8188"}, - {file = "cryptography-3.4.4.tar.gz", hash = "sha256:ee5e19f0856b6fbbdbab15c2787ca65d203801d2d65d0b8de6218f424206c848"}, + {file = "cryptography-3.4.6-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:57ad77d32917bc55299b16d3b996ffa42a1c73c6cfa829b14043c561288d2799"}, + {file = "cryptography-3.4.6-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:4169a27b818de4a1860720108b55a2801f32b6ae79e7f99c00d79f2a2822eeb7"}, + {file = "cryptography-3.4.6-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:93cfe5b7ff006de13e1e89830810ecbd014791b042cbe5eec253be11ac2b28f3"}, + {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:5ecf2bcb34d17415e89b546dbb44e73080f747e504273e4d4987630493cded1b"}, + {file = "cryptography-3.4.6-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:fec7fb46b10da10d9e1d078d1ff8ed9e05ae14f431fdbd11145edd0550b9a964"}, + {file = "cryptography-3.4.6-cp36-abi3-win32.whl", hash = "sha256:df186fcbf86dc1ce56305becb8434e4b6b7504bc724b71ad7a3239e0c9d14ef2"}, + {file = "cryptography-3.4.6-cp36-abi3-win_amd64.whl", hash = "sha256:66b57a9ca4b3221d51b237094b0303843b914b7d5afd4349970bb26518e350b0"}, + {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:066bc53f052dfeda2f2d7c195cf16fb3e5ff13e1b6b7415b468514b40b381a5b"}, + {file = "cryptography-3.4.6-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:600cf9bfe75e96d965509a4c0b2b183f74a4fa6f5331dcb40fb7b77b7c2484df"}, + {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:0923ba600d00718d63a3976f23cab19aef10c1765038945628cd9be047ad0336"}, + {file = "cryptography-3.4.6-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:9e98b452132963678e3ac6c73f7010fe53adf72209a32854d55690acac3f6724"}, + {file = "cryptography-3.4.6.tar.gz", hash = "sha256:2d32223e5b0ee02943f32b19245b61a62db83a882f0e76cc564e1cec60d48f87"}, ] defusedxml = [ - {file = "defusedxml-0.7.0rc2-py2.py3-none-any.whl", hash = "sha256:a034ed41d090f2348e4ac209fb3796b54728f7bf5ba326b2c5c599c293c80659"}, - {file = "defusedxml-0.7.0rc2.tar.gz", hash = "sha256:24173aa6820e52524921533ff5af04bf5f0096f21c1628195ae59b44731acc5c"}, + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, ] distlib = [ {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"}, {file = "distlib-0.3.1.zip", hash = "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"}, ] django = [ - {file = "Django-3.1.6-py3-none-any.whl", hash = "sha256:169e2e7b4839a7910b393eec127fd7cbae62e80fa55f89c6510426abf673fe5f"}, - {file = "Django-3.1.6.tar.gz", hash = "sha256:c6c0462b8b361f8691171af1fb87eceb4442da28477e12200c40420176206ba7"}, + {file = "Django-3.1.7-py3-none-any.whl", hash = "sha256:baf099db36ad31f970775d0be5587cc58a6256a6771a44eb795b554d45f211b8"}, + {file = "Django-3.1.7.tar.gz", hash = "sha256:32ce792ee9b6a0cbbec340123e229ac9f765dff8c2a4ae9247a14b2ba3a365a7"}, ] django-cachalot = [ {file = "django-cachalot-2.3.3.tar.gz", hash = "sha256:ba3a6cabf834139196179c4f6d77409ae9170267ee8ce40e27bbf6c3f6733b2b"}, @@ -1912,6 +1932,10 @@ django-celery-results = [ {file = "django_celery_results-2.0.1-py2.py3-none-any.whl", hash = "sha256:a2f7d172f7f57dd972538acc6e80a5bf50c673fb4d82fe027189c8659c60dfce"}, {file = "django_celery_results-2.0.1.tar.gz", hash = "sha256:d625e324138e5b2ef46ffa9e89fa353c16d619420066ac8b240ef9247b293a84"}, ] +django-cors-headers = [ + {file = "django-cors-headers-3.7.0.tar.gz", hash = "sha256:96069c4aaacace786a34ee7894ff680780ec2644e4268b31181044410fecd12e"}, + {file = "django_cors_headers-3.7.0-py3-none-any.whl", hash = "sha256:1ac2b1213de75a251e2ba04448da15f99bcfcbe164288ae6b5ff929dc49b372f"}, +] django-debug-toolbar = [ {file = "django-debug-toolbar-3.2.tar.gz", hash = "sha256:84e2607d900dbd571df0a2acf380b47c088efb787dce9805aefeb407341961d2"}, {file = "django_debug_toolbar-3.2-py3-none-any.whl", hash = "sha256:9e5a25d0c965f7e686f6a8ba23613ca9ca30184daa26487706d4829f5cfb697a"}, @@ -1959,8 +1983,8 @@ factory-boy = [ {file = "factory_boy-3.2.0.tar.gz", hash = "sha256:401cc00ff339a022f84d64a4339503d1689e8263a4478d876e58a3295b155c5b"}, ] faker = [ - {file = "Faker-6.1.1-py3-none-any.whl", hash = "sha256:bf2a9b3f8d00a5dada61fc4a3f80fe0d6795c7f02a138a7d2ef2db5817c7d017"}, - {file = "Faker-6.1.1.tar.gz", hash = "sha256:d4aecdb877519d06c2fdc01ffc5ecf70658981acf5e13cd07ded9892994ef5c6"}, + {file = "Faker-6.6.0-py3-none-any.whl", hash = "sha256:38bd2ff0afb7d9956fed477a2cd1007a7012b401a9ffd3de5fb909d739880582"}, + {file = "Faker-6.6.0.tar.gz", hash = "sha256:0a68a539b236a614157581a135c82a27024a66dc96b9a491883fe583ae3689f9"}, ] filelock = [ {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, @@ -1979,8 +2003,8 @@ flake8-broken-line = [ {file = "flake8_broken_line-0.3.0-py3-none-any.whl", hash = "sha256:611f79c7f27118e7e5d3dc098ef7681c40aeadf23783700c5dbee840d2baf3af"}, ] flake8-bugbear = [ - {file = "flake8-bugbear-20.11.1.tar.gz", hash = "sha256:528020129fea2dea33a466b9d64ab650aa3e5f9ffc788b70ea4bc6cf18283538"}, - {file = "flake8_bugbear-20.11.1-py36.py37.py38-none-any.whl", hash = "sha256:f35b8135ece7a014bc0aee5b5d485334ac30a6da48494998cc1fabf7ec70d703"}, + {file = "flake8-bugbear-21.3.2.tar.gz", hash = "sha256:cadce434ceef96463b45a7c3000f23527c04ea4b531d16c7ac8886051f516ca0"}, + {file = "flake8_bugbear-21.3.2-py36.py37.py38-none-any.whl", hash = "sha256:5d6ccb0c0676c738a6e066b4d50589c408dcc1c5bf1d73b464b18b73cd6c05c2"}, ] flake8-builtins = [ {file = "flake8-builtins-1.5.3.tar.gz", hash = "sha256:09998853b2405e98e61d2ff3027c47033adbdc17f9fe44ca58443d876eb00f3b"}, @@ -2045,20 +2069,20 @@ gevent = [ {file = "gevent-21.1.2.tar.gz", hash = "sha256:520cc2a029a9eef436e4e56b007af7859315cafa21937d43c1d5269f12f2c981"}, ] google-api-core = [ - {file = "google-api-core-1.26.0.tar.gz", hash = "sha256:4230ec764d48ca934fe69b85cc217e31e844e176f68df93e252acd55350e730b"}, - {file = "google_api_core-1.26.0-py2.py3-none-any.whl", hash = "sha256:002e44c533299aecd9dd265d200f9eacd9957cddd2c72e2cd1cb5cea127e972d"}, + {file = "google-api-core-1.26.1.tar.gz", hash = "sha256:23b0df512c4cc8729793f8992edb350e3211f5fd0ec007afb1599864b421beef"}, + {file = "google_api_core-1.26.1-py2.py3-none-any.whl", hash = "sha256:c383206f0f87545d3e658c4f8dc3b18a8457610fdbd791a15757c5b42d1e0e7f"}, ] google-auth = [ - {file = "google-auth-1.26.0.tar.gz", hash = "sha256:26cf3e839be936bbd2f65465cbdecd41590a603a51891a9fd9077716ddc3f726"}, - {file = "google_auth-1.26.0-py2.py3-none-any.whl", hash = "sha256:4c95ef8d2a9afb11015b387a2d2d1d86d8c9170f0b89d07c0f773b852dd695de"}, + {file = "google-auth-1.27.1.tar.gz", hash = "sha256:d8958af6968e4ecd599f82357ebcfeb126f826ed0656126ad68416f810f7531e"}, + {file = "google_auth-1.27.1-py2.py3-none-any.whl", hash = "sha256:63a5636d7eacfe6ef5b7e36e112b3149fa1c5b5ad77dd6df54910459bcd6b89f"}, ] google-cloud-core = [ {file = "google-cloud-core-1.6.0.tar.gz", hash = "sha256:c6abb18527545379fc82efc4de75ce9a3772ccad2fc645adace593ba097cbb02"}, {file = "google_cloud_core-1.6.0-py2.py3-none-any.whl", hash = "sha256:40d9c2da2d03549b5ac3dcccf289d4f15e6d1210044c6381ce45c92913e62904"}, ] google-cloud-storage = [ - {file = "google-cloud-storage-1.36.0.tar.gz", hash = "sha256:9517e26cadb4e52fcd11e83cd1b4051e72351a2e518078102ad2f1b9f4d704bc"}, - {file = "google_cloud_storage-1.36.0-py2.py3-none-any.whl", hash = "sha256:0880af3c8706a52785ee2c6dc6856e33aa8bf951083b145a889137344a7201ad"}, + {file = "google-cloud-storage-1.36.2.tar.gz", hash = "sha256:89d3a101c8ca3aae7614253a03a2e7fe77c5e799469df2d4ec44044cccac1ad8"}, + {file = "google_cloud_storage-1.36.2-py2.py3-none-any.whl", hash = "sha256:a02f955e5c9d8e2035bd0fbe4793604a8f5abf61200cbb743f71cd1c5aa13b68"}, ] google-crc32c = [ {file = "google-crc32c-1.1.2.tar.gz", hash = "sha256:dff5bd1236737f66950999d25de7a78144548ebac7788d30ada8c1b6ead60b27"}, @@ -2096,8 +2120,8 @@ google-resumable-media = [ {file = "google_resumable_media-1.2.0-py2.py3-none-any.whl", hash = "sha256:dbe670cd7f02f3586705fd5a108c8ab8552fa36a1cad8afbc5a54e982cf34f0c"}, ] googleapis-common-protos = [ - {file = "googleapis-common-protos-1.52.0.tar.gz", hash = "sha256:560716c807117394da12cecb0a54da5a451b5cf9866f1d37e9a5e2329a665351"}, - {file = "googleapis_common_protos-1.52.0-py2.py3-none-any.whl", hash = "sha256:c8961760f5aad9a711d37b675be103e0cc4e9a39327e0d6d857872f698403e24"}, + {file = "googleapis-common-protos-1.53.0.tar.gz", hash = "sha256:a88ee8903aa0a81f6c3cec2d5cf62d3c8aa67c06439b0496b49048fb1854ebf4"}, + {file = "googleapis_common_protos-1.53.0-py2.py3-none-any.whl", hash = "sha256:f6d561ab8fb16b30020b940e2dd01cd80082f4762fa9f3ee670f4419b4b8dbd0"}, ] greenlet = [ {file = "greenlet-1.0.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:1d1d4473ecb1c1d31ce8fd8d91e4da1b1f64d425c1dc965edc4ed2a63cfa67b2"}, @@ -2149,8 +2173,8 @@ gunicorn = [ {file = "gunicorn-20.0.4.tar.gz", hash = "sha256:1904bb2b8a43658807108d59c3f3d56c2b6121a701161de0ddf9ad140073c626"}, ] identify = [ - {file = "identify-1.5.13-py2.py3-none-any.whl", hash = "sha256:9dfb63a2e871b807e3ba62f029813552a24b5289504f5b071dea9b041aee9fe4"}, - {file = "identify-1.5.13.tar.gz", hash = "sha256:70b638cf4743f33042bebb3b51e25261a0a10e80f978739f17e7fd4837664a66"}, + {file = "identify-2.1.2-py2.py3-none-any.whl", hash = "sha256:fab0d3a3ab0d7d5f513985b0335ccccad9d61420c5216fb779237bf7edc3e5d1"}, + {file = "identify-2.1.2.tar.gz", hash = "sha256:e3b7fd755b7ceee44fe22957005a92c2a085c863c2e65a6efdec35d0e06666db"}, ] idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, @@ -2185,8 +2209,8 @@ kombu = [ {file = "kombu-5.0.2.tar.gz", hash = "sha256:f4965fba0a4718d47d470beeb5d6446e3357a62402b16c510b6a2f251e05ac3c"}, ] markdown = [ - {file = "Markdown-3.3.3-py3-none-any.whl", hash = "sha256:c109c15b7dc20a9ac454c9e6025927d44460b85bd039da028d85e2b6d0bcc328"}, - {file = "Markdown-3.3.3.tar.gz", hash = "sha256:5d9f2b5ca24bc4c7a390d22323ca4bad200368612b5aaa7796babf971d2b2f18"}, + {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, + {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -2247,28 +2271,28 @@ mccabe = [ {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] mypy = [ - {file = "mypy-0.800-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:e1c84c65ff6d69fb42958ece5b1255394714e0aac4df5ffe151bc4fe19c7600a"}, - {file = "mypy-0.800-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:947126195bfe4709c360e89b40114c6746ae248f04d379dca6f6ab677aa07641"}, - {file = "mypy-0.800-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:b95068a3ce3b50332c40e31a955653be245666a4bc7819d3c8898aa9fb9ea496"}, - {file = "mypy-0.800-cp35-cp35m-win_amd64.whl", hash = "sha256:ca7ad5aed210841f1e77f5f2f7d725b62c78fa77519312042c719ed2ab937876"}, - {file = "mypy-0.800-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e32b7b282c4ed4e378bba8b8dfa08e1cfa6f6574067ef22f86bee5b1039de0c9"}, - {file = "mypy-0.800-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e497a544391f733eca922fdcb326d19e894789cd4ff61d48b4b195776476c5cf"}, - {file = "mypy-0.800-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:5615785d3e2f4f03ab7697983d82c4b98af5c321614f51b8f1034eb9ebe48363"}, - {file = "mypy-0.800-cp36-cp36m-win_amd64.whl", hash = "sha256:2b216eacca0ec0ee124af9429bfd858d5619a0725ee5f88057e6e076f9eb1a7b"}, - {file = "mypy-0.800-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e3b8432f8df19e3c11235c4563a7250666dc9aa7cdda58d21b4177b20256ca9f"}, - {file = "mypy-0.800-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d16c54b0dffb861dc6318a8730952265876d90c5101085a4bc56913e8521ba19"}, - {file = "mypy-0.800-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0d2fc8beb99cd88f2d7e20d69131353053fbecea17904ee6f0348759302c52fa"}, - {file = "mypy-0.800-cp37-cp37m-win_amd64.whl", hash = "sha256:aa9d4901f3ee1a986a3a79fe079ffbf7f999478c281376f48faa31daaa814e86"}, - {file = "mypy-0.800-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:319ee5c248a7c3f94477f92a729b7ab06bf8a6d04447ef3aa8c9ba2aa47c6dcf"}, - {file = "mypy-0.800-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:74f5aa50d0866bc6fb8e213441c41e466c86678c800700b87b012ed11c0a13e0"}, - {file = "mypy-0.800-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:a301da58d566aca05f8f449403c710c50a9860782148332322decf73a603280b"}, - {file = "mypy-0.800-cp38-cp38-win_amd64.whl", hash = "sha256:b9150db14a48a8fa114189bfe49baccdff89da8c6639c2717750c7ae62316738"}, - {file = "mypy-0.800-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5fdf935a46aa20aa937f2478480ebf4be9186e98e49cc3843af9a5795a49a25"}, - {file = "mypy-0.800-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6f8425fecd2ba6007e526209bb985ce7f49ed0d2ac1cc1a44f243380a06a84fb"}, - {file = "mypy-0.800-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5ff616787122774f510caeb7b980542a7cc2222be3f00837a304ea85cd56e488"}, - {file = "mypy-0.800-cp39-cp39-win_amd64.whl", hash = "sha256:90b6f46dc2181d74f80617deca611925d7e63007cf416397358aa42efb593e07"}, - {file = "mypy-0.800-py3-none-any.whl", hash = "sha256:3e0c159a7853e3521e3f582adb1f3eac66d0b0639d434278e2867af3a8c62653"}, - {file = "mypy-0.800.tar.gz", hash = "sha256:e0202e37756ed09daf4b0ba64ad2c245d357659e014c3f51d8cd0681ba66940a"}, + {file = "mypy-0.812-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49"}, + {file = "mypy-0.812-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c"}, + {file = "mypy-0.812-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521"}, + {file = "mypy-0.812-cp35-cp35m-win_amd64.whl", hash = "sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"}, + {file = "mypy-0.812-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a"}, + {file = "mypy-0.812-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c"}, + {file = "mypy-0.812-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6"}, + {file = "mypy-0.812-cp36-cp36m-win_amd64.whl", hash = "sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064"}, + {file = "mypy-0.812-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56"}, + {file = "mypy-0.812-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8"}, + {file = "mypy-0.812-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7"}, + {file = "mypy-0.812-cp37-cp37m-win_amd64.whl", hash = "sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564"}, + {file = "mypy-0.812-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506"}, + {file = "mypy-0.812-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5"}, + {file = "mypy-0.812-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66"}, + {file = "mypy-0.812-cp38-cp38-win_amd64.whl", hash = "sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e"}, + {file = "mypy-0.812-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a"}, + {file = "mypy-0.812-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a"}, + {file = "mypy-0.812-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97"}, + {file = "mypy-0.812-cp39-cp39-win_amd64.whl", hash = "sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df"}, + {file = "mypy-0.812-py3-none-any.whl", hash = "sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4"}, + {file = "mypy-0.812.tar.gz", hash = "sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, @@ -2329,32 +2353,34 @@ pluggy = [ {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] pre-commit = [ - {file = "pre_commit-2.10.1-py2.py3-none-any.whl", hash = "sha256:16212d1fde2bed88159287da88ff03796863854b04dc9f838a55979325a3d20e"}, - {file = "pre_commit-2.10.1.tar.gz", hash = "sha256:399baf78f13f4de82a29b649afd74bef2c4e28eb4f021661fc7f29246e8c7a3a"}, + {file = "pre_commit-2.11.1-py2.py3-none-any.whl", hash = "sha256:94c82f1bf5899d56edb1d926732f4e75a7df29a0c8c092559c77420c9d62428b"}, + {file = "pre_commit-2.11.1.tar.gz", hash = "sha256:de55c5c72ce80d79106e48beb1b54104d16495ce7f95b0c7b13d4784193a00af"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.16-py3-none-any.whl", hash = "sha256:62c811e46bd09130fb11ab759012a4ae385ce4fb2073442d1898867a824183bd"}, - {file = "prompt_toolkit-3.0.16.tar.gz", hash = "sha256:0fa02fa80363844a4ab4b8d6891f62dd0645ba672723130423ca4037b80c1974"}, + {file = "prompt_toolkit-3.0.17-py3-none-any.whl", hash = "sha256:4cea7d09e46723885cb8bc54678175453e5071e9449821dce6f017b1d1fbfc1a"}, + {file = "prompt_toolkit-3.0.17.tar.gz", hash = "sha256:9397a7162cf45449147ad6042fa37983a081b8a73363a5253dd4072666333137"}, ] protobuf = [ - {file = "protobuf-3.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:629b03fd3caae7f815b0c66b41273f6b1900a579e2ccb41ef4493a4f5fb84f3a"}, - {file = "protobuf-3.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5b7a637212cc9b2bcf85dd828b1178d19efdf74dbfe1ddf8cd1b8e01fdaaa7f5"}, - {file = "protobuf-3.14.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:43b554b9e73a07ba84ed6cf25db0ff88b1e06be610b37656e292e3cbb5437472"}, - {file = "protobuf-3.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5e9806a43232a1fa0c9cf5da8dc06f6910d53e4390be1fa06f06454d888a9142"}, - {file = "protobuf-3.14.0-cp35-cp35m-win32.whl", hash = "sha256:1c51fda1bbc9634246e7be6016d860be01747354ed7015ebe38acf4452f470d2"}, - {file = "protobuf-3.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:4b74301b30513b1a7494d3055d95c714b560fbb630d8fb9956b6f27992c9f980"}, - {file = "protobuf-3.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:86a75477addde4918e9a1904e5c6af8d7b691f2a3f65587d73b16100fbe4c3b2"}, - {file = "protobuf-3.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ecc33531a213eee22ad60e0e2aaea6c8ba0021f0cce35dbf0ab03dee6e2a23a1"}, - {file = "protobuf-3.14.0-cp36-cp36m-win32.whl", hash = "sha256:72230ed56f026dd664c21d73c5db73ebba50d924d7ba6b7c0d81a121e390406e"}, - {file = "protobuf-3.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0fc96785262042e4863b3f3b5c429d4636f10d90061e1840fce1baaf59b1a836"}, - {file = "protobuf-3.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4e75105c9dfe13719b7293f75bd53033108f4ba03d44e71db0ec2a0e8401eafd"}, - {file = "protobuf-3.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2a7e2fe101a7ace75e9327b9c946d247749e564a267b0515cf41dfe450b69bac"}, - {file = "protobuf-3.14.0-cp37-cp37m-win32.whl", hash = "sha256:b0d5d35faeb07e22a1ddf8dce620860c8fe145426c02d1a0ae2688c6e8ede36d"}, - {file = "protobuf-3.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8971c421dbd7aad930c9bd2694122f332350b6ccb5202a8b7b06f3f1a5c41ed5"}, - {file = "protobuf-3.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9616f0b65a30851e62f1713336c931fcd32c057202b7ff2cfbfca0fc7d5e3043"}, - {file = "protobuf-3.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:22bcd2e284b3b1d969c12e84dc9b9a71701ec82d8ce975fdda19712e1cfd4e00"}, - {file = "protobuf-3.14.0-py2.py3-none-any.whl", hash = "sha256:0e247612fadda953047f53301a7b0407cb0c3cb4ae25a6fde661597a04039b3c"}, - {file = "protobuf-3.14.0.tar.gz", hash = "sha256:1d63eb389347293d8915fb47bee0951c7b5dab522a4a60118b9a18f33e21f8ce"}, + {file = "protobuf-3.15.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1771ef20e88759c4d81db213e89b7a1fc53937968e12af6603c658ee4bcbfa38"}, + {file = "protobuf-3.15.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1a66261a402d05c8ad8c1fde8631837307bf8d7e7740a4f3941fc3277c2e1528"}, + {file = "protobuf-3.15.6-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:eac23a3e56175b710f3da9a9e8e2aa571891fbec60e0c5a06db1c7b1613b5cfd"}, + {file = "protobuf-3.15.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ec220d90eda8bb7a7a1434a8aed4fe26d7e648c1a051c2885f3f5725b6aa71a"}, + {file = "protobuf-3.15.6-cp35-cp35m-win32.whl", hash = "sha256:88d8f21d1ac205eedb6dea943f8204ed08201b081dba2a966ab5612788b9bb1e"}, + {file = "protobuf-3.15.6-cp35-cp35m-win_amd64.whl", hash = "sha256:eaada29bbf087dea7d8bce4d1d604fc768749e8809e9c295922accd7c8fce4d5"}, + {file = "protobuf-3.15.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:256c0b2e338c1f3228d3280707606fe5531fde85ab9d704cde6fdeb55112531f"}, + {file = "protobuf-3.15.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b9069e45b6e78412fba4a314ea38b4a478686060acf470d2b131b3a2c50484ec"}, + {file = "protobuf-3.15.6-cp36-cp36m-win32.whl", hash = "sha256:24f4697f57b8520c897a401b7f9a5ae45c369e22c572e305dfaf8053ecb49687"}, + {file = "protobuf-3.15.6-cp36-cp36m-win_amd64.whl", hash = "sha256:d9ed0955b794f1e5f367e27f8a8ff25501eabe34573f003f06639c366ca75f73"}, + {file = "protobuf-3.15.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:822ac7f87fc2fb9b24edd2db390538b60ef50256e421ca30d65250fad5a3d477"}, + {file = "protobuf-3.15.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:74ac159989e2b02d761188a2b6f4601ff5e494d9b9d863f5ad6e98e5e0c54328"}, + {file = "protobuf-3.15.6-cp37-cp37m-win32.whl", hash = "sha256:30fe4249a364576f9594180589c3f9c4771952014b5f77f0372923fc7bafbbe2"}, + {file = "protobuf-3.15.6-cp37-cp37m-win_amd64.whl", hash = "sha256:45a91fc6f9aa86d3effdeda6751882b02de628519ba06d7160daffde0c889ff8"}, + {file = "protobuf-3.15.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:83c7c7534f050cb25383bb817159416601d1cc46c40bc5e851ec8bbddfc34a2f"}, + {file = "protobuf-3.15.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9ec20a6ded7d0888e767ad029dbb126e604e18db744ac0a428cf746e040ccecd"}, + {file = "protobuf-3.15.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0f2da2fcc4102b6c3b57f03c9d8d5e37c63f8bc74deaa6cb54e0cc4524a77247"}, + {file = "protobuf-3.15.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:70054ae1ce5dea7dec7357db931fcf487f40ea45b02cb719ee6af07eb1e906fb"}, + {file = "protobuf-3.15.6-py2.py3-none-any.whl", hash = "sha256:1655fc0ba7402560d749de13edbfca1ac45d1753d8f4e5292989f18f5a00c215"}, + {file = "protobuf-3.15.6.tar.gz", hash = "sha256:2b974519a2ae83aa1e31cff9018c70bbe0e303a46a598f982943c49ae1d4fcd3"}, ] psycopg2-binary = [ {file = "psycopg2-binary-2.8.6.tar.gz", hash = "sha256:11b9c0ebce097180129e422379b824ae21c8f2a6596b159c7659e2e5a00e1aa0"}, @@ -2492,18 +2518,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"}, @@ -2565,12 +2599,12 @@ requests-oauthlib = [ {file = "requests_oauthlib-1.3.0-py3.7.egg", hash = "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc"}, ] rsa = [ - {file = "rsa-4.7-py3-none-any.whl", hash = "sha256:a8774e55b59fd9fc893b0d05e9bfc6f47081f46ff5b46f39ccf24631b7be356b"}, - {file = "rsa-4.7.tar.gz", hash = "sha256:69805d6b69f56eb05b62daea3a7dbd7aa44324ad1306445e05da8060232d00f4"}, + {file = "rsa-4.7.2-py3-none-any.whl", hash = "sha256:78f9a9bf4e7be0c5ded4583326e7461e3a3c5aae24073648b4bdfa797d78c9d2"}, + {file = "rsa-4.7.2.tar.gz", hash = "sha256:9d689e6ca1b3038bc82bf8d23e944b6b6037bc02301a574935b2dd946e0353b9"}, ] "ruamel.yaml" = [ - {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, - {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, + {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, + {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, ] "ruamel.yaml.clib" = [ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, @@ -2623,8 +2657,8 @@ social-auth-app-django = [ {file = "social_auth_app_django-4.0.0-py3-none-any.whl", hash = "sha256:567ad0e028311541d7dfed51d3bf2c60440a6fd236d5d4d06c5a618b3d6c57c5"}, ] social-auth-core = [ - {file = "social-auth-core-4.0.3.tar.gz", hash = "sha256:694eb355825cd72d3346afb816dd899493be1a8ee7405945d2e989cabed10cf2"}, - {file = "social_auth_core-4.0.3-py3-none-any.whl", hash = "sha256:567b1f1bb1912e2c3153df888b48ba883dabdfe72f031e8cae4d404f61745c21"}, + {file = "social-auth-core-4.1.0.tar.gz", hash = "sha256:5ab43b3b15dce5f059db69cc3082c216574739f0edbc98629c8c6e8769c67eb4"}, + {file = "social_auth_core-4.1.0-py3-none-any.whl", hash = "sha256:983b53167ac56e7ba4909db555602a6e7a98c97ca47183bb222eb85ba627bf2b"}, ] sqlparse = [ {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, diff --git a/django/pyproject.toml b/django/pyproject.toml index 70a756806..cfe1714a5 100644 --- a/django/pyproject.toml +++ b/django/pyproject.toml @@ -30,6 +30,7 @@ django-celery-results = "^2.0.0" django-celery-beat = "^2.1.0" ulid2 = "^0.2.0" django-cachalot = "^2.3.3" +django-cors-headers = "^3.7.0" [tool.poetry.dev-dependencies] pytest = "^6.2" diff --git a/django/thunderstore/core/settings.py b/django/thunderstore/core/settings.py index 8a55f6369..7b3a7ac6d 100644 --- a/django/thunderstore/core/settings.py +++ b/django/thunderstore/core/settings.py @@ -155,6 +155,7 @@ def load_db_certs(): "django_celery_beat", "django_celery_results", "cachalot", + "corsheaders", # Own "thunderstore.core", "thunderstore.cache", @@ -172,6 +173,7 @@ def load_db_certs(): "django.middleware.security.SecurityMiddleware", "thunderstore.frontend.middleware.SocialAuthExceptionHandlerMiddleware", "whitenoise.middleware.WhiteNoiseMiddleware", + "corsheaders.middleware.CorsMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", From 875fc6f53b677dc0b6f362409755e515f8c23977 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 28 Feb 2021 18:19:45 +0000 Subject: [PATCH 02/23] Add CORS_ALLOWED_ORIGINS --- .env.template | 1 + django/thunderstore/core/settings.py | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.env.template b/.env.template index 5ed61be5f..9f0076c69 100644 --- a/.env.template +++ b/.env.template @@ -9,6 +9,7 @@ SECRET_KEY=xxx ALLOWED_HOSTS=* DATABASE_LOGS=0 DATABASE_QUERY_COUNT_HEADER=1 +CORS_ALLOWED_ORIGINS=* SOCIAL_AUTH_DISCORD_KEY= SOCIAL_AUTH_DISCORD_SECRET= diff --git a/django/thunderstore/core/settings.py b/django/thunderstore/core/settings.py index 7b3a7ac6d..e46075ba1 100644 --- a/django/thunderstore/core/settings.py +++ b/django/thunderstore/core/settings.py @@ -25,6 +25,7 @@ DISABLE_SERVER_SIDE_CURSORS=(bool, True), SECRET_KEY=(str, ""), ALLOWED_HOSTS=(list, []), + CORS_ALLOWED_ORIGINS=(list, []), PROTOCOL=(str, ""), SOCIAL_AUTH_DISCORD_KEY=(str, ""), SOCIAL_AUTH_DISCORD_SECRET=(str, ""), @@ -83,6 +84,10 @@ SECRET_KEY = env.str("SECRET_KEY") ALLOWED_HOSTS = env.list("ALLOWED_HOSTS") +CORS_ALLOWED_ORIGINS = env.list("CORS_ALLOWED_ORIGINS") +if CORS_ALLOWED_ORIGINS == ["*"]: + CORS_ALLOWED_ORIGINS = [] + CORS_ALLOW_ALL_ORIGINS = True DATABASE_LOGS = env.bool("DATABASE_LOGS") DATABASE_QUERY_COUNT_HEADER = env.bool("DATABASE_QUERY_COUNT_HEADER") From 5140a15a09e0e23e48704d7dc254adfbc50cc7da Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 28 Feb 2021 18:35:06 +0000 Subject: [PATCH 03/23] Add identites to current-user --- django/thunderstore/social/api/experimental/views.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/django/thunderstore/social/api/experimental/views.py b/django/thunderstore/social/api/experimental/views.py index fcffdab81..7e13f3523 100644 --- a/django/thunderstore/social/api/experimental/views.py +++ b/django/thunderstore/social/api/experimental/views.py @@ -10,9 +10,17 @@ class CurrentUserExperimentalApiView(APIView): def get(self, request, format=None): capabilities = set() rated_packages = [] + identities = [] if request.user.is_authenticated: capabilities.add("package.rate") rated_packages = request.user.package_ratings.select_related( "package" ).values_list("package__uuid4", flat=True) - return Response({"capabilities": capabilities, "ratedPackages": rated_packages}) + identities = request.user.uploader_identities.values_list("identity__name") + return Response( + { + "capabilities": capabilities, + "ratedPackages": rated_packages, + "identities": identities, + }, + ) From e0dd42f64affbff95a75be281399a0b485e59009 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 6 Mar 2021 17:24:29 +0000 Subject: [PATCH 04/23] Rename to teams --- django/thunderstore/social/api/experimental/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/django/thunderstore/social/api/experimental/views.py b/django/thunderstore/social/api/experimental/views.py index 7e13f3523..901ff17fe 100644 --- a/django/thunderstore/social/api/experimental/views.py +++ b/django/thunderstore/social/api/experimental/views.py @@ -10,17 +10,17 @@ class CurrentUserExperimentalApiView(APIView): def get(self, request, format=None): capabilities = set() rated_packages = [] - identities = [] + teams = [] if request.user.is_authenticated: capabilities.add("package.rate") rated_packages = request.user.package_ratings.select_related( "package" ).values_list("package__uuid4", flat=True) - identities = request.user.uploader_identities.values_list("identity__name") + teams = request.user.uploader_identities.values_list("identity__name") return Response( { "capabilities": capabilities, "ratedPackages": rated_packages, - "identities": identities, + "teams": teams, }, ) From 2b16cbeecab9689c3f3c4727cdd384d28877ee41 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 6 Mar 2021 17:27:56 +0000 Subject: [PATCH 05/23] Add username to current-user --- django/thunderstore/social/api/experimental/views.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/django/thunderstore/social/api/experimental/views.py b/django/thunderstore/social/api/experimental/views.py index 901ff17fe..c7f2b8a26 100644 --- a/django/thunderstore/social/api/experimental/views.py +++ b/django/thunderstore/social/api/experimental/views.py @@ -8,10 +8,12 @@ class CurrentUserExperimentalApiView(APIView): """ def get(self, request, format=None): + username = None capabilities = set() rated_packages = [] teams = [] if request.user.is_authenticated: + username = request.user.username capabilities.add("package.rate") rated_packages = request.user.package_ratings.select_related( "package" @@ -19,6 +21,7 @@ def get(self, request, format=None): teams = request.user.uploader_identities.values_list("identity__name") return Response( { + "username": username, "capabilities": capabilities, "ratedPackages": rated_packages, "teams": teams, From f365c89f0d98e18bb2bb5abd5e5a13da34805175 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 7 Mar 2021 17:50:26 +0000 Subject: [PATCH 06/23] Add package and categories list --- .../community/api/experimental/__init__.py | 0 .../community/api/experimental/serializers.py | 23 +++++++++++++ .../community/api/experimental/urls.py | 19 +++++++++++ .../community/api/experimental/views.py | 32 +++++++++++++++++++ django/thunderstore/core/api_urls.py | 16 ++++++++-- 5 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 django/thunderstore/community/api/experimental/__init__.py create mode 100644 django/thunderstore/community/api/experimental/serializers.py create mode 100644 django/thunderstore/community/api/experimental/urls.py create mode 100644 django/thunderstore/community/api/experimental/views.py diff --git a/django/thunderstore/community/api/experimental/__init__.py b/django/thunderstore/community/api/experimental/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/django/thunderstore/community/api/experimental/serializers.py b/django/thunderstore/community/api/experimental/serializers.py new file mode 100644 index 000000000..3eba925e7 --- /dev/null +++ b/django/thunderstore/community/api/experimental/serializers.py @@ -0,0 +1,23 @@ +from rest_framework import serializers + +from thunderstore.community.models import Community, PackageCategory + + +class CommunitySerializer(serializers.ModelSerializer): + class Meta: + model = Community + fields = ( + "identifier", + "name", + "discord_url", + "wiki_url", + ) + + +class PackageCategorySerializer(serializers.ModelSerializer): + class Meta: + model = PackageCategory + fields = ( + "name", + "slug", + ) diff --git a/django/thunderstore/community/api/experimental/urls.py b/django/thunderstore/community/api/experimental/urls.py new file mode 100644 index 000000000..85078fbce --- /dev/null +++ b/django/thunderstore/community/api/experimental/urls.py @@ -0,0 +1,19 @@ +from django.urls import path + +from thunderstore.community.api.experimental.views import ( + CommunitiesExperimentalApiView, + PackageCategoriesExperimentalApiView, +) + +urls = [ + path( + "community/", + CommunitiesExperimentalApiView.as_view(), + name="communities", + ), + path( + "community//category/", + PackageCategoriesExperimentalApiView.as_view(), + name="categories", + ), +] diff --git a/django/thunderstore/community/api/experimental/views.py b/django/thunderstore/community/api/experimental/views.py new file mode 100644 index 000000000..88f1a2ee7 --- /dev/null +++ b/django/thunderstore/community/api/experimental/views.py @@ -0,0 +1,32 @@ +from rest_framework.response import Response +from rest_framework.views import APIView + +from thunderstore.community.api.experimental.serializers import ( + CommunitySerializer, + PackageCategorySerializer, +) +from thunderstore.community.models import Community + + +class CommunitiesExperimentalApiView(APIView): + def get(self, request, format=None): + communities = CommunitySerializer(Community.objects.listed(), many=True) + return Response( + { + "communities": communities.data, + }, + ) + + +class PackageCategoriesExperimentalApiView(APIView): + def get(self, request, format=None, **kwargs): + community_identifier = kwargs["community"] + community = Community.objects.filter(identifier=community_identifier).first() + if not community: + return Response({"error": "Community not found"}, 404) + communities = PackageCategorySerializer(community.package_categories, many=True) + return Response( + { + "packageCategories": communities.data, + }, + ) diff --git a/django/thunderstore/core/api_urls.py b/django/thunderstore/core/api_urls.py index 1af56c1af..625bb0d2e 100644 --- a/django/thunderstore/core/api_urls.py +++ b/django/thunderstore/core/api_urls.py @@ -1,12 +1,24 @@ from django.urls import include, path -from thunderstore.repository.api.experimental.urls import urls as experimental_urls +from thunderstore.community.api.experimental.urls import ( + urls as community_experimental_urls, +) +from thunderstore.repository.api.experimental.urls import ( + urls as repository_experimental_urls, +) from thunderstore.repository.api.v1.urls import urls as v1_urls api_experimental_urls = [ path( "", - include((experimental_urls, "api-experimental"), namespace="api-experimental"), + include( + (repository_experimental_urls, "api-experimental"), + namespace="api-experimental", + ), + ), + path( + "", + include(community_experimental_urls), ), ] From a13df8c0697b5de48103f42cf4601bb6c7f2ba68 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 12 Mar 2021 18:03:53 +0000 Subject: [PATCH 07/23] Add user auth token endpoint --- .../account/api/experimental/__init__.py | 0 .../account/api/experimental/urls.py | 11 +++++++++++ .../account/api/experimental/views.py | 18 ++++++++++++++++++ django/thunderstore/core/api_urls.py | 5 +++++ 4 files changed, 34 insertions(+) create mode 100644 django/thunderstore/account/api/experimental/__init__.py create mode 100644 django/thunderstore/account/api/experimental/urls.py create mode 100644 django/thunderstore/account/api/experimental/views.py diff --git a/django/thunderstore/account/api/experimental/__init__.py b/django/thunderstore/account/api/experimental/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/django/thunderstore/account/api/experimental/urls.py b/django/thunderstore/account/api/experimental/urls.py new file mode 100644 index 000000000..a812f16fc --- /dev/null +++ b/django/thunderstore/account/api/experimental/urls.py @@ -0,0 +1,11 @@ +from django.urls import path + +from thunderstore.account.api.experimental.views import TokenExperimentalApiView + +urls = [ + path( + "auth/token/", + TokenExperimentalApiView.as_view(), + name="token", + ), +] diff --git a/django/thunderstore/account/api/experimental/views.py b/django/thunderstore/account/api/experimental/views.py new file mode 100644 index 000000000..4a9451726 --- /dev/null +++ b/django/thunderstore/account/api/experimental/views.py @@ -0,0 +1,18 @@ +from rest_framework.authentication import SessionAuthentication +from rest_framework.authtoken.models import Token +from rest_framework.permissions import IsAuthenticated +from rest_framework.response import Response +from rest_framework.views import APIView + + +class TokenExperimentalApiView(APIView): + authentication_classes = [SessionAuthentication] + permission_classes = [IsAuthenticated] + + def post(self, request, format=None): + token = Token.objects.create(user=request.user) + return Response( + { + "token": token.key, + }, + ) diff --git a/django/thunderstore/core/api_urls.py b/django/thunderstore/core/api_urls.py index 625bb0d2e..ba397efa6 100644 --- a/django/thunderstore/core/api_urls.py +++ b/django/thunderstore/core/api_urls.py @@ -1,5 +1,6 @@ from django.urls import include, path +from thunderstore.account.api.experimental.urls import urls as account_experimental_urls from thunderstore.community.api.experimental.urls import ( urls as community_experimental_urls, ) @@ -20,6 +21,10 @@ "", include(community_experimental_urls), ), + path( + "", + include(account_experimental_urls), + ), ] api_urls = [ From b158d8784bbbfa7a886e029ed411ef8db79b86ce Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 19 Mar 2021 22:30:59 +0000 Subject: [PATCH 08/23] Use get_object_or_404 --- django/thunderstore/community/api/experimental/views.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/django/thunderstore/community/api/experimental/views.py b/django/thunderstore/community/api/experimental/views.py index 88f1a2ee7..a83fc3a9f 100644 --- a/django/thunderstore/community/api/experimental/views.py +++ b/django/thunderstore/community/api/experimental/views.py @@ -1,3 +1,4 @@ +from django.shortcuts import get_object_or_404 from rest_framework.response import Response from rest_framework.views import APIView @@ -21,9 +22,7 @@ def get(self, request, format=None): class PackageCategoriesExperimentalApiView(APIView): def get(self, request, format=None, **kwargs): community_identifier = kwargs["community"] - community = Community.objects.filter(identifier=community_identifier).first() - if not community: - return Response({"error": "Community not found"}, 404) + community = get_object_or_404(Community, identifier=community_identifier) communities = PackageCategorySerializer(community.package_categories, many=True) return Response( { From 01ec174a5495df725db1dc02020b4894e15b82e3 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 19 Mar 2021 22:32:29 +0000 Subject: [PATCH 09/23] Rename to /auth/session-token/ --- django/thunderstore/account/api/experimental/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/django/thunderstore/account/api/experimental/urls.py b/django/thunderstore/account/api/experimental/urls.py index a812f16fc..3a9521906 100644 --- a/django/thunderstore/account/api/experimental/urls.py +++ b/django/thunderstore/account/api/experimental/urls.py @@ -4,7 +4,7 @@ urls = [ path( - "auth/token/", + "auth/session-token/", TokenExperimentalApiView.as_view(), name="token", ), From 117fda5894ed99f769b062ad011d544f84e3d21b Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 19 Mar 2021 23:11:58 +0000 Subject: [PATCH 10/23] Rename create session token view --- django/thunderstore/account/api/experimental/urls.py | 6 ++++-- django/thunderstore/account/api/experimental/views.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/django/thunderstore/account/api/experimental/urls.py b/django/thunderstore/account/api/experimental/urls.py index 3a9521906..f5c8c2105 100644 --- a/django/thunderstore/account/api/experimental/urls.py +++ b/django/thunderstore/account/api/experimental/urls.py @@ -1,11 +1,13 @@ from django.urls import path -from thunderstore.account.api.experimental.views import TokenExperimentalApiView +from thunderstore.account.api.experimental.views import ( + CreateSessionTokenExperimentalApiView, +) urls = [ path( "auth/session-token/", - TokenExperimentalApiView.as_view(), + CreateSessionTokenExperimentalApiView.as_view(), name="token", ), ] diff --git a/django/thunderstore/account/api/experimental/views.py b/django/thunderstore/account/api/experimental/views.py index 4a9451726..30c4819b6 100644 --- a/django/thunderstore/account/api/experimental/views.py +++ b/django/thunderstore/account/api/experimental/views.py @@ -5,7 +5,7 @@ from rest_framework.views import APIView -class TokenExperimentalApiView(APIView): +class CreateSessionTokenExperimentalApiView(APIView): authentication_classes = [SessionAuthentication] permission_classes = [IsAuthenticated] From 930f9d53854c1a29fdb1e7e22e263d3d82b37231 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 19 Mar 2021 23:35:24 +0000 Subject: [PATCH 11/23] Add UserSessionTokenAuthentication --- .../account/api/experimental/views.py | 5 ++- django/thunderstore/account/authentication.py | 32 +++++++++++++++++++ django/thunderstore/core/settings.py | 1 + 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/django/thunderstore/account/api/experimental/views.py b/django/thunderstore/account/api/experimental/views.py index 30c4819b6..aace61353 100644 --- a/django/thunderstore/account/api/experimental/views.py +++ b/django/thunderstore/account/api/experimental/views.py @@ -9,10 +9,9 @@ class CreateSessionTokenExperimentalApiView(APIView): authentication_classes = [SessionAuthentication] permission_classes = [IsAuthenticated] - def post(self, request, format=None): - token = Token.objects.create(user=request.user) + def get(self, request, format=None): return Response( { - "token": token.key, + "token": request.session.session_key, }, ) diff --git a/django/thunderstore/account/authentication.py b/django/thunderstore/account/authentication.py index a5a1117db..982903a70 100644 --- a/django/thunderstore/account/authentication.py +++ b/django/thunderstore/account/authentication.py @@ -1,9 +1,14 @@ +from django.contrib.auth import get_user_model +from django.contrib.sessions.backends.db import SessionStore from django.utils import timezone +from rest_framework import exceptions from rest_framework.authentication import TokenAuthentication as DRFTokenAuthentication from rest_framework.authtoken.models import Token from thunderstore.account.models import ServiceAccount +User = get_user_model() + class TokenAuthentication(DRFTokenAuthentication): keyword = "Bearer" @@ -18,3 +23,30 @@ def authenticate(self, request): service_account.last_used = timezone.now() service_account.save(update_fields=("last_used",)) return out + + +class UserSessionTokenAuthentication(DRFTokenAuthentication): + """ + This authentication is used for the Django React transition only. + + This uses the session ID prepended by "Session ". For example: + `Authorization: Session cu5zafrhapnck64nsyz7cl9w6ezwuuz4` + """ + + keyword = "Session" + + def authenticate_credentials(self, key): + session = SessionStore(session_key=key) + if not session.exists(key): + raise exceptions.AuthenticationFailed("Invalid token.") + user_id = session.get("_auth_user_id") + if user_id is None: + raise exceptions.AuthenticationFailed("Invalid token.") + try: + user = User.objects.get(id=user_id) + except User.DoesNotExist: + raise exceptions.AuthenticationFailed("User inactive or deleted.") + if not user.is_active: + raise exceptions.AuthenticationFailed("User inactive or deleted.") + + return (user, None) diff --git a/django/thunderstore/core/settings.py b/django/thunderstore/core/settings.py index e46075ba1..53d69d979 100644 --- a/django/thunderstore/core/settings.py +++ b/django/thunderstore/core/settings.py @@ -416,6 +416,7 @@ def show_debug_toolbar(request): "DEFAULT_PARSER_CLASSES": ["rest_framework.parsers.JSONParser"], "DEFAULT_AUTHENTICATION_CLASSES": [ "thunderstore.account.authentication.TokenAuthentication", + "thunderstore.account.authentication.UserSessionTokenAuthentication", ], } From b381550bab3bc16de48dee72beea355eee8640d7 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 20 Mar 2021 12:01:00 +0000 Subject: [PATCH 12/23] Move account tests to tests/ --- django/thunderstore/account/tests/__init__.py | 0 django/thunderstore/account/{ => tests}/test_service_account.py | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 django/thunderstore/account/tests/__init__.py rename django/thunderstore/account/{ => tests}/test_service_account.py (100%) diff --git a/django/thunderstore/account/tests/__init__.py b/django/thunderstore/account/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/django/thunderstore/account/test_service_account.py b/django/thunderstore/account/tests/test_service_account.py similarity index 100% rename from django/thunderstore/account/test_service_account.py rename to django/thunderstore/account/tests/test_service_account.py From 468c454e911e7dd0787bd39b9c90a6c1b5ac5cca Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 20 Mar 2021 12:36:19 +0000 Subject: [PATCH 13/23] Add user session token tests --- .../account/tests/test_user_session_token.py | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 django/thunderstore/account/tests/test_user_session_token.py diff --git a/django/thunderstore/account/tests/test_user_session_token.py b/django/thunderstore/account/tests/test_user_session_token.py new file mode 100644 index 000000000..737cea139 --- /dev/null +++ b/django/thunderstore/account/tests/test_user_session_token.py @@ -0,0 +1,36 @@ +import pytest +import rest_framework.exceptions + +from thunderstore.account.authentication import UserSessionTokenAuthentication + + +@pytest.mark.django_db +def test_user_session_token(client, user): + client.force_login(user) + session_id = client.cookies["sessionid"].value + authenticated_user, _ = UserSessionTokenAuthentication().authenticate_credentials( + session_id, + ) + assert authenticated_user == user + + +@pytest.mark.django_db +def test_user_session_token_invalid(): + with pytest.raises( + rest_framework.exceptions.AuthenticationFailed, + match="Invalid token.", + ): + UserSessionTokenAuthentication().authenticate_credentials("INVALID_SESSION_ID") + + +@pytest.mark.django_db +def test_user_session_token_inactive_user(client, user): + user.is_active = False + user.save() + client.force_login(user) + session_id = client.cookies["sessionid"].value + with pytest.raises( + rest_framework.exceptions.AuthenticationFailed, + match="User inactive or deleted.", + ): + UserSessionTokenAuthentication().authenticate_credentials(session_id) From f4596bafc4a5865fd2054b2ebfd0af04fb5bf16f Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 20 Mar 2021 12:56:27 +0000 Subject: [PATCH 14/23] Add community API tests --- .../tests/test_api_categories_list.py | 32 +++++++++++++++++++ .../tests/test_api_communities_list.py | 13 ++++++++ 2 files changed, 45 insertions(+) create mode 100644 django/thunderstore/community/api/experimental/tests/test_api_categories_list.py create mode 100644 django/thunderstore/community/api/experimental/tests/test_api_communities_list.py diff --git a/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py b/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py new file mode 100644 index 000000000..e589aa0c2 --- /dev/null +++ b/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py @@ -0,0 +1,32 @@ +import pytest + +from thunderstore.community.models import Community + + +@pytest.mark.django_db +def test_api_experimental_categories_list( + api_client, + community, +): + response = api_client.get( + f"/api/experimental/community/{community.identifier}/category/", + HTTP_ACCEPT="application/json", + ) + assert response.status_code == 200 + assert isinstance(response.json()["packageCategories"], list) + + +@pytest.mark.django_db +def test_api_experimental_categories_list_not_found( + api_client, +): + invalid_community_identifier = "NOT_A_COMMUNITY_IDENTIFIER" + assert not Community.objects.filter( + identifier=invalid_community_identifier, + ).exists() + response = api_client.get( + f"/api/experimental/community/{invalid_community_identifier}/category/", + HTTP_ACCEPT="application/json", + ) + assert response.status_code == 404 + assert response.json() == {"detail": "Not found."} diff --git a/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py b/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py new file mode 100644 index 000000000..3221dfbc0 --- /dev/null +++ b/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py @@ -0,0 +1,13 @@ +import pytest + + +@pytest.mark.django_db +def test_api_experimental_communities_list( + api_client, +): + response = api_client.get( + "/api/experimental/community/", + HTTP_ACCEPT="application/json", + ) + assert response.status_code == 200 + assert isinstance(response.json()["communities"], list) From 1b836d10e3c4f2b0a9969d2ddde1cf9e9425390f Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 20 Mar 2021 13:10:54 +0000 Subject: [PATCH 15/23] Use django.contrib.auth.SESSION_KEY --- django/thunderstore/account/authentication.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/django/thunderstore/account/authentication.py b/django/thunderstore/account/authentication.py index 982903a70..88a00e342 100644 --- a/django/thunderstore/account/authentication.py +++ b/django/thunderstore/account/authentication.py @@ -1,4 +1,4 @@ -from django.contrib.auth import get_user_model +from django.contrib.auth import SESSION_KEY, get_user_model from django.contrib.sessions.backends.db import SessionStore from django.utils import timezone from rest_framework import exceptions @@ -39,7 +39,7 @@ def authenticate_credentials(self, key): session = SessionStore(session_key=key) if not session.exists(key): raise exceptions.AuthenticationFailed("Invalid token.") - user_id = session.get("_auth_user_id") + user_id = session.get(SESSION_KEY) if user_id is None: raise exceptions.AuthenticationFailed("Invalid token.") try: From a1eb7a2eab333c7c037b72a54dea816db9235fbf Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 21 Mar 2021 12:56:20 +0000 Subject: [PATCH 16/23] Remove create session token endpoint --- .../account/api/experimental/__init__.py | 0 .../account/api/experimental/urls.py | 13 ------------- .../account/api/experimental/views.py | 17 ----------------- django/thunderstore/core/api_urls.py | 5 ----- 4 files changed, 35 deletions(-) delete mode 100644 django/thunderstore/account/api/experimental/__init__.py delete mode 100644 django/thunderstore/account/api/experimental/urls.py delete mode 100644 django/thunderstore/account/api/experimental/views.py diff --git a/django/thunderstore/account/api/experimental/__init__.py b/django/thunderstore/account/api/experimental/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/django/thunderstore/account/api/experimental/urls.py b/django/thunderstore/account/api/experimental/urls.py deleted file mode 100644 index f5c8c2105..000000000 --- a/django/thunderstore/account/api/experimental/urls.py +++ /dev/null @@ -1,13 +0,0 @@ -from django.urls import path - -from thunderstore.account.api.experimental.views import ( - CreateSessionTokenExperimentalApiView, -) - -urls = [ - path( - "auth/session-token/", - CreateSessionTokenExperimentalApiView.as_view(), - name="token", - ), -] diff --git a/django/thunderstore/account/api/experimental/views.py b/django/thunderstore/account/api/experimental/views.py deleted file mode 100644 index aace61353..000000000 --- a/django/thunderstore/account/api/experimental/views.py +++ /dev/null @@ -1,17 +0,0 @@ -from rest_framework.authentication import SessionAuthentication -from rest_framework.authtoken.models import Token -from rest_framework.permissions import IsAuthenticated -from rest_framework.response import Response -from rest_framework.views import APIView - - -class CreateSessionTokenExperimentalApiView(APIView): - authentication_classes = [SessionAuthentication] - permission_classes = [IsAuthenticated] - - def get(self, request, format=None): - return Response( - { - "token": request.session.session_key, - }, - ) diff --git a/django/thunderstore/core/api_urls.py b/django/thunderstore/core/api_urls.py index ba397efa6..625bb0d2e 100644 --- a/django/thunderstore/core/api_urls.py +++ b/django/thunderstore/core/api_urls.py @@ -1,6 +1,5 @@ from django.urls import include, path -from thunderstore.account.api.experimental.urls import urls as account_experimental_urls from thunderstore.community.api.experimental.urls import ( urls as community_experimental_urls, ) @@ -21,10 +20,6 @@ "", include(community_experimental_urls), ), - path( - "", - include(account_experimental_urls), - ), ] api_urls = [ From 0a5b087885168a4bec951d1a0c3a7dcdfc64cee6 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 21 Mar 2021 12:57:01 +0000 Subject: [PATCH 17/23] Set HTTPOnly to False for session cookie --- django/thunderstore/core/settings.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/django/thunderstore/core/settings.py b/django/thunderstore/core/settings.py index 53d69d979..80ec2f1a9 100644 --- a/django/thunderstore/core/settings.py +++ b/django/thunderstore/core/settings.py @@ -258,6 +258,11 @@ def load_db_certs(): USE_TZ = True +# Sessions + +# Session cookie used by React components during Django React transition +SESSION_COOKIE_HTTPONLY = False + # Celery CELERY_BROKER_URL = env.str("CELERY_BROKER_URL") From ade83fc52928adbdb38a3db654046faaa1711b9f Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 21 Mar 2021 14:37:01 +0000 Subject: [PATCH 18/23] Add pagination to community endpoints --- .../community/api/experimental/views.py | 93 +++++++++++++++---- 1 file changed, 76 insertions(+), 17 deletions(-) diff --git a/django/thunderstore/community/api/experimental/views.py b/django/thunderstore/community/api/experimental/views.py index a83fc3a9f..fa712db69 100644 --- a/django/thunderstore/community/api/experimental/views.py +++ b/django/thunderstore/community/api/experimental/views.py @@ -1,6 +1,8 @@ -from django.shortcuts import get_object_or_404 +from collections import OrderedDict + +from rest_framework.generics import ListAPIView, get_object_or_404 +from rest_framework.pagination import CursorPagination from rest_framework.response import Response -from rest_framework.views import APIView from thunderstore.community.api.experimental.serializers import ( CommunitySerializer, @@ -9,23 +11,80 @@ from thunderstore.community.models import Community -class CommunitiesExperimentalApiView(APIView): - def get(self, request, format=None): - communities = CommunitySerializer(Community.objects.listed(), many=True) +class CustomCursorPagination(CursorPagination): + ordering = "-datetime_created" + results_name = "results" + page_size = 100 + + def get_paginated_response(self, data) -> Response: return Response( - { - "communities": communities.data, - }, + OrderedDict( + [ + ( + "pagination", + OrderedDict( + [ + ("next_link", self.get_next_link()), + ("previous_link", self.get_previous_link()), + ], + ), + ), + (self.results_name, data), + ], + ), ) - -class PackageCategoriesExperimentalApiView(APIView): - def get(self, request, format=None, **kwargs): - community_identifier = kwargs["community"] - community = get_object_or_404(Community, identifier=community_identifier) - communities = PackageCategorySerializer(community.package_categories, many=True) + def get_unpaginated_response(self, data) -> Response: return Response( - { - "packageCategories": communities.data, - }, + Response( + OrderedDict( + [ + ("pagination", {}), + (self.results_name, data), + ], + ), + ), ) + + +class CustomListAPIView(ListAPIView): + pagination_class = CustomCursorPagination + paginator: CustomCursorPagination + + def get_unpaginated_response(self, data): + return self.paginator.get_unpaginated_response(data) + + def list(self, request, *args, **kwargs): + queryset = self.filter_queryset(self.get_queryset()) + + page = self.paginate_queryset(queryset) + if page is not None: + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) + + serializer = self.get_serializer(queryset, many=True) + return self.get_unpaginated_response(serializer.data) + + +class CommunitiesPagination(CustomCursorPagination): + results_name = "communities" + + +class CommunitiesExperimentalApiView(CustomListAPIView): + pagination_class = CommunitiesPagination + queryset = Community.objects.listed() + serializer_class = CommunitySerializer + + +class PackageCategoriesPagination(CustomCursorPagination): + results_name = "packageCategories" + + +class PackageCategoriesExperimentalApiView(CustomListAPIView): + pagination_class = PackageCategoriesPagination + serializer_class = PackageCategorySerializer + + def get_queryset(self): + community_identifier = self.kwargs.get("community") + community = get_object_or_404(Community, identifier=community_identifier) + return community.package_categories From c574695f85bbc5718c60c4c24115a7dfc20fd404 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 21 Mar 2021 16:26:56 +0000 Subject: [PATCH 19/23] Use snake case for API response --- .../api/experimental/tests/test_api_categories_list.py | 2 +- django/thunderstore/community/api/experimental/views.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py b/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py index e589aa0c2..ecdd10321 100644 --- a/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py +++ b/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py @@ -13,7 +13,7 @@ def test_api_experimental_categories_list( HTTP_ACCEPT="application/json", ) assert response.status_code == 200 - assert isinstance(response.json()["packageCategories"], list) + assert isinstance(response.json()["package_categories"], list) @pytest.mark.django_db diff --git a/django/thunderstore/community/api/experimental/views.py b/django/thunderstore/community/api/experimental/views.py index fa712db69..c1992a8e7 100644 --- a/django/thunderstore/community/api/experimental/views.py +++ b/django/thunderstore/community/api/experimental/views.py @@ -77,7 +77,7 @@ class CommunitiesExperimentalApiView(CustomListAPIView): class PackageCategoriesPagination(CustomCursorPagination): - results_name = "packageCategories" + results_name = "package_categories" class PackageCategoriesExperimentalApiView(CustomListAPIView): From a87d013e606e44e6e851319b5d47935993f22951 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sun, 21 Mar 2021 16:30:30 +0000 Subject: [PATCH 20/23] Add package upload info --- .../experimental/tests/test_api_experimental.py | 14 ++++++++++++++ .../repository/api/experimental/views.py | 4 ++++ 2 files changed, 18 insertions(+) diff --git a/django/thunderstore/repository/api/experimental/tests/test_api_experimental.py b/django/thunderstore/repository/api/experimental/tests/test_api_experimental.py index f9109ea86..01ad965ca 100644 --- a/django/thunderstore/repository/api/experimental/tests/test_api_experimental.py +++ b/django/thunderstore/repository/api/experimental/tests/test_api_experimental.py @@ -210,3 +210,17 @@ def test_api_experimental_upload_package_fail_invalid_category( name = "name" version = "1.0.0" assert PackageReference(namespace, name, version).exists is False + + +@pytest.mark.django_db +def test_api_experimental_package_upload_info( + api_client, + user, +): + api_client.force_authenticate(user=user) + response = api_client.get( + "/api/experimental/package/upload/", + HTTP_ACCEPT="application/json", + ) + assert response.status_code == 200 + assert response.json()["max_package_size_bytes"] == 524288000 diff --git a/django/thunderstore/repository/api/experimental/views.py b/django/thunderstore/repository/api/experimental/views.py index be1365e45..b833b81ef 100644 --- a/django/thunderstore/repository/api/experimental/views.py +++ b/django/thunderstore/repository/api/experimental/views.py @@ -16,6 +16,7 @@ ) from thunderstore.repository.models import Package, PackageVersion from thunderstore.repository.package_reference import PackageReference +from thunderstore.repository.package_upload import MAX_PACKAGE_SIZE def get_package_queryset() -> "QuerySet[Package]": @@ -145,6 +146,9 @@ class UploadPackageApiView(APIView): parser_classes = [MultiPartParser] permission_classes = [permissions.IsAuthenticated] + def get(self, request): + return Response({"max_package_size_bytes": MAX_PACKAGE_SIZE}) + def post(self, request): serializer = PackageUploadSerializerExperiemental( data=request.data, From d8ef38cc4fde6637f5ab8b88b9899a9757a6eca2 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 26 Mar 2021 22:02:32 +0000 Subject: [PATCH 21/23] Remove get_unpaginated_response --- .../community/api/experimental/views.py | 24 ++++--------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/django/thunderstore/community/api/experimental/views.py b/django/thunderstore/community/api/experimental/views.py index c1992a8e7..a766b0959 100644 --- a/django/thunderstore/community/api/experimental/views.py +++ b/django/thunderstore/community/api/experimental/views.py @@ -34,36 +34,20 @@ def get_paginated_response(self, data) -> Response: ), ) - def get_unpaginated_response(self, data) -> Response: - return Response( - Response( - OrderedDict( - [ - ("pagination", {}), - (self.results_name, data), - ], - ), - ), - ) - class CustomListAPIView(ListAPIView): pagination_class = CustomCursorPagination paginator: CustomCursorPagination - def get_unpaginated_response(self, data): - return self.paginator.get_unpaginated_response(data) - def list(self, request, *args, **kwargs): queryset = self.filter_queryset(self.get_queryset()) page = self.paginate_queryset(queryset) - if page is not None: - serializer = self.get_serializer(page, many=True) - return self.get_paginated_response(serializer.data) + if page is None: + raise ValueError("Pagination not set") - serializer = self.get_serializer(queryset, many=True) - return self.get_unpaginated_response(serializer.data) + serializer = self.get_serializer(page, many=True) + return self.get_paginated_response(serializer.data) class CommunitiesPagination(CustomCursorPagination): From c6a427bb72c85f3e6159ee9cff96f601edce36c6 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Fri, 26 Mar 2021 22:03:44 +0000 Subject: [PATCH 22/23] Use results as key for list views --- .../experimental/tests/test_api_categories_list.py | 2 +- .../experimental/tests/test_api_communities_list.py | 2 +- .../thunderstore/community/api/experimental/views.py | 12 ++---------- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py b/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py index ecdd10321..9614377d3 100644 --- a/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py +++ b/django/thunderstore/community/api/experimental/tests/test_api_categories_list.py @@ -13,7 +13,7 @@ def test_api_experimental_categories_list( HTTP_ACCEPT="application/json", ) assert response.status_code == 200 - assert isinstance(response.json()["package_categories"], list) + assert isinstance(response.json()["results"], list) @pytest.mark.django_db diff --git a/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py b/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py index 3221dfbc0..750a17622 100644 --- a/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py +++ b/django/thunderstore/community/api/experimental/tests/test_api_communities_list.py @@ -10,4 +10,4 @@ def test_api_experimental_communities_list( HTTP_ACCEPT="application/json", ) assert response.status_code == 200 - assert isinstance(response.json()["communities"], list) + assert isinstance(response.json()["results"], list) diff --git a/django/thunderstore/community/api/experimental/views.py b/django/thunderstore/community/api/experimental/views.py index a766b0959..516f65343 100644 --- a/django/thunderstore/community/api/experimental/views.py +++ b/django/thunderstore/community/api/experimental/views.py @@ -50,22 +50,14 @@ def list(self, request, *args, **kwargs): return self.get_paginated_response(serializer.data) -class CommunitiesPagination(CustomCursorPagination): - results_name = "communities" - - class CommunitiesExperimentalApiView(CustomListAPIView): - pagination_class = CommunitiesPagination + pagination_class = CustomCursorPagination queryset = Community.objects.listed() serializer_class = CommunitySerializer -class PackageCategoriesPagination(CustomCursorPagination): - results_name = "package_categories" - - class PackageCategoriesExperimentalApiView(CustomListAPIView): - pagination_class = PackageCategoriesPagination + pagination_class = CustomCursorPagination serializer_class = PackageCategorySerializer def get_queryset(self): From ce66a86d77b78745a2ba7d232df88ef36b4ca550 Mon Sep 17 00:00:00 2001 From: Nihaal Sangha Date: Sat, 27 Mar 2021 19:08:25 +0000 Subject: [PATCH 23/23] Fix current-user teams being nested list --- django/thunderstore/social/api/experimental/views.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django/thunderstore/social/api/experimental/views.py b/django/thunderstore/social/api/experimental/views.py index c7f2b8a26..7f9037a06 100644 --- a/django/thunderstore/social/api/experimental/views.py +++ b/django/thunderstore/social/api/experimental/views.py @@ -19,6 +19,7 @@ def get(self, request, format=None): "package" ).values_list("package__uuid4", flat=True) teams = request.user.uploader_identities.values_list("identity__name") + teams = [team[0] for team in teams] return Response( { "username": username,