diff --git a/README.creole b/README.creole index b71bc1c..4d8f3d1 100644 --- a/README.creole +++ b/README.creole @@ -187,6 +187,7 @@ Files are separated into: "/src/" and "/development/" == history * [[https://github.com/jedie/PyInventory/compare/v0.7.0...master|compare v0.7.0...master]] **dev** +** Outsource the "MEDIA file serve" part into [[https://github.com/jedie/django-tools/tree/master/django_tools/serve_media_app#readme|django.tools.serve_media_app]] ** tbc * [[https://github.com/jedie/PyInventory/compare/v0.6.0...v0.7.0|v0.7.0 - 23.11.2020]] ** Change deployment setup: diff --git a/README.rst b/README.rst index 896fd2b..45020ea 100644 --- a/README.rst +++ b/README.rst @@ -254,6 +254,8 @@ history * `compare v0.7.0...master `_ **dev** + * Outsource the "MEDIA file serve" part into `django.tools.serve_media_app `_ + * tbc * `v0.7.0 - 23.11.2020 `_ @@ -375,4 +377,4 @@ donation ------------ -``Note: this file is generated from README.creole 2020-11-23 17:53:10 with "python-creole"`` \ No newline at end of file +``Note: this file is generated from README.creole 2020-12-06 19:12:25 with "python-creole"`` \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index eeb3c23..09354c1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -98,7 +98,7 @@ python-versions = "*" [[package]] name = "certifi" -version = "2020.11.8" +version = "2020.12.5" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false @@ -106,7 +106,7 @@ python-versions = "*" [[package]] name = "cffi" -version = "1.14.3" +version = "1.14.4" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -249,7 +249,7 @@ Django = ">=1.8,<3.2" [[package]] name = "django-axes" -version = "5.9.0" +version = "5.9.1" description = "Keep track of failed login attempts in Django-powered sites." category = "main" optional = false @@ -285,11 +285,11 @@ six = "*" [[package]] name = "django-debug-toolbar" -version = "3.1.1" +version = "3.2" description = "A configurable set of panels that display various debug information about the current request/response." category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] Django = ">=2.2" @@ -361,14 +361,14 @@ django-reversion = "*" [[package]] name = "django-tagulous" -version = "1.0.0" +version = "1.1.0" description = "Fabulous Tagging for Django" category = "main" optional = false python-versions = "*" [package.dependencies] -Django = ">=1.11" +Django = ">=2.2" [package.extras] dev = ["tox", "jasmine"] @@ -377,11 +377,11 @@ i18n = ["unidecode"] [[package]] name = "django-tools" -version = "0.46.1" +version = "0.48.2" description = "miscellaneous tools for django" category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6,<4.0.0" [package.dependencies] bleach = "*" @@ -493,7 +493,7 @@ pyflakes = ">=2.2.0,<2.3.0" [[package]] name = "flynt" -version = "0.57" +version = "0.58" description = "CLI tool to convert a python project's %-formatted strings to f-strings." category = "dev" optional = false @@ -534,7 +534,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "2.0.0" +version = "2.1.1" description = "Read metadata from Python packages" category = "main" optional = false @@ -545,7 +545,7 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +testing = ["packaging", "pep517", "unittest2", "importlib-resources (>=1.3)"] [[package]] name = "iniconfig" @@ -675,7 +675,7 @@ jdcal = "*" [[package]] name = "packaging" -version = "20.4" +version = "20.7" description = "Core utilities for Python packages" category = "main" optional = false @@ -683,7 +683,6 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.dependencies] pyparsing = ">=2.0.2" -six = "*" [[package]] name = "paramiko" @@ -799,7 +798,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.7.2" +version = "2.7.3" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -977,7 +976,7 @@ version = "5.3.1" description = "YAML parser and emitter for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "*" [[package]] name = "readme-renderer" @@ -1038,15 +1037,15 @@ idna2008 = ["idna"] [[package]] name = "secretstorage" -version = "3.2.0" +version = "3.3.0" description = "Python bindings to FreeDesktop.org Secret Service API" category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] cryptography = ">=2.0" -jeepney = ">=0.4.2" +jeepney = ">=0.6" [[package]] name = "selenium" @@ -1077,11 +1076,11 @@ python-versions = ">=3.5" [[package]] name = "tablib" -version = "2.0.0" +version = "3.0.0" description = "Format agnostic tabular data library (XLS, JSON, YAML, CSV)" category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [package.dependencies] markuppy = {version = "*", optional = true, markers = "extra == \"html\""} @@ -1158,7 +1157,7 @@ testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psu [[package]] name = "tqdm" -version = "4.53.0" +version = "4.54.1" description = "Fast, Extensible Progress Meter" category = "dev" optional = false @@ -1272,7 +1271,7 @@ postgres = ["psycopg2-binary"] [metadata] lock-version = "1.1" python-versions = ">=3.7,<4.0.0" -content-hash = "bb178e486925b95face37987e21f66c19a2e82194a0bc508d1c69eda4f105ce3" +content-hash = "53350bdeb15638ddf111098e991f6ef65c9426369c0c29385fa6bbd303b6d1ec" [metadata.files] appdirs = [ @@ -1316,46 +1315,46 @@ cached-property = [ {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, ] certifi = [ - {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, - {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, ] cffi = [ - {file = "cffi-1.14.3-2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3eeeb0405fd145e714f7633a5173318bd88d8bbfc3dd0a5751f8c4f70ae629bc"}, - {file = "cffi-1.14.3-2-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:cb763ceceae04803adcc4e2d80d611ef201c73da32d8f2722e9d0ab0c7f10768"}, - {file = "cffi-1.14.3-2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f60519595eaca110f248e5017363d751b12782a6f2bd6a7041cba275215f5d"}, - {file = "cffi-1.14.3-2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c53af463f4a40de78c58b8b2710ade243c81cbca641e34debf3396a9640d6ec1"}, - {file = "cffi-1.14.3-2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:33c6cdc071ba5cd6d96769c8969a0531be2d08c2628a0143a10a7dcffa9719ca"}, - {file = "cffi-1.14.3-2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c11579638288e53fc94ad60022ff1b67865363e730ee41ad5e6f0a17188b327a"}, - {file = "cffi-1.14.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3cb3e1b9ec43256c4e0f8d2837267a70b0e1ca8c4f456685508ae6106b1f504c"}, - {file = "cffi-1.14.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f0620511387790860b249b9241c2f13c3a80e21a73e0b861a2df24e9d6f56730"}, - {file = "cffi-1.14.3-cp27-cp27m-win32.whl", hash = "sha256:005f2bfe11b6745d726dbb07ace4d53f057de66e336ff92d61b8c7e9c8f4777d"}, - {file = "cffi-1.14.3-cp27-cp27m-win_amd64.whl", hash = "sha256:2f9674623ca39c9ebe38afa3da402e9326c245f0f5ceff0623dccdac15023e05"}, - {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:09e96138280241bd355cd585148dec04dbbedb4f46128f340d696eaafc82dd7b"}, - {file = "cffi-1.14.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:3363e77a6176afb8823b6e06db78c46dbc4c7813b00a41300a4873b6ba63b171"}, - {file = "cffi-1.14.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:0ef488305fdce2580c8b2708f22d7785ae222d9825d3094ab073e22e93dfe51f"}, - {file = "cffi-1.14.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:0b1ad452cc824665ddc682400b62c9e4f5b64736a2ba99110712fdee5f2505c4"}, - {file = "cffi-1.14.3-cp35-cp35m-win32.whl", hash = "sha256:85ba797e1de5b48aa5a8427b6ba62cf69607c18c5d4eb747604b7302f1ec382d"}, - {file = "cffi-1.14.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e66399cf0fc07de4dce4f588fc25bfe84a6d1285cc544e67987d22663393926d"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:15f351bed09897fbda218e4db5a3d5c06328862f6198d4fb385f3e14e19decb3"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4d7c26bfc1ea9f92084a1d75e11999e97b62d63128bcc90c3624d07813c52808"}, - {file = "cffi-1.14.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:23e5d2040367322824605bc29ae8ee9175200b92cb5483ac7d466927a9b3d537"}, - {file = "cffi-1.14.3-cp36-cp36m-win32.whl", hash = "sha256:a624fae282e81ad2e4871bdb767e2c914d0539708c0f078b5b355258293c98b0"}, - {file = "cffi-1.14.3-cp36-cp36m-win_amd64.whl", hash = "sha256:de31b5164d44ef4943db155b3e8e17929707cac1e5bd2f363e67a56e3af4af6e"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f92cdecb618e5fa4658aeb97d5eb3d2f47aa94ac6477c6daf0f306c5a3b9e6b1"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:22399ff4870fb4c7ef19fff6eeb20a8bbf15571913c181c78cb361024d574579"}, - {file = "cffi-1.14.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f4eae045e6ab2bb54ca279733fe4eb85f1effda392666308250714e01907f394"}, - {file = "cffi-1.14.3-cp37-cp37m-win32.whl", hash = "sha256:b0358e6fefc74a16f745afa366acc89f979040e0cbc4eec55ab26ad1f6a9bfbc"}, - {file = "cffi-1.14.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6642f15ad963b5092d65aed022d033c77763515fdc07095208f15d3563003869"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2791f68edc5749024b4722500e86303a10d342527e1e3bcac47f35fbd25b764e"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:529c4ed2e10437c205f38f3691a68be66c39197d01062618c55f74294a4a4828"}, - {file = "cffi-1.14.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f0f1e499e4000c4c347a124fa6a27d37608ced4fe9f7d45070563b7c4c370c9"}, - {file = "cffi-1.14.3-cp38-cp38-win32.whl", hash = "sha256:3b8eaf915ddc0709779889c472e553f0d3e8b7bdf62dab764c8921b09bf94522"}, - {file = "cffi-1.14.3-cp38-cp38-win_amd64.whl", hash = "sha256:bbd2f4dfee1079f76943767fce837ade3087b578aeb9f69aec7857d5bf25db15"}, - {file = "cffi-1.14.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cc75f58cdaf043fe6a7a6c04b3b5a0e694c6a9e24050967747251fb80d7bce0d"}, - {file = "cffi-1.14.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:bf39a9e19ce7298f1bd6a9758fa99707e9e5b1ebe5e90f2c3913a47bc548747c"}, - {file = "cffi-1.14.3-cp39-cp39-win32.whl", hash = "sha256:d80998ed59176e8cba74028762fbd9b9153b9afc71ea118e63bbf5d4d0f9552b"}, - {file = "cffi-1.14.3-cp39-cp39-win_amd64.whl", hash = "sha256:c150eaa3dadbb2b5339675b88d4573c1be3cb6f2c33a6c83387e10cc0bf05bd3"}, - {file = "cffi-1.14.3.tar.gz", hash = "sha256:f92f789e4f9241cd262ad7a555ca2c648a98178a953af117ef7fad46aa1d5591"}, + {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-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"}, ] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, @@ -1363,6 +1362,7 @@ chardet = [ ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] colorlog = [ {file = "colorlog-4.6.2-py2.py3-none-any.whl", hash = "sha256:edd5ada5de03e880e42b2526f8be5570fd9b692f8eb7cf6b1fdcac3e3fb23976"}, @@ -1456,8 +1456,8 @@ django-admin-sortable2 = [ {file = "django-admin-sortable2-0.7.7.tar.gz", hash = "sha256:65c8a02300e178b4a02c904b6f4dce6e528c58f5ecab3907dfba3540da51b862"}, ] django-axes = [ - {file = "django-axes-5.9.0.tar.gz", hash = "sha256:320ddc577387b1b7926468b9313fd8048f86b70e35a02faa858cbac003900374"}, - {file = "django_axes-5.9.0-py3-none-any.whl", hash = "sha256:25827cd722b006845e9abd5ecbfba92ebad3935a29258d457158212d4e1f0ded"}, + {file = "django-axes-5.9.1.tar.gz", hash = "sha256:62be89424a30e59fc6e45e5d29bab84feca711472e81ae5275951a01a8174586"}, + {file = "django_axes-5.9.1-py3-none-any.whl", hash = "sha256:a0b54a60fd5e5de78cb41788d5d4a7d13d23b9cb35fe0c4223f2f9a741511b52"}, ] django-ckeditor = [ {file = "django-ckeditor-6.0.0.tar.gz", hash = "sha256:29fd1a333cb9741ac2c3fd4e427a5c00115ed33a2389716a09af7656022dcdde"}, @@ -1467,8 +1467,8 @@ django-dbbackup = [ {file = "django-dbbackup-3.3.0.tar.gz", hash = "sha256:bb109735cae98b64ad084e5b461b7aca2d7b39992f10c9ed9435e3ebb6fb76c8"}, ] django-debug-toolbar = [ - {file = "django-debug-toolbar-3.1.1.tar.gz", hash = "sha256:c97921a9cd421d392e7860dc4b464db8e06c8628df4dc58fedab012888c293c6"}, - {file = "django_debug_toolbar-3.1.1-py3-none-any.whl", hash = "sha256:a1ce0665f7ef47d27b8df4b5d1058748e1f08500a01421a30d35164f38aaaf4c"}, + {file = "django-debug-toolbar-3.2.tar.gz", hash = "sha256:84e2607d900dbd571df0a2acf380b47c088efb787dce9805aefeb407341961d2"}, + {file = "django_debug_toolbar-3.2-py3-none-any.whl", hash = "sha256:9e5a25d0c965f7e686f6a8ba23613ca9ca30184daa26487706d4829f5cfb697a"}, ] django-import-export = [ {file = "django-import-export-2.4.0.tar.gz", hash = "sha256:401d76eca0a5c6cf43bffed16c06e509b9044ce8f6bcff264b776e3952830f1a"}, @@ -1494,11 +1494,12 @@ django-reversion-compare = [ {file = "django_reversion_compare-0.12.2-py3-none-any.whl", hash = "sha256:5ce8d402add477a3c38aae8335af22b3abdfffa83ef5333c06c865abb89e9cbd"}, ] django-tagulous = [ - {file = "django-tagulous-1.0.0.tar.gz", hash = "sha256:9b4fa1773845a1cf33d21b27f9cdafc6f3fe29a480428bdd8f8717e7d4742396"}, + {file = "django-tagulous-1.1.0.tar.gz", hash = "sha256:9bc9d1d066c486fac1a3ec351531e440bc239c459b043e9180d99d7846e45fd6"}, + {file = "django_tagulous-1.1.0-py3-none-any.whl", hash = "sha256:de2a56ed92374b79358275ac0b7910af2c3d2823f44a847bef91ca9e456353ba"}, ] django-tools = [ - {file = "django-tools-0.46.1.tar.gz", hash = "sha256:0a289c230d908417a0a72d1a7884ebc0508894b1ac7be888ed333170d4c97291"}, - {file = "django_tools-0.46.1-py3-none-any.whl", hash = "sha256:e10c13b382b14ecfb589fd194719d44210a26a542869cbb298e0c2a1ede7f90d"}, + {file = "django-tools-0.48.2.tar.gz", hash = "sha256:76965bb71f70965fb7b56152836e76116c02e74b81635cf0eda2819d4ad594e9"}, + {file = "django_tools-0.48.2-py3-none-any.whl", hash = "sha256:0d4d141a5f20df79139c17279a95a022aad4f2fa4eb8236d8ab61c358c7206ef"}, ] docker = [ {file = "docker-4.4.0-py2.py3-none-any.whl", hash = "sha256:317e95a48c32de8c1aac92a48066a5b73e218ed096e03758bcdd799a7130a1a1"}, @@ -1530,8 +1531,8 @@ flake8 = [ {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, ] flynt = [ - {file = "flynt-0.57-py3-none-any.whl", hash = "sha256:b99e8a172162b77518a5fd2d4ef64b9498d9e60d79b6fef3e9b5546e4b649c46"}, - {file = "flynt-0.57.tar.gz", hash = "sha256:14c68ca85c852092a64c9b8f7ccdb8e9acd36c4d9d58acc99344314fd90e20c9"}, + {file = "flynt-0.58-py3-none-any.whl", hash = "sha256:0630c2f80ae9afa3c7e75b64cd3cc2c2c8fecd8ad87802a168598abe22824699"}, + {file = "flynt-0.58.tar.gz", hash = "sha256:7b74e02a7f902986e819b11d185078b701dc58ce00441dba5f151a7f560ff4da"}, ] gunicorn = [ {file = "gunicorn-20.0.4-py2.py3-none-any.whl", hash = "sha256:cd4a810dd51bf497552cf3f863b575dabd73d6ad6a91075b65936b151cbf4f9c"}, @@ -1545,10 +1546,11 @@ idna = [ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] importlib-metadata = [ - {file = "importlib_metadata-2.0.0-py2.py3-none-any.whl", hash = "sha256:cefa1a2f919b866c5beb7c9f7b0ebb4061f30a8a9bf16d609b000e2dfaceb9c3"}, - {file = "importlib_metadata-2.0.0.tar.gz", hash = "sha256:77a540690e24b0305878c37ffd421785a6f7e53c8b5720d211b211de8d0e95da"}, + {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, + {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, ] iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] isort = [ @@ -1591,8 +1593,8 @@ openpyxl = [ {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"}, ] packaging = [ - {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, - {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, + {file = "packaging-20.7-py2.py3-none-any.whl", hash = "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376"}, + {file = "packaging-20.7.tar.gz", hash = "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236"}, ] paramiko = [ {file = "paramiko-2.7.2-py2.py3-none-any.whl", hash = "sha256:4f3e316fef2ac628b05097a637af35685183111d4bc1b5979bd397c2ab7b5898"}, @@ -1678,6 +1680,8 @@ psycopg2-binary = [ {file = "psycopg2_binary-2.8.6-cp39-cp39-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:89705f45ce07b2dfa806ee84439ec67c5d9a0ef20154e0e475e2b2ed392a5b83"}, {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:42ec1035841b389e8cc3692277a0bd81cdfe0b65d575a2c8862cec7a80e62e52"}, {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7312e931b90fe14f925729cde58022f5d034241918a5c4f9797cac62f6b3a9dd"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-win32.whl", hash = "sha256:6422f2ff0919fd720195f64ffd8f924c1395d30f9a495f31e2392c2efafb5056"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:15978a1fbd225583dd8cdaf37e67ccc278b5abecb4caf6b2d6b8e2b948e953f6"}, ] py = [ {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, @@ -1696,8 +1700,8 @@ pyflakes = [ {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, ] pygments = [ - {file = "Pygments-2.7.2-py3-none-any.whl", hash = "sha256:88a0bbcd659fcb9573703957c6b9cff9fab7295e6e76db54c9d00ae42df32773"}, - {file = "Pygments-2.7.2.tar.gz", hash = "sha256:381985fcc551eb9d37c52088a32914e00517e57f4a21609f48141ba08e193fa0"}, + {file = "Pygments-2.7.3-py3-none-any.whl", hash = "sha256:f275b6c0909e5dafd2d6269a656aa90fa58ebf4a74f8fcf9053195d226b24a08"}, + {file = "Pygments-2.7.3.tar.gz", hash = "sha256:ccf3acacf3782cbed4a989426012f1c535c9a90d3a7fc3f16d231b9372d2b716"}, ] pynacl = [ {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, @@ -1810,8 +1814,8 @@ rfc3986 = [ {file = "rfc3986-1.4.0.tar.gz", hash = "sha256:112398da31a3344dc25dbf477d8df6cb34f9278a94fee2625d89e4514be8bb9d"}, ] secretstorage = [ - {file = "SecretStorage-3.2.0-py3-none-any.whl", hash = "sha256:ed5279d788af258e4676fa26b6efb6d335a31f1f9f529b6f1e200f388fac33e1"}, - {file = "SecretStorage-3.2.0.tar.gz", hash = "sha256:46305c3847ee3f7252b284e0eee5590fa6341c891104a2fd2313f8798c615a82"}, + {file = "SecretStorage-3.3.0-py3-none-any.whl", hash = "sha256:5c36f6537a523ec5f969ef9fad61c98eb9e017bc601d811e53aa25bece64892f"}, + {file = "SecretStorage-3.3.0.tar.gz", hash = "sha256:30cfdef28829dad64d6ea1ed08f8eff6aa115a77068926bcc9f5225d5a3246aa"}, ] selenium = [ {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"}, @@ -1826,8 +1830,8 @@ sqlparse = [ {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"}, ] tablib = [ - {file = "tablib-2.0.0-py3-none-any.whl", hash = "sha256:c5a77c96ad306d5b380def1309d521ad5e98b4f83726f84857ad87e142d13279"}, - {file = "tablib-2.0.0.tar.gz", hash = "sha256:8cc2fa10bc37219ac5e76850eb7fbd50de313c7a1a7895c44af2a8dd206b7be7"}, + {file = "tablib-3.0.0-py3-none-any.whl", hash = "sha256:41aa40981cddd7ec4d1fabeae7c38d271601b306386bd05b5c3bcae13e5aeb20"}, + {file = "tablib-3.0.0.tar.gz", hash = "sha256:f83cac08454f225a34a305daa20e2110d5e6335135d505f93bc66583a5f9c10d"}, ] tblib = [ {file = "tblib-1.7.0-py2.py3-none-any.whl", hash = "sha256:289fa7359e580950e7d9743eab36b0691f0310fce64dee7d9c31065b8f723e23"}, @@ -1850,8 +1854,8 @@ tox = [ {file = "tox-3.20.1.tar.gz", hash = "sha256:4321052bfe28f9d85082341ca8e233e3ea901fdd14dab8a5d3fbd810269fbaf6"}, ] tqdm = [ - {file = "tqdm-4.53.0-py2.py3-none-any.whl", hash = "sha256:5ff3f5232b19fa4c5531641e480b7fad4598819f708a32eb815e6ea41c5fa313"}, - {file = "tqdm-4.53.0.tar.gz", hash = "sha256:3d3f1470d26642e88bd3f73353cb6ff4c51ef7d5d7efef763238f4bc1f7e4e81"}, + {file = "tqdm-4.54.1-py2.py3-none-any.whl", hash = "sha256:d4f413aecb61c9779888c64ddf0c62910ad56dcbe857d8922bb505d4dbff0df1"}, + {file = "tqdm-4.54.1.tar.gz", hash = "sha256:38b658a3e4ecf9b4f6f8ff75ca16221ae3378b2e175d846b6b33ea3a20852cf5"}, ] twine = [ {file = "twine-3.2.0-py3-none-any.whl", hash = "sha256:ba9ff477b8d6de0c89dd450e70b2185da190514e91c42cc62f96850025c10472"}, diff --git a/pyproject.toml b/pyproject.toml index 2366f22..623ad65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -44,7 +44,7 @@ django-processinfo = "*" # https://github.com/jedie/django-processinfo/ django-debug-toolbar = "*" # http://django-debug-toolbar.readthedocs.io/en/stable/changes.html django-import-export = "*" # https://github.com/django-import-export/django-import-export django-dbbackup = "*" # https://github.com/django-dbbackup/django-dbbackup -django-tools = "*" # https://github.com/jedie/django-tools/ +django-tools = ">=0.48.2" # https://github.com/jedie/django-tools/ django-reversion-compare = "*" # https://github.com/jedie/django-reversion-compare/ django-ckeditor = "*" # https://github.com/django-ckeditor/django-ckeditor diff --git a/src/inventory/migrations/0005_serve_uploads_by_django_tools.py b/src/inventory/migrations/0005_serve_uploads_by_django_tools.py new file mode 100644 index 0000000..0f4c1d5 --- /dev/null +++ b/src/inventory/migrations/0005_serve_uploads_by_django_tools.py @@ -0,0 +1,74 @@ +# Generated by Django 2.2.17 on 2020-12-06 14:07 +import os +from pathlib import Path + +from django.conf import settings +from django.db import migrations +from django.utils import timezone + + +class Tee: + def __init__(self, f): + self.f = f + + def __enter__(self): + return self + + def __call__(self, line): + if not isinstance(line, str): + line = str(line) + print(line) + self.f.write(line) + self.f.write('\n') + + def __exit__(self, exc_type, exc_val, exc_tb): + pass + + +def forward_code(apps, schema_editor): + print() + log_file_path = Path(settings.MEDIA_ROOT, 'migrate.log') + print('Generate log file here:', log_file_path) + with log_file_path.open('w+') as log, Tee(log) as log: + log('-' * 100) + log(timezone.now()) + + from django_tools.serve_media_app.models import generate_media_path + ItemImageModel = apps.get_model('inventory', 'ItemImageModel') + + qs = ItemImageModel.objects.all() + + for instance in qs: + log('_' * 100) + log(f'Migrate {instance}') + user = instance.user + image = instance.image + + file_path = Path(str(image.file)) + log(f'Old path: {file_path}') + + media_path=generate_media_path(user, filename=file_path.name) + + new_file_path = Path(settings.MEDIA_ROOT, media_path) + log(f'New path: {new_file_path}') + + os.makedirs(new_file_path.parent, exist_ok=True) + os.link(file_path, new_file_path) + + instance.image = media_path + instance.save(update_fields=('image',)) + + log('All new path created via hardlinks!') + log('Old path can be deleted.') + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0004_item_user_images'), + ('serve_media_app', '0001_initial'), + ] + + operations = [ + migrations.RunPython(forward_code, reverse_code=migrations.RunPython.noop), + ] diff --git a/src/inventory/models/item.py b/src/inventory/models/item.py index fca0df7..65a37c3 100644 --- a/src/inventory/models/item.py +++ b/src/inventory/models/item.py @@ -6,8 +6,8 @@ from bx_py_utils.filename import clean_filename from ckeditor_uploader.fields import RichTextUploadingField from django.db import models from django.urls import reverse -from django.utils.crypto import get_random_string from django.utils.translation import ugettext_lazy as _ +from django_tools.serve_media_app.models import user_directory_path from inventory.models.base import BaseModel from inventory.models.links import BaseLink @@ -177,17 +177,6 @@ class ItemLinkModel(BaseLink): ordering = ('position',) -def user_directory_path(instance, filename): - """ - Upload to /MEDIA_ROOT/... - """ - random_string = get_random_string() - filename = clean_filename(filename) - filename = f'user_{instance.user.id}/{random_string}/{filename}' - logger.info(f'Upload filename: {filename!r}') - return filename - - class ItemImageModel(BaseModel): """ Store Images to Items diff --git a/src/inventory/tests/test_item_images.py b/src/inventory/tests/test_item_images.py index 7fd386b..10e575c 100644 --- a/src/inventory/tests/test_item_images.py +++ b/src/inventory/tests/test_item_images.py @@ -3,6 +3,7 @@ from unittest import mock from django.http import FileResponse from django.test import TestCase, override_settings +from django_tools.serve_media_app.models import UserMediaTokenModel from model_bakery import baker from inventory.models import ItemImageModel @@ -11,53 +12,51 @@ from inventory.tests.fixtures.users import get_normal_pyinventory_user class ItemImagesTestCase(TestCase): def test_basics(self): - pyinventory_user1 = get_normal_pyinventory_user(id=1) - pyinventory_user2 = get_normal_pyinventory_user(id=2) + with mock.patch('secrets.token_urlsafe', return_value='user1token'): + pyinventory_user1 = get_normal_pyinventory_user(id=1) - with tempfile.TemporaryDirectory() as tmpdir, override_settings(MEDIA_ROOT=tmpdir): - print(tmpdir) + with mock.patch('secrets.token_urlsafe', return_value='user2token'): + pyinventory_user2 = get_normal_pyinventory_user(id=2) - with self.assertLogs('inventory') as logs: - with mock.patch('inventory.models.item.get_random_string', return_value='DrgCCsMrdIBJ'): + token1_instance = UserMediaTokenModel.objects.get(user=pyinventory_user1) + assert repr(token1_instance) == ( + f"" + ) + token2_instance = UserMediaTokenModel.objects.get(user=pyinventory_user2) + assert repr(token2_instance) == ( + f"" + ) + + with tempfile.TemporaryDirectory() as temp: + with override_settings(MEDIA_ROOT=temp): + with mock.patch('secrets.token_urlsafe', return_value='12345678901234567890'): image_instance = baker.make( ItemImageModel, user=pyinventory_user1, _create_files=True ) + assert image_instance.image is not None url = image_instance.image.url - # url = f'/media/{image_instance.image}' - assert url == '/media/user_1/DrgCCsMrdIBJ/mock_img.jpeg' - assert logs.output == [ - "INFO:inventory.models.item:" - "Upload filename: 'user_1/DrgCCsMrdIBJ/mock_img.jpeg'" - ] + assert url == '/media/user1token/12345678901234567890/mock_img.jpeg' - # Anonymous user can't access: - - with self.assertLogs('inventory') as logs, self.assertLogs('django'): - response = self.client.get(url) + # Anonymous has no access: + response = self.client.get('/media/user1token/12345678901234567890/mock_img.jpeg') assert response.status_code == 403 - assert logs.output == [ - 'ERROR:inventory.views.media_files:Anonymous try to access files from: 1' - ] - # Wrong user should not access: - - self.client.force_login(user=pyinventory_user2) - - with self.assertLogs('inventory') as logs, self.assertLogs('django'): - response = self.client.get(url) + # Can't access with wrong user: + self.client.force_login(pyinventory_user2) + response = self.client.get('/media/user1token/12345678901234567890/mock_img.jpeg') assert response.status_code == 403 - assert logs.output == [ - 'ERROR:inventory.views.media_files:Wrong user ID: 2 is not 1' - ] - # The right user should access: + # Can access with the right user: + self.client.force_login(pyinventory_user1) + response = self.client.get('/media/user1token/12345678901234567890/mock_img.jpeg') + assert response.status_code == 200 + assert isinstance(response, FileResponse) + assert response.getvalue() == image_instance.image.open('rb').read() - self.client.force_login(user=pyinventory_user1) - - response = self.client.get(url) - assert response.status_code == 200 - assert isinstance(response, FileResponse) - assert response.getvalue() == image_instance.image.read() + # Test whats happen, if token was deleted + UserMediaTokenModel.objects.all().delete() + response = self.client.get('/media/user1token/12345678901234567890/mock_img.jpeg') + assert response.status_code == 400 # SuspiciousOperation -> HttpResponseBadRequest diff --git a/src/inventory/views/__init__.py b/src/inventory/views/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/src/inventory/views/media_files.py b/src/inventory/views/media_files.py deleted file mode 100644 index 875e4bf..0000000 --- a/src/inventory/views/media_files.py +++ /dev/null @@ -1,47 +0,0 @@ -import logging - -from django.conf import settings -from django.core.exceptions import PermissionDenied -from django.http import Http404 -from django.utils.translation import gettext as _ -from django.views.generic.base import View -from django.views.static import serve - -from inventory.models import ItemImageModel - - -logger = logging.getLogger(__name__) - - -class UserMediaView(View): - """ - Serve MEDIA_URL files, but check the current user: - """ - - def get(self, request, user_id, path): - media_path = f'user_{user_id}/{path}' - - if not request.user.is_superuser: - if request.user.id != user_id: - # A user tries to access a file from a other use? - if request.user.id is None: - logger.error(f'Anonymous try to access files from: {user_id!r}') - else: - logger.error(f'Wrong user ID: {request.user.id!r} is not {user_id!r}') - raise PermissionDenied - - # Check if the image really exists: - qs = ItemImageModel.objects.filter( - user_id=request.user.id, - image=media_path - ) - if not qs.exists(): - raise Http404(_('Image "%(path)s" does not exist') % {'path': media_path}) - - # Send the file to the user: - return serve( - request, - path=media_path, - document_root=settings.MEDIA_ROOT, - show_indexes=False - ) diff --git a/src/inventory_project/settings/base.py b/src/inventory_project/settings/base.py index 54ee983..00051bf 100644 --- a/src/inventory_project/settings/base.py +++ b/src/inventory_project/settings/base.py @@ -1,6 +1,6 @@ -""" +''' Base Django settings -""" +''' import logging from pathlib import Path as __Path @@ -76,6 +76,9 @@ INSTALLED_APPS = [ 'axes', # https://github.com/jazzband/django-axes 'django_processinfo', # https://github.com/jedie/django-processinfo/ + # https://github.com/jedie/django-tools/tree/master/django_tools/serve_media_app + 'django_tools.serve_media_app.apps.UserMediaFilesConfig', + 'inventory.apps.InventoryConfig', ] @@ -109,7 +112,7 @@ MIDDLEWARE = [ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - "DIRS": [str(__Path(PROJECT_PATH, 'inventory_project', 'templates'))], + 'DIRS': [str(__Path(PROJECT_PATH, 'inventory_project', 'templates'))], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -342,6 +345,7 @@ LOGGING = { '': {'handlers': ['console'], 'level': 'DEBUG', 'propagate': False}, 'django': {'handlers': ['console'], 'level': 'INFO', 'propagate': False}, 'axes': {'handlers': ['console'], 'level': 'WARNING', 'propagate': False}, + 'django_tools': {'handlers': ['console'], 'level': 'INFO', 'propagate': False}, 'inventory': {'handlers': ['console'], 'level': 'DEBUG', 'propagate': False}, }, } diff --git a/src/inventory_project/urls.py b/src/inventory_project/urls.py index 064b2fb..9c8d8bd 100644 --- a/src/inventory_project/urls.py +++ b/src/inventory_project/urls.py @@ -4,8 +4,6 @@ from django.contrib import admin from django.urls import path from django.views.generic import RedirectView -from inventory.views.media_files import UserMediaView - admin.autodiscover() @@ -15,7 +13,7 @@ urlpatterns = [ # Don't use i18n_patterns() here url(r'^$', RedirectView.as_view(url='/admin/')), path('ckeditor/', include('ckeditor_uploader.urls')), # TODO: check permissions? - path('media/user_/', UserMediaView.as_view()) + path(settings.MEDIA_URL.lstrip('/'), include('django_tools.serve_media_app.urls')), ]