From 98d62d4bf70d621c8f716ca4871724082be917bd Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Mon, 18 Jan 2021 16:52:11 +0100 Subject: [PATCH 01/10] Add pages to Books. --- tests/test_app/library/books/admin.py | 9 ++++----- .../books/migrations/0004_book_pages.py | 18 ++++++++++++++++++ tests/test_app/library/books/models.py | 1 + tests/test_app/library/factories.py | 5 +++-- 4 files changed, 26 insertions(+), 7 deletions(-) create mode 100644 tests/test_app/library/books/migrations/0004_book_pages.py diff --git a/tests/test_app/library/books/admin.py b/tests/test_app/library/books/admin.py index f92996a4..9833633b 100644 --- a/tests/test_app/library/books/admin.py +++ b/tests/test_app/library/books/admin.py @@ -6,10 +6,9 @@ from django.utils.timesince import timesince from import_export.admin import ImportExportMixin -from .models import Book, Author, Genre -from .resources import BookResource - from ..loans.admin import BookLoanInline +from .models import Author, Book, Genre +from .resources import BookResource admin.site.unregister(User) @@ -23,10 +22,10 @@ class BookAdmin(ImportExportMixin, admin.ModelAdmin): resource_class = BookResource fieldsets = ( ("general", {"fields": ("title", "author", "library")}), - ("other", {"fields": ("genre", "summary", "isbn", "published_on")}), + ("other", {"fields": ("genre", "summary", "isbn", "published_on", "pages")}), ) raw_id_fields = ("author",) - list_display = ("__str__", "title", "author") + list_display = ("__str__", "title", "author", "pages") readonly_fields = ("__str__",) list_display_links = () list_filter = ("author", "genre") diff --git a/tests/test_app/library/books/migrations/0004_book_pages.py b/tests/test_app/library/books/migrations/0004_book_pages.py new file mode 100644 index 00000000..bc8897cc --- /dev/null +++ b/tests/test_app/library/books/migrations/0004_book_pages.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.5 on 2021-01-18 15:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("books", "0003_auto_20201015_1222"), + ] + + operations = [ + migrations.AddField( + model_name="book", + name="pages", + field=models.IntegerField(null=True), + ), + ] diff --git a/tests/test_app/library/books/models.py b/tests/test_app/library/books/models.py index 53566304..0215e9f9 100644 --- a/tests/test_app/library/books/models.py +++ b/tests/test_app/library/books/models.py @@ -23,6 +23,7 @@ class Book(models.Model): ) genre = models.ManyToManyField(Genre, help_text="Select a genre for this book") published_on = models.DateField() + pages = models.IntegerField(null=True) def get_absolute_url(self): return reverse("admin:books_book_change", args=(self.id,)) diff --git a/tests/test_app/library/factories.py b/tests/test_app/library/factories.py index 85fcb750..4907c798 100644 --- a/tests/test_app/library/factories.py +++ b/tests/test_app/library/factories.py @@ -1,10 +1,10 @@ -from datetime import timedelta, date +from datetime import date, timedelta import factory from django.contrib.auth.models import Group, Permission, User from django.utils import timezone from factory.django import DjangoModelFactory -from factory.fuzzy import FuzzyChoice, FuzzyDate +from factory.fuzzy import FuzzyChoice, FuzzyDate, FuzzyInteger from .books.models import Author, Book, Genre from .loans.models import BookLoan, Library @@ -104,6 +104,7 @@ class BookFactory(DjangoModelFactory): summary = factory.Faker("sentence") isbn = "9780123456472" published_on = FuzzyDate(date(1950, 1, 1), date(1999, 1, 1)) + pages = FuzzyInteger(50, 1000) @factory.post_generation def genre(self, create, extracted, **kwargs): From e497da27a407cc39e9a33c68d524b33b6bf780ee Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Mon, 18 Jan 2021 17:07:10 +0100 Subject: [PATCH 02/10] Add example for django-admin-numeric-filter. --- poetry.lock | 760 ++++++++++++-------------- pyproject.toml | 1 + tests/test_app/library/books/admin.py | 16 +- tests/test_app/library/settings.py | 3 +- 4 files changed, 371 insertions(+), 409 deletions(-) diff --git a/poetry.lock b/poetry.lock index 44102bc6..3a71c0a1 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,116 +1,111 @@ [[package]] -category = "dev" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = "*" -version = "1.4.4" [[package]] -category = "dev" -description = "Disable App Nap on OS X 10.9" -marker = "python_version >= \"3.4\" and sys_platform == \"darwin\" or sys_platform == \"darwin\"" name = "appnope" +version = "0.1.0" +description = "Disable App Nap on OS X 10.9" +category = "dev" optional = false python-versions = "*" -version = "0.1.0" [[package]] -category = "dev" -description = "Atomic file writes." -marker = "sys_platform == \"win32\"" name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" [[package]] -category = "dev" -description = "Classes Without Boilerplate" name = "attrs" +version = "20.2.0" +description = "Classes Without Boilerplate" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.2.0" [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "sphinx-rtd-theme", "pre-commit"] docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] [[package]] -category = "dev" -description = "Specifications for callback functions passed in to an API" name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" optional = false python-versions = "*" -version = "0.2.0" [[package]] -category = "dev" -description = "Screen-scraping library" name = "beautifulsoup4" +version = "4.9.3" +description = "Screen-scraping library" +category = "dev" optional = false python-versions = "*" -version = "4.9.3" [package.dependencies] -[package.dependencies.soupsieve] -python = ">=3.0" -version = ">1.2" +soupsieve = {version = ">1.2", markers = "python_version >= \"3.0\""} [package.extras] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] -category = "dev" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" +version = "2020.6.20" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" optional = false python-versions = "*" -version = "2020.6.20" [[package]] -category = "dev" -description = "Universal encoding detector for Python 2 and 3" name = "chardet" +version = "3.0.4" +description = "Universal encoding detector for Python 2 and 3" +category = "dev" optional = false python-versions = "*" -version = "3.0.4" [[package]] -category = "dev" -description = "Composable command line interface toolkit" name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "7.1.2" [[package]] -category = "dev" -description = "Cross-platform colored terminal text." -marker = "python_version >= \"3.4\" and sys_platform == \"win32\" or sys_platform == \"win32\" or platform_system == \"Windows\"" name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.4" [[package]] -category = "dev" -description = "Code coverage measurement for Python" name = "coverage" +version = "4.4.2" +description = "Code coverage measurement for Python" +category = "dev" optional = false python-versions = "*" -version = "4.4.2" [[package]] -category = "dev" -description = "Show coverage stats online via coveralls.io" name = "coveralls" +version = "2.1.2" +description = "Show coverage stats online via coveralls.io" +category = "dev" optional = false python-versions = ">= 3.5" -version = "2.1.2" [package.dependencies] coverage = ">=4.1,<6.0" @@ -121,44 +116,44 @@ requests = ">=1.0.0" yaml = ["PyYAML (>=3.10)"] [[package]] -category = "dev" -description = "Decorators for Humans" name = "decorator" +version = "4.4.2" +description = "Decorators for Humans" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.4.2" [[package]] -category = "dev" -description = "XML bomb protection for Python stdlib modules" name = "defusedxml" +version = "0.6.0" +description = "XML bomb protection for Python stdlib modules" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.6.0" [[package]] -category = "dev" -description = "Repackaging of Google's Diff Match and Patch libraries. Offers robust algorithms to perform the operations required for synchronizing plain text." name = "diff-match-patch" +version = "20200713" +description = "Repackaging of Google's Diff Match and Patch libraries. Offers robust algorithms to perform the operations required for synchronizing plain text." +category = "dev" optional = false python-versions = ">=2.7" -version = "20200713" [[package]] -category = "dev" -description = "Distribution utilities" name = "distlib" +version = "0.3.1" +description = "Distribution utilities" +category = "dev" optional = false python-versions = "*" -version = "0.3.1" [[package]] -category = "main" -description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." name = "django" +version = "2.2.16" +description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +category = "main" optional = false python-versions = ">=3.5" -version = "2.2.16" [package.dependencies] pytz = "*" @@ -169,95 +164,103 @@ argon2 = ["argon2-cffi (>=16.1.0)"] bcrypt = ["bcrypt"] [[package]] -category = "dev" -description = "A configurable set of panels that display various debug information about the current request/response." +name = "django-admin-numeric-filter" +version = "0.1.6" +description = "Numeric filters for Django admin" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +django = "*" + +[[package]] name = "django-debug-toolbar" +version = "3.1.1" +description = "A configurable set of panels that display various debug information about the current request/response." +category = "dev" optional = false python-versions = ">=3.5" -version = "3.1.1" [package.dependencies] Django = ">=2.2" sqlparse = ">=0.2.0" [[package]] -category = "dev" -description = "Extensions for Django" name = "django-extensions" +version = "3.0.9" +description = "Extensions for Django" +category = "dev" optional = false python-versions = ">=3.5" -version = "3.0.9" [[package]] -category = "dev" -description = "Django application and library for importing and exporting data with included admin integration." name = "django-import-export" +version = "2.4.0" +description = "Django application and library for importing and exporting data with included admin integration." +category = "dev" optional = false python-versions = ">=3.5" -version = "2.4.0" [package.dependencies] -Django = ">=2.0" diff-match-patch = "*" - -[package.dependencies.tablib] -extras = ["xlsx", "xls", "yaml", "html", "ods"] -version = ">=0.14.0" +Django = ">=2.0" +tablib = {version = ">=0.14.0", extras = ["html", "ods", "xls", "xlsx", "yaml"]} [[package]] -category = "dev" -description = "script tag with additional attributes for django.forms.Media" name = "django-js-asset" +version = "1.2.2" +description = "script tag with additional attributes for django.forms.Media" +category = "dev" optional = false python-versions = "*" -version = "1.2.2" [[package]] -category = "dev" -description = "Utilities for implementing Modified Preorder Tree Traversal with your Django Models and working with trees of Model instances." name = "django-mptt" +version = "0.11.0" +description = "Utilities for implementing Modified Preorder Tree Traversal with your Django Models and working with trees of Model instances." +category = "dev" optional = false python-versions = ">=3.5" -version = "0.11.0" [package.dependencies] Django = ">=1.11" django-js-asset = "*" [[package]] -category = "dev" -description = "Efficient tree implementations for Django" name = "django-treebeard" +version = "4.3.1" +description = "Efficient tree implementations for Django" +category = "dev" optional = false python-versions = "*" -version = "4.3.1" [package.dependencies] Django = ">=1.8" [[package]] -category = "dev" -description = "Pythonic argument parser, that will make you smile" name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "dev" optional = false python-versions = "*" -version = "0.6.2" [[package]] -category = "dev" -description = "An implementation of lxml.xmlfile for the standard library" name = "et-xmlfile" +version = "1.0.1" +description = "An implementation of lxml.xmlfile for the standard library" +category = "dev" optional = false python-versions = "*" -version = "1.0.1" [[package]] -category = "dev" -description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." name = "factory-boy" +version = "3.1.0" +description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." +category = "dev" optional = false python-versions = ">=3.5" -version = "3.1.0" [package.dependencies] Faker = ">=0.7.0" @@ -267,66 +270,62 @@ dev = ["coverage", "django", "flake8", "isort", "pillow", "sqlalchemy", "mongoen doc = ["sphinx", "sphinx-rtd-theme"] [[package]] -category = "dev" -description = "Faker is a Python package that generates fake data for you." name = "faker" +version = "4.14.0" +description = "Faker is a Python package that generates fake data for you." +category = "dev" optional = false python-versions = ">=3.5" -version = "4.14.0" [package.dependencies] python-dateutil = ">=2.4" text-unidecode = "1.3" [[package]] -category = "dev" -description = "A platform independent file lock." name = "filelock" +version = "3.0.12" +description = "A platform independent file lock." +category = "dev" optional = false python-versions = "*" -version = "3.0.12" [[package]] -category = "dev" -description = "the modular source code checker: pep8 pyflakes and co" name = "flake9" +version = "3.8.3.post2" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false python-versions = ">=3.4" -version = "3.8.3.post2" [package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" pycodestyle = ">=2.6.0a1,<2.7.0" pyflakes = ">=2.2.0,<2.3.0" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" - [[package]] -category = "dev" -description = "Clean single-source support for Python 3 and 2" name = "future" +version = "0.18.2" +description = "Clean single-source support for Python 3 and 2" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.18.2" [[package]] -category = "dev" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.10" [[package]] -category = "dev" -description = "Read metadata from Python packages" -marker = "python_version < \"3.8\"" name = "importlib-metadata" +version = "2.0.0" +description = "Read metadata from Python packages" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "2.0.0" [package.dependencies] zipp = ">=0.5" @@ -336,69 +335,58 @@ docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] [[package]] -category = "dev" -description = "Read resources from Python packages" -marker = "python_version < \"3.7\"" name = "importlib-resources" +version = "3.0.0" +description = "Read resources from Python packages" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "3.0.0" [package.dependencies] -[package.dependencies.zipp] -python = "<3.8" -version = ">=0.4" +zipp = {version = ">=0.4", markers = "python_version < \"3.8\""} [package.extras] docs = ["sphinx", "rst.linker", "jaraco.packaging"] [[package]] -category = "dev" -description = "iniconfig: brain-dead simple config-ini parsing" name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" optional = false python-versions = "*" -version = "1.1.1" [[package]] -category = "dev" -description = "IPython-enabled pdb" name = "ipdb" +version = "0.13.4" +description = "IPython-enabled pdb" +category = "dev" optional = false python-versions = ">=2.7" -version = "0.13.4" [package.dependencies] -setuptools = "*" - -[package.dependencies.ipython] -python = ">=3.4" -version = ">=5.1.0" +ipython = {version = ">=5.1.0", markers = "python_version >= \"3.4\""} [[package]] -category = "dev" -description = "IPython: Productive Interactive Computing" name = "ipython" +version = "7.9.0" +description = "IPython: Productive Interactive Computing" +category = "dev" optional = false python-versions = ">=3.5" -version = "7.9.0" [package.dependencies] -appnope = "*" +appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" -colorama = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" jedi = ">=0.10" -pexpect = "*" +pexpect = {version = "*", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=2.0.0,<2.1.0" pygments = "*" -setuptools = ">=18.5" traitlets = ">=4.2" - -[package.dependencies.win-unicode-console] -python = "<3.6" -version = ">=0.5" +win-unicode-console = {version = ">=0.5", markers = "sys_platform == \"win32\" and python_version < \"3.6\""} [package.extras] all = ["testpath", "nbformat", "numpy", "notebook", "ipyparallel", "nbconvert", "ipywidgets", "pygments", "requests", "nose (>=0.10.1)", "qtconsole", "ipykernel", "Sphinx (>=1.3)"] @@ -412,43 +400,43 @@ qtconsole = ["qtconsole"] test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy"] [[package]] -category = "dev" -description = "Vestigial utilities from IPython" name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" optional = false python-versions = "*" -version = "0.2.0" [[package]] -category = "dev" -description = "Julian dates from proleptic Gregorian and Julian calendars." name = "jdcal" +version = "1.4.1" +description = "Julian dates from proleptic Gregorian and Julian calendars." +category = "dev" optional = false python-versions = "*" -version = "1.4.1" [[package]] -category = "dev" -description = "An autocompletion tool for Python that can be used for text editors." name = "jedi" +version = "0.17.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.17.2" [package.dependencies] parso = ">=0.7.0,<0.8.0" [package.extras] -qa = ["flake8 (3.7.9)"] +qa = ["flake8 (==3.7.9)"] testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] [[package]] -category = "dev" -description = "A very fast and expressive template engine." name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.2" [package.dependencies] MarkupSafe = ">=0.23" @@ -457,116 +445,103 @@ MarkupSafe = ">=0.23" i18n = ["Babel (>=0.8)"] [[package]] -category = "dev" -description = "Lightweight pipelining: using Python functions as pipeline jobs." -marker = "python_version > \"2.7\"" name = "joblib" +version = "0.14.1" +description = "Lightweight pipelining: using Python functions as pipeline jobs." +category = "dev" optional = false python-versions = "*" -version = "0.14.1" [[package]] -category = "dev" -description = "Python LiveReload is an awesome tool for web developers" name = "livereload" +version = "2.6.3" +description = "Python LiveReload is an awesome tool for web developers" +category = "dev" optional = false python-versions = "*" -version = "2.6.3" [package.dependencies] six = "*" - -[package.dependencies.tornado] -python = ">=2.8" -version = "*" +tornado = {version = "*", markers = "python_version > \"2.7\""} [[package]] -category = "dev" -description = "A Python implementation of Lunr.js" name = "lunr" +version = "0.5.8" +description = "A Python implementation of Lunr.js" +category = "dev" optional = false python-versions = "*" -version = "0.5.8" [package.dependencies] future = ">=0.16.0" +nltk = {version = ">=3.2.5", optional = true, markers = "python_version > \"2.7\" and extra == \"languages\""} six = ">=1.11.0" -[package.dependencies.nltk] -optional = true -python = ">=2.8" -version = ">=3.2.5" - [package.extras] languages = ["nltk (>=3.2.5,<3.5)", "nltk (>=3.2.5)"] [[package]] -category = "dev" -description = "Python implementation of Markdown." name = "markdown" +version = "3.2.2" +description = "Python implementation of Markdown." +category = "dev" optional = false python-versions = ">=3.5" -version = "3.2.2" [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = "*" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [package.extras] testing = ["coverage", "pyyaml"] [[package]] -category = "dev" -description = "An HTML/XML generator" name = "markuppy" +version = "1.14" +description = "An HTML/XML generator" +category = "dev" optional = false python-versions = "*" -version = "1.14" [[package]] -category = "dev" -description = "Safely add untrusted strings to HTML/XML markup." name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "1.1.1" [[package]] -category = "dev" -description = "McCabe checker, plugin for flake8" name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = "*" -version = "0.6.1" [[package]] -category = "dev" -description = "Project documentation with Markdown." name = "mkdocs" +version = "1.1.2" +description = "Project documentation with Markdown." +category = "dev" optional = false python-versions = ">=3.5" -version = "1.1.2" [package.dependencies] +click = ">=3.3" Jinja2 = ">=2.10.1" +livereload = ">=2.5.1" +lunr = {version = "0.5.8", extras = ["languages"]} Markdown = ">=3.2.1" PyYAML = ">=3.10" -click = ">=3.3" -livereload = ">=2.5.1" tornado = ">=5.0" -[package.dependencies.lunr] -extras = ["languages"] -version = "0.5.8" - [[package]] -category = "dev" -description = "Optional static typing for Python" name = "mypy" +version = "0.790" +description = "Optional static typing for Python" +category = "dev" optional = false python-versions = ">=3.5" -version = "0.790" [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" @@ -577,21 +552,20 @@ typing-extensions = ">=3.7.4" dmypy = ["psutil (>=4.0)"] [[package]] -category = "dev" -description = "Experimental type system extensions for programs checked with the mypy typechecker." name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" optional = false python-versions = "*" -version = "0.4.3" [[package]] -category = "dev" -description = "Natural Language Toolkit" -marker = "python_version > \"2.7\"" name = "nltk" +version = "3.5" +description = "Natural Language Toolkit" +category = "dev" optional = false python-versions = "*" -version = "3.5" [package.dependencies] click = "*" @@ -608,220 +582,209 @@ tgrep = ["pyparsing"] twitter = ["twython"] [[package]] -category = "dev" -description = "Python API and tools to manipulate OpenDocument files" name = "odfpy" +version = "1.4.1" +description = "Python API and tools to manipulate OpenDocument files" +category = "dev" optional = false python-versions = "*" -version = "1.4.1" [package.dependencies] defusedxml = "*" [[package]] -category = "dev" -description = "A Python library to read/write Excel 2010 xlsx/xlsm files" name = "openpyxl" +version = "2.6.4" +description = "A Python library to read/write Excel 2010 xlsx/xlsm files" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.6.4" [package.dependencies] et_xmlfile = "*" jdcal = "*" [[package]] -category = "dev" -description = "Core utilities for Python packages" name = "packaging" +version = "20.4" +description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.4" [package.dependencies] pyparsing = ">=2.0.2" six = "*" -[[package]] -category = "dev" -description = "A Python Parser" +[[package]] name = "parso" +version = "0.7.1" +description = "A Python Parser" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.7.1" [package.extras] testing = ["docopt", "pytest (>=3.0.7)"] [[package]] -category = "dev" -description = "Object-oriented filesystem paths" -marker = "python_version < \"3.6\"" name = "pathlib2" +version = "2.3.5" +description = "Object-oriented filesystem paths" +category = "dev" optional = false python-versions = "*" -version = "2.3.5" [package.dependencies] six = "*" [[package]] -category = "dev" -description = "Pexpect allows easy control of interactive console applications." -marker = "python_version >= \"3.4\" and sys_platform != \"win32\" or sys_platform != \"win32\"" name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" optional = false python-versions = "*" -version = "4.8.0" [package.dependencies] ptyprocess = ">=0.5" [[package]] -category = "dev" -description = "Tiny 'shelve'-like database with concurrency support" name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" optional = false python-versions = "*" -version = "0.7.5" [[package]] -category = "dev" -description = "plugin and hook calling mechanisms for python" name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] [[package]] -category = "dev" -description = "A library to manipulate gettext files (po and mo files)." name = "polib" +version = "1.1.0" +description = "A library to manipulate gettext files (po and mo files)." +category = "dev" optional = false python-versions = "*" -version = "1.1.0" [[package]] -category = "dev" -description = "Library for building powerful interactive command lines in Python" name = "prompt-toolkit" +version = "2.0.10" +description = "Library for building powerful interactive command lines in Python" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.0.10" [package.dependencies] six = ">=1.9.0" wcwidth = "*" [[package]] -category = "dev" -description = "Run a subprocess in a pseudo terminal" -marker = "python_version >= \"3.4\" and sys_platform != \"win32\" or sys_platform != \"win32\" or python_version >= \"3.4\" and sys_platform != \"win32\" and (python_version >= \"3.4\" and sys_platform != \"win32\" or sys_platform != \"win32\")" name = "ptyprocess" +version = "0.6.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" optional = false python-versions = "*" -version = "0.6.0" [[package]] -category = "dev" -description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" +version = "1.9.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.9.0" [[package]] -category = "dev" -description = "Python style guide checker" name = "pycodestyle" +version = "2.6.0" +description = "Python style guide checker" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.6.0" [[package]] -category = "dev" -description = "passive checker of Python programs" name = "pyflakes" +version = "2.2.0" +description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.2.0" [[package]] -category = "dev" -description = "Pygments is a syntax highlighting package written in Python." name = "pygments" +version = "2.7.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=3.5" -version = "2.7.1" [[package]] -category = "dev" -description = "Python parsing module" name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" [[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" name = "pytest" +version = "6.1.1" +description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.5" -version = "6.1.1" [package.dependencies] -atomicwrites = ">=1.0" +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=17.4.0" -colorama = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" +pathlib2 = {version = ">=2.2.0", markers = "python_version < \"3.6\""} pluggy = ">=0.12,<1.0" py = ">=1.8.2" toml = "*" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.pathlib2] -python = "<3.6" -version = ">=2.2.0" - [package.extras] -checkqa_mypy = ["mypy (0.780)"] +checkqa_mypy = ["mypy (==0.780)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] -category = "dev" -description = "Pytest plugin for measuring coverage." name = "pytest-cov" +version = "2.10.1" +description = "Pytest plugin for measuring coverage." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.10.1" [package.dependencies] coverage = ">=4.4" pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"] [[package]] -category = "dev" -description = "A Django plugin for pytest." name = "pytest-django" +version = "3.10.0" +description = "A Django plugin for pytest." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.10.0" [package.dependencies] pytest = ">=3.6" @@ -831,48 +794,47 @@ docs = ["sphinx", "sphinx-rtd-theme"] testing = ["django", "django-configurations (>=2.0)", "six"] [[package]] -category = "dev" -description = "Extensions to the standard Python datetime module" name = "python-dateutil" +version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -version = "2.8.1" [package.dependencies] six = ">=1.5" [[package]] -category = "main" -description = "World timezone definitions, modern and historical" name = "pytz" +version = "2020.1" +description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" -version = "2020.1" [[package]] -category = "dev" -description = "YAML parser and emitter for Python" name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" [[package]] -category = "dev" -description = "Alternative regular expression module, to replace re." -marker = "python_version > \"2.7\"" name = "regex" +version = "2020.10.11" +description = "Alternative regular expression module, to replace re." +category = "dev" optional = false python-versions = "*" -version = "2020.10.11" [[package]] -category = "dev" -description = "Python HTTP for Humans." name = "requests" +version = "2.24.0" +description = "Python HTTP for Humans." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" [package.dependencies] certifi = ">=2017.4.17" @@ -882,65 +844,47 @@ urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" [package.extras] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] [[package]] -category = "dev" -description = "Python 2 and 3 compatibility utilities" name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.15.0" [[package]] -category = "dev" -description = "A modern CSS selector implementation for Beautiful Soup." -marker = "python_version >= \"3.0\"" name = "soupsieve" +version = "2.0.1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "dev" optional = false python-versions = ">=3.5" -version = "2.0.1" [[package]] -category = "main" -description = "A non-validating SQL parser." name = "sqlparse" +version = "0.4.1" +description = "A non-validating SQL parser." +category = "main" optional = false python-versions = ">=3.5" -version = "0.4.1" [[package]] -category = "dev" -description = "Format agnostic tabular data library (XLS, JSON, YAML, CSV)" name = "tablib" +version = "2.0.0" +description = "Format agnostic tabular data library (XLS, JSON, YAML, CSV)" +category = "dev" optional = false python-versions = ">=3.5" -version = "2.0.0" [package.dependencies] -[package.dependencies.markuppy] -optional = true -version = "*" - -[package.dependencies.odfpy] -optional = true -version = "*" - -[package.dependencies.openpyxl] -optional = true -version = ">=2.6.0" - -[package.dependencies.pyyaml] -optional = true -version = "*" - -[package.dependencies.xlrd] -optional = true -version = "*" - -[package.dependencies.xlwt] -optional = true -version = "*" +markuppy = {version = "*", optional = true, markers = "extra == \"html\""} +odfpy = {version = "*", optional = true, markers = "extra == \"ods\""} +openpyxl = {version = ">=2.6.0", optional = true, markers = "extra == \"xlsx\""} +pyyaml = {version = "*", optional = true, markers = "extra == \"yaml\""} +xlrd = {version = "*", optional = true, markers = "extra == \"xls\""} +xlwt = {version = "*", optional = true, markers = "extra == \"xls\""} [package.extras] all = ["markuppy", "odfpy", "openpyxl (>=2.6.0)", "pandas", "pyyaml", "tabulate", "xlrd", "xlwt"] @@ -953,40 +897,41 @@ xlsx = ["openpyxl (>=2.6.0)"] yaml = ["pyyaml"] [[package]] -category = "dev" -description = "The most basic Text::Unidecode port" name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "dev" optional = false python-versions = "*" -version = "1.3" [[package]] -category = "dev" -description = "Python Library for Tom's Obvious, Minimal Language" name = "toml" +version = "0.10.1" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" optional = false python-versions = "*" -version = "0.10.1" [[package]] -category = "dev" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." name = "tornado" +version = "6.0.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "dev" optional = false python-versions = ">= 3.5" -version = "6.0.4" [[package]] -category = "dev" -description = "tox is a generic virtualenv management and test command line tool" name = "tox" +version = "3.20.1" +description = "tox is a generic virtualenv management and test command line tool" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "3.20.1" [package.dependencies] -colorama = ">=0.4.1" +colorama = {version = ">=0.4.1", markers = "platform_system == \"Windows\""} filelock = ">=3.0.0" +importlib-metadata = {version = ">=0.12,<3", markers = "python_version < \"3.8\""} packaging = ">=14" pluggy = ">=0.12.0" py = ">=1.4.17" @@ -994,33 +939,28 @@ six = ">=1.14.0" toml = ">=0.9.4" virtualenv = ">=16.0.0,<20.0.0 || >20.0.0,<20.0.1 || >20.0.1,<20.0.2 || >20.0.2,<20.0.3 || >20.0.3,<20.0.4 || >20.0.4,<20.0.5 || >20.0.5,<20.0.6 || >20.0.6,<20.0.7 || >20.0.7" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12,<3" - [package.extras] docs = ["pygments-github-lexers (>=0.0.5)", "sphinx (>=2.0.0)", "sphinxcontrib-autoprogram (>=0.1.5)", "towncrier (>=18.5.0)"] testing = ["flaky (>=3.4.0)", "freezegun (>=0.3.11)", "pathlib2 (>=2.3.3)", "psutil (>=5.6.1)", "pytest (>=4.0.0)", "pytest-cov (>=2.5.1)", "pytest-mock (>=1.10.0)", "pytest-randomly (>=1.0.0)", "pytest-xdist (>=1.22.2)"] [[package]] -category = "dev" -description = "Fast, Extensible Progress Meter" -marker = "python_version > \"2.7\"" name = "tqdm" +version = "4.50.2" +description = "Fast, Extensible Progress Meter" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.50.2" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] [[package]] -category = "dev" -description = "Traitlets Python config system" name = "traitlets" +version = "4.3.3" +description = "Traitlets Python config system" +category = "dev" optional = false python-versions = "*" -version = "4.3.3" [package.dependencies] decorator = "*" @@ -1031,121 +971,113 @@ six = "*" test = ["pytest", "mock"] [[package]] -category = "dev" -description = "a fork of Python 2 and 3 ast modules with type comment support" name = "typed-ast" +version = "1.4.1" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" optional = false python-versions = "*" -version = "1.4.1" [[package]] -category = "dev" -description = "Backported and Experimental Type Hints for Python 3.5+" name = "typing-extensions" +version = "3.7.4.3" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" optional = false python-versions = "*" -version = "3.7.4.3" [[package]] -category = "dev" -description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" +version = "1.22" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" optional = false python-versions = "*" -version = "1.22" [package.extras] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] -category = "dev" -description = "Virtual Python Environment builder" name = "virtualenv" +version = "20.0.34" +description = "Virtual Python Environment builder" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "20.0.34" [package.dependencies] appdirs = ">=1.4.3,<2" distlib = ">=0.3.1,<1" filelock = ">=3.0.0,<4" +importlib-metadata = {version = ">=0.12,<3", markers = "python_version < \"3.8\""} +importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""} six = ">=1.9.0,<2" -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12,<3" - -[package.dependencies.importlib-resources] -python = "<3.7" -version = ">=1.0" - [package.extras] docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "pytest-xdist (>=1.31.0)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] [[package]] -category = "dev" -description = "Measures the displayed width of unicode strings in a terminal" name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" optional = false python-versions = "*" -version = "0.2.5" [[package]] -category = "dev" -description = "The comprehensive WSGI web application library." name = "werkzeug" +version = "1.0.1" +description = "The comprehensive WSGI web application library." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.0.1" [package.extras] dev = ["pytest", "pytest-timeout", "coverage", "tox", "sphinx", "pallets-sphinx-themes", "sphinx-issues"] watchdog = ["watchdog"] [[package]] -category = "dev" -description = "Enable Unicode input and display when running Python from Windows console." -marker = "sys_platform == \"win32\" and python_version < \"3.6\" or sys_platform == \"win32\" and python_version < \"3.6\" and python_version >= \"3.4\"" name = "win-unicode-console" +version = "0.5" +description = "Enable Unicode input and display when running Python from Windows console." +category = "dev" optional = false python-versions = "*" -version = "0.5" [[package]] -category = "dev" -description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files" name = "xlrd" +version = "1.2.0" +description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" [[package]] -category = "dev" -description = "Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+" name = "xlwt" +version = "1.3.0" +description = "Library to create spreadsheet files compatible with MS Excel 97/2000/XP/2003 XLS files, on any platform, with Python 2.6, 2.7, 3.3+" +category = "dev" optional = false python-versions = "*" -version = "1.3.0" [[package]] -category = "dev" -description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\"" name = "zipp" +version = "1.2.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" optional = false python-versions = ">=2.7" -version = "1.2.0" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "2ba50e3299e360b069164e68dd935115515774a33cc269b17992181883cfe5c8" -lock-version = "1.0" +lock-version = "1.1" python-versions = ">=3.5" +content-hash = "04eb0a7c96bea4b8ddd4b28c5f52612ab939c8bd8811b7550cc98a8802086b3b" [metadata.files] appdirs = [ @@ -1187,6 +1119,7 @@ click = [ ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ {file = "coverage-4.4.2-cp26-cp26m-macosx_10_10_x86_64.whl", hash = "sha256:d1ee76f560c3c3e8faada866a07a32485445e16ed2206ac8378bd90dadffb9f0"}, @@ -1254,6 +1187,9 @@ django = [ {file = "Django-2.2.16-py3-none-any.whl", hash = "sha256:83ced795a0f239f41d8ecabf51cc5fad4b97462a6008dc12e5af3cb9288724ec"}, {file = "Django-2.2.16.tar.gz", hash = "sha256:62cf45e5ee425c52e411c0742e641a6588b7e8af0d2c274a27940931b2786594"}, ] +django-admin-numeric-filter = [ + {file = "django-admin-numeric-filter-0.1.6.tar.gz", hash = "sha256:0f2e42e5040567ecc6dea2bd5f2439e2c00d3fb72c1180f51b1e1762e60d9abb"}, +] 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"}, @@ -1315,6 +1251,7 @@ importlib-resources = [ {file = "importlib_resources-3.0.0.tar.gz", hash = "sha256:19f745a6eca188b490b1428c8d1d4a0d2368759f32370ea8fb89cad2ab1106c3"}, ] iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] ipdb = [ @@ -1519,6 +1456,8 @@ pyyaml = [ {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] regex = [ @@ -1609,19 +1548,28 @@ typed-ast = [ {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fcf135e17cc74dbfbc05894ebca928ffeb23d9790b3167a674921db19082401f"}, {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f208eb7aff048f6bea9586e61af041ddf7f9ade7caed625742af423f6bae3298"}, {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7e4c9d7658aaa1fc80018593abdf8598bf91325af6af5cce4ce7c73bc45ea53d"}, {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:92c325624e304ebf0e025d1224b77dd4e6393f18aab8d829b5b7e04afe9b7a2c"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d648b8e3bf2fe648745c8ffcee3db3ff903d0817a01a12dd6a6ea7a8f4889072"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:fac11badff8313e23717f3dada86a15389d0708275bddf766cca67a84ead3e91"}, + {file = "typed_ast-1.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:0d8110d78a5736e16e26213114a38ca35cb15b6515d535413b090bd50951556d"}, + {file = "typed_ast-1.4.1-cp39-cp39-win32.whl", hash = "sha256:b52ccf7cfe4ce2a1064b18594381bccf4179c2ecf7f513134ec2f993dd4ab395"}, + {file = "typed_ast-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:3742b32cf1c6ef124d57f95be609c473d7ec4c14d0090e5a5e05a15269fb4d0c"}, {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing-extensions = [ diff --git a/pyproject.toml b/pyproject.toml index ac6ca2bc..9835329b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -42,6 +42,7 @@ exclude = ["tests", "docs"] [tool.poetry.dependencies] python = ">=3.5" django = ">=2" +django-admin-numeric-filter = "^0.1.6" [tool.black] line-length = 120 diff --git a/tests/test_app/library/books/admin.py b/tests/test_app/library/books/admin.py index 9833633b..9ed38edf 100644 --- a/tests/test_app/library/books/admin.py +++ b/tests/test_app/library/books/admin.py @@ -1,3 +1,9 @@ +from admin_numeric_filter.admin import ( + NumericFilterModelAdmin, + RangeNumericFilter, + SingleNumericFilter, + SliderNumericFilter, +) from django.contrib import admin from django.contrib.admin.models import LogEntry from django.contrib.auth.admin import UserAdmin @@ -18,7 +24,7 @@ class BooksInline(admin.TabularInline): @admin.register(Book) -class BookAdmin(ImportExportMixin, admin.ModelAdmin): +class BookAdmin(ImportExportMixin, NumericFilterModelAdmin): resource_class = BookResource fieldsets = ( ("general", {"fields": ("title", "author", "library")}), @@ -28,7 +34,13 @@ class BookAdmin(ImportExportMixin, admin.ModelAdmin): list_display = ("__str__", "title", "author", "pages") readonly_fields = ("__str__",) list_display_links = () - list_filter = ("author", "genre") + list_filter = ( + "author", + "genre", + ("pages", SingleNumericFilter), + ("pages", RangeNumericFilter), + ("pages", SliderNumericFilter), + ) list_select_related = False list_per_page = 20 list_max_show_all = 100 diff --git a/tests/test_app/library/settings.py b/tests/test_app/library/settings.py index a03e602d..d83b90b3 100644 --- a/tests/test_app/library/settings.py +++ b/tests/test_app/library/settings.py @@ -1,7 +1,7 @@ import os -from django.conf.global_settings import LANGUAGES as DJANGO_LANGUAGES import dj_database_url +from django.conf.global_settings import LANGUAGES as DJANGO_LANGUAGES ################### # Django Settings # @@ -17,6 +17,7 @@ INSTALLED_APPS = [ # Keep this above 'django.contrib.admin' "jazzmin", + "admin_numeric_filter", "django.contrib.admin", "django.contrib.admindocs", "django.contrib.auth", From d51c0d7dc3e6752dc395fec2276e55a09ec68a4a Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Thu, 28 Jan 2021 11:15:01 +0100 Subject: [PATCH 03/10] Add dep to tox. --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 9835329b..c9d1cff6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -136,6 +136,7 @@ deps = django-import-export django2: Django<3 django3: Django<4 + django-admin-numeric-filter [testenv:coveralls-django3-py38] passenv = COVERALLS_REPO_TOKEN From cd1ebfd5f4a7a648f8477b6373dcbe519b568440 Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Fri, 26 Feb 2021 23:10:11 +0100 Subject: [PATCH 04/10] Add django-admin-rangefilter --- poetry.lock | 33 ++++++++++++++++++- pyproject.toml | 1 + tests/test_app/library/books/admin.py | 15 +++++---- .../books/migrations/0005_book_last_print.py | 20 +++++++++++ tests/test_app/library/books/models.py | 10 ++++-- tests/test_app/library/factories.py | 1 + tests/test_app/library/settings.py | 1 + 7 files changed, 70 insertions(+), 11 deletions(-) create mode 100644 tests/test_app/library/books/migrations/0005_book_last_print.py diff --git a/poetry.lock b/poetry.lock index 3a71c0a1..fe2c40da 100644 --- a/poetry.lock +++ b/poetry.lock @@ -174,6 +174,14 @@ python-versions = "*" [package.dependencies] django = "*" +[[package]] +name = "django-admin-rangefilter" +version = "0.7.0" +description = "django-admin-rangefilter app, add the filter by a custom date range on the admin UI." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + [[package]] name = "django-debug-toolbar" version = "3.1.1" @@ -1077,7 +1085,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] lock-version = "1.1" python-versions = ">=3.5" -content-hash = "04eb0a7c96bea4b8ddd4b28c5f52612ab939c8bd8811b7550cc98a8802086b3b" +content-hash = "39eafcb978ebb88766f4f780a388e04da73860635d88b02e0149c7b6c8664b3e" [metadata.files] appdirs = [ @@ -1190,6 +1198,10 @@ django = [ django-admin-numeric-filter = [ {file = "django-admin-numeric-filter-0.1.6.tar.gz", hash = "sha256:0f2e42e5040567ecc6dea2bd5f2439e2c00d3fb72c1180f51b1e1762e60d9abb"}, ] +django-admin-rangefilter = [ + {file = "django-admin-rangefilter-0.7.0.tar.gz", hash = "sha256:da641c8fb919a570f26d3008250f54f86e6446c47eab0d3e8454a1253ffeb6b5"}, + {file = "django_admin_rangefilter-0.7.0-py2.py3-none-any.whl", hash = "sha256:95343502a9d7725f51708cdc54185c156936b28566a3c004d4cb46dd9b6a3317"}, +] 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"}, @@ -1314,20 +1326,39 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mccabe = [ diff --git a/pyproject.toml b/pyproject.toml index c9d1cff6..23419221 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,6 +43,7 @@ exclude = ["tests", "docs"] python = ">=3.5" django = ">=2" django-admin-numeric-filter = "^0.1.6" +django-admin-rangefilter = "^0.7.0" [tool.black] line-length = 120 diff --git a/tests/test_app/library/books/admin.py b/tests/test_app/library/books/admin.py index 9ed38edf..3b56fd37 100644 --- a/tests/test_app/library/books/admin.py +++ b/tests/test_app/library/books/admin.py @@ -1,9 +1,7 @@ -from admin_numeric_filter.admin import ( - NumericFilterModelAdmin, - RangeNumericFilter, - SingleNumericFilter, - SliderNumericFilter, -) +from admin_numeric_filter.admin import (NumericFilterModelAdmin, + RangeNumericFilter, + SingleNumericFilter, + SliderNumericFilter) from django.contrib import admin from django.contrib.admin.models import LogEntry from django.contrib.auth.admin import UserAdmin @@ -11,6 +9,7 @@ from django.utils.html import format_html from django.utils.timesince import timesince from import_export.admin import ImportExportMixin +from rangefilter.filter import DateRangeFilter from ..loans.admin import BookLoanInline from .models import Author, Book, Genre @@ -40,6 +39,7 @@ class BookAdmin(ImportExportMixin, NumericFilterModelAdmin): ("pages", SingleNumericFilter), ("pages", RangeNumericFilter), ("pages", SliderNumericFilter), + ("last_print", DateRangeFilter), ) list_select_related = False list_per_page = 20 @@ -79,7 +79,8 @@ class LogEntryAdmin(admin.ModelAdmin): def object(self, obj): url = obj.get_admin_url() return format_html( - '{obj} [{model}]'.format(url=url, obj=obj.object_repr, model=obj.content_type.model) + '{obj} [{model}]'.format( + url=url, obj=obj.object_repr, model=obj.content_type.model) ) def modified(self, obj): diff --git a/tests/test_app/library/books/migrations/0005_book_last_print.py b/tests/test_app/library/books/migrations/0005_book_last_print.py new file mode 100644 index 00000000..4121ac69 --- /dev/null +++ b/tests/test_app/library/books/migrations/0005_book_last_print.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.16 on 2021-02-26 21:49 + +import datetime +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('books', '0004_book_pages'), + ] + + operations = [ + migrations.AddField( + model_name='book', + name='last_print', + field=models.DateField(default=datetime.date(2000, 1, 1)), + preserve_default=False, + ), + ] diff --git a/tests/test_app/library/books/models.py b/tests/test_app/library/books/models.py index 0215e9f9..184f5120 100644 --- a/tests/test_app/library/books/models.py +++ b/tests/test_app/library/books/models.py @@ -3,7 +3,8 @@ class Genre(models.Model): - name = models.CharField(max_length=200, help_text="Enter a book genre (e.g. Science Fiction)") + name = models.CharField( + max_length=200, help_text="Enter a book genre (e.g. Science Fiction)") def __str__(self): return self.name @@ -11,9 +12,11 @@ def __str__(self): class Book(models.Model): title = models.CharField(max_length=200) - library = models.ForeignKey("loans.Library", related_name="books", on_delete=models.CASCADE) + library = models.ForeignKey( + "loans.Library", related_name="books", on_delete=models.CASCADE) author = models.ForeignKey("Author", on_delete=models.SET_NULL, null=True) - summary = models.TextField(max_length=1000, help_text="Enter a brief description of the book") + summary = models.TextField( + max_length=1000, help_text="Enter a brief description of the book") isbn = models.CharField( "ISBN", max_length=13, @@ -23,6 +26,7 @@ class Book(models.Model): ) genre = models.ManyToManyField(Genre, help_text="Select a genre for this book") published_on = models.DateField() + last_print = models.DateField() pages = models.IntegerField(null=True) def get_absolute_url(self): diff --git a/tests/test_app/library/factories.py b/tests/test_app/library/factories.py index 4907c798..e02447e4 100644 --- a/tests/test_app/library/factories.py +++ b/tests/test_app/library/factories.py @@ -104,6 +104,7 @@ class BookFactory(DjangoModelFactory): summary = factory.Faker("sentence") isbn = "9780123456472" published_on = FuzzyDate(date(1950, 1, 1), date(1999, 1, 1)) + last_print = FuzzyDate(date(2000, 1, 1), date(2020, 1, 1)) pages = FuzzyInteger(50, 1000) @factory.post_generation diff --git a/tests/test_app/library/settings.py b/tests/test_app/library/settings.py index d83b90b3..70dcafc5 100644 --- a/tests/test_app/library/settings.py +++ b/tests/test_app/library/settings.py @@ -18,6 +18,7 @@ # Keep this above 'django.contrib.admin' "jazzmin", "admin_numeric_filter", + "rangefilter", "django.contrib.admin", "django.contrib.admindocs", "django.contrib.auth", From ba6cba2cc7b02e77212ac94babffebd505404c95 Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Fri, 26 Feb 2021 23:23:09 +0100 Subject: [PATCH 05/10] Changed numbers for loading templates --- tests/test_admin_views.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/tests/test_admin_views.py b/tests/test_admin_views.py index de88e3a2..4187c45f 100644 --- a/tests/test_admin_views.py +++ b/tests/test_admin_views.py @@ -1,8 +1,8 @@ import pytest - from jazzmin.compat import reverse -from .test_app.library.factories import BookFactory + from .test_app.library.books.models import Book +from .test_app.library.factories import BookFactory @pytest.mark.django_db @@ -71,7 +71,8 @@ def test_password_change(admin_client): response = admin_client.post( url, - data={"old_password": "password", "new_password1": "PickleRick123!!", "new_password2": "PickleRick123!!"}, + data={"old_password": "password", "new_password1": "PickleRick123!!", + "new_password2": "PickleRick123!!"}, follow=True, ) templates_used = [t.name for t in response.templates] @@ -131,10 +132,11 @@ def test_detail(admin_client): "admin/widgets/foreign_key_raw_id.html": 1, "admin/widgets/related_widget_wrapper.html": 4, "admin/widgets/split_datetime.html": 2, - "django/forms/widgets/attrs.html": 46, + "django/forms/widgets/attrs.html": 47, "django/forms/widgets/date.html": 5, "django/forms/widgets/hidden.html": 6, - "django/forms/widgets/input.html": 18, + "django/forms/widgets/input.html": 19, + "django/forms/widgets/number.html": 1, "django/forms/widgets/select.html": 6, "django/forms/widgets/select_option.html": 21, "django/forms/widgets/text.html": 4, @@ -161,6 +163,7 @@ def test_detail(admin_client): "django/forms/widgets/date.html", "django/forms/widgets/hidden.html", "django/forms/widgets/input.html", + "django/forms/widgets/number.html", "django/forms/widgets/select.html", "django/forms/widgets/select_option.html", "django/forms/widgets/text.html", @@ -208,10 +211,16 @@ def test_list(admin_client): "django/forms/widgets/text.html": 5, "django/forms/widgets/select_option.html": 4, "django/forms/widgets/select.html": 2, - "django/forms/widgets/input.html": 21, + "django/forms/widgets/input.html": 28, "django/forms/widgets/hidden.html": 11, - "django/forms/widgets/attrs.html": 27, + "django/forms/widgets/attrs.html": 34, "jazzmin/includes/ui_builder_panel.html": 1, + 'admin/filter_numeric_range.html': 1, + 'admin/filter_numeric_single.html': 1, + 'admin/filter_numeric_slider.html': 1, + 'django/forms/widgets/date.html': 2, + 'django/forms/widgets/number.html': 5, + 'rangefilter/date_filter.html': 1, } # The templates that were used @@ -238,6 +247,12 @@ def test_list(admin_client): "django/forms/widgets/hidden.html", "django/forms/widgets/attrs.html", "jazzmin/includes/ui_builder_panel.html", + 'admin/filter_numeric_range.html', + 'admin/filter_numeric_single.html', + 'admin/filter_numeric_slider.html', + 'django/forms/widgets/date.html', + 'django/forms/widgets/number.html', + 'rangefilter/date_filter.html', } From 4ff39a501189ba76c8766c0ad762c3e4aecae0cf Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Fri, 26 Feb 2021 23:23:22 +0100 Subject: [PATCH 06/10] Black reformat. --- tests/test_app/library/books/admin.py | 13 +++++++------ .../books/migrations/0005_book_last_print.py | 6 +++--- tests/test_app/library/books/models.py | 9 +++------ tests/test_app/library/settings.py | 4 +--- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/tests/test_app/library/books/admin.py b/tests/test_app/library/books/admin.py index 3b56fd37..19483359 100644 --- a/tests/test_app/library/books/admin.py +++ b/tests/test_app/library/books/admin.py @@ -1,7 +1,9 @@ -from admin_numeric_filter.admin import (NumericFilterModelAdmin, - RangeNumericFilter, - SingleNumericFilter, - SliderNumericFilter) +from admin_numeric_filter.admin import ( + NumericFilterModelAdmin, + RangeNumericFilter, + SingleNumericFilter, + SliderNumericFilter, +) from django.contrib import admin from django.contrib.admin.models import LogEntry from django.contrib.auth.admin import UserAdmin @@ -79,8 +81,7 @@ class LogEntryAdmin(admin.ModelAdmin): def object(self, obj): url = obj.get_admin_url() return format_html( - '{obj} [{model}]'.format( - url=url, obj=obj.object_repr, model=obj.content_type.model) + '{obj} [{model}]'.format(url=url, obj=obj.object_repr, model=obj.content_type.model) ) def modified(self, obj): diff --git a/tests/test_app/library/books/migrations/0005_book_last_print.py b/tests/test_app/library/books/migrations/0005_book_last_print.py index 4121ac69..08e85223 100644 --- a/tests/test_app/library/books/migrations/0005_book_last_print.py +++ b/tests/test_app/library/books/migrations/0005_book_last_print.py @@ -7,13 +7,13 @@ class Migration(migrations.Migration): dependencies = [ - ('books', '0004_book_pages'), + ("books", "0004_book_pages"), ] operations = [ migrations.AddField( - model_name='book', - name='last_print', + model_name="book", + name="last_print", field=models.DateField(default=datetime.date(2000, 1, 1)), preserve_default=False, ), diff --git a/tests/test_app/library/books/models.py b/tests/test_app/library/books/models.py index 184f5120..effcf539 100644 --- a/tests/test_app/library/books/models.py +++ b/tests/test_app/library/books/models.py @@ -3,8 +3,7 @@ class Genre(models.Model): - name = models.CharField( - max_length=200, help_text="Enter a book genre (e.g. Science Fiction)") + name = models.CharField(max_length=200, help_text="Enter a book genre (e.g. Science Fiction)") def __str__(self): return self.name @@ -12,11 +11,9 @@ def __str__(self): class Book(models.Model): title = models.CharField(max_length=200) - library = models.ForeignKey( - "loans.Library", related_name="books", on_delete=models.CASCADE) + library = models.ForeignKey("loans.Library", related_name="books", on_delete=models.CASCADE) author = models.ForeignKey("Author", on_delete=models.SET_NULL, null=True) - summary = models.TextField( - max_length=1000, help_text="Enter a brief description of the book") + summary = models.TextField(max_length=1000, help_text="Enter a brief description of the book") isbn = models.CharField( "ISBN", max_length=13, diff --git a/tests/test_app/library/settings.py b/tests/test_app/library/settings.py index 70dcafc5..33701557 100644 --- a/tests/test_app/library/settings.py +++ b/tests/test_app/library/settings.py @@ -73,9 +73,7 @@ DATABASES = { "default": dj_database_url.config( - env="DATABASE_URL", - conn_max_age=500, - default="sqlite:///{}".format(os.path.join(BASE_DIR, "db.sqlite3")), + env="DATABASE_URL", conn_max_age=500, default="sqlite:///{}".format(os.path.join(BASE_DIR, "db.sqlite3")), ) } From b663eb4e0419ed05a3aca27b4f9b9e405250f641 Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Sat, 27 Feb 2021 00:03:16 +0100 Subject: [PATCH 07/10] Forgot to add in two places pyproject.toml --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 23419221..e1ff88ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -138,6 +138,7 @@ deps = django2: Django<3 django3: Django<4 django-admin-numeric-filter + django-admin-rangefilter [testenv:coveralls-django3-py38] passenv = COVERALLS_REPO_TOKEN From 67162d4d5d953daff025e088248c217cbb51bf71 Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Sat, 27 Feb 2021 00:10:26 +0100 Subject: [PATCH 08/10] Black reformat. --- cli.py | 18 +---- jazzmin/templatetags/jazzmin.py | 12 +--- jazzmin/widgets.py | 6 +- tests/test_admin_views.py | 31 ++++----- .../books/management/commands/reset.py | 5 +- .../library/books/migrations/0001_initial.py | 66 +++---------------- .../books/migrations/0002_book_library.py | 4 +- .../books/migrations/0004_book_pages.py | 6 +- .../library/loans/migrations/0001_initial.py | 21 ++---- .../migrations/0002_auto_20201015_1222.py | 5 +- tests/test_app/library/loans/models.py | 10 +-- tests/test_app/library/urls.py | 8 +-- tests/test_customisation.py | 3 +- tests/test_jazzmin_menus.py | 56 +++------------- tests/test_templatetags.py | 18 +---- 15 files changed, 56 insertions(+), 213 deletions(-) diff --git a/cli.py b/cli.py index 7d566dbb..7b89692c 100755 --- a/cli.py +++ b/cli.py @@ -20,15 +20,7 @@ def locales(cmd_args: argparse.Namespace): our_po = polib.pofile(os.path.join(LOCALE_DIR, cmd_args.locale, "LC_MESSAGES", "django.po")) admin_po = polib.pofile(os.path.join(DJANGO_PATH, "contrib", "admin", "locale", "en", "LC_MESSAGES", "django.po")) admindocs_po = polib.pofile( - os.path.join( - DJANGO_PATH, - "contrib", - "admindocs", - "locale", - "en", - "LC_MESSAGES", - "django.po", - ) + os.path.join(DJANGO_PATH, "contrib", "admindocs", "locale", "en", "LC_MESSAGES", "django.po",) ) existing_strings = {x.msgid for x in chain(admin_po, admindocs_po)} new_po = polib.POFile() @@ -62,8 +54,7 @@ def templates(cmd_args: argparse.Namespace): original = template.replace(jazzmin_dir, django_dir) if os.path.isfile(original): result = subprocess.run( - ["diff", "-u", "-w", "--suppress-common-lines", original, template], - stdout=subprocess.PIPE, + ["diff", "-u", "-w", "--suppress-common-lines", original, template], stdout=subprocess.PIPE, ) out_file = template.replace(jazzmin_dir, diffs) + ".patch" os.makedirs(os.path.dirname(out_file), exist_ok=True) @@ -83,10 +74,7 @@ def main(): parser_templates = subparsers.add_parser("templates", help="Deal with templates") parser_templates.add_argument( - "--diff", - action="store_true", - dest="template_diff", - help="generate template diff", + "--diff", action="store_true", dest="template_diff", help="generate template diff", ) parser_templates.set_defaults(func=templates) diff --git a/jazzmin/templatetags/jazzmin.py b/jazzmin/templatetags/jazzmin.py index cfd0e771..8440d293 100644 --- a/jazzmin/templatetags/jazzmin.py +++ b/jazzmin/templatetags/jazzmin.py @@ -83,18 +83,13 @@ def get_side_menu(context: Context, using: str = "available_apps") -> List[Dict] custom_link_names = [x.get("name", "").lower() for x in app_custom_links] model_ordering = list( - filter( - lambda x: x.lower().startswith("{}.".format(app_label)) or x.lower() in custom_link_names, - ordering, - ) + filter(lambda x: x.lower().startswith("{}.".format(app_label)) or x.lower() in custom_link_names, ordering,) ) if len(menu_items): if model_ordering: menu_items = order_with_respect_to( - menu_items, - model_ordering, - getter=lambda x: x.get("model_str", x.get("name", "").lower()), + menu_items, model_ordering, getter=lambda x: x.get("model_str", x.get("name", "").lower()), ) app["models"] = menu_items menu.append(app) @@ -420,8 +415,7 @@ def deleted(x: str) -> Dict: elif "changed" in sub_message: sub_message["changed"]["fields"] = get_text_list( - [gettext(field_name) for field_name in sub_message["changed"]["fields"]], - gettext("and"), + [gettext(field_name) for field_name in sub_message["changed"]["fields"]], gettext("and"), ) if "name" in sub_message["changed"]: sub_message["changed"]["name"] = gettext(sub_message["changed"]["name"]) diff --git a/jazzmin/widgets.py b/jazzmin/widgets.py index 2fcd18d5..a3345d03 100644 --- a/jazzmin/widgets.py +++ b/jazzmin/widgets.py @@ -8,8 +8,7 @@ class JazzminSelect(Select): @property def media(self): return forms.Media( - css={"all": ("vendor/select2/css/select2.min.css",)}, - js=("vendor/select2/js/select2.min.js",), + css={"all": ("vendor/select2/css/select2.min.css",)}, js=("vendor/select2/js/select2.min.js",), ) @@ -23,6 +22,5 @@ def build_attrs(self, base_attrs, extra_attrs=None): @property def media(self): return forms.Media( - css={"all": ("vendor/select2/css/select2.min.css",)}, - js=("vendor/select2/js/select2.min.js",), + css={"all": ("vendor/select2/css/select2.min.css",)}, js=("vendor/select2/js/select2.min.js",), ) diff --git a/tests/test_admin_views.py b/tests/test_admin_views.py index 4187c45f..1a808700 100644 --- a/tests/test_admin_views.py +++ b/tests/test_admin_views.py @@ -19,9 +19,7 @@ def test_login(client, admin_user): assert templates_used == ["admin/login.html"] response = client.post( - url + "?next=/admin/", - data={"username": admin_user.username, "password": "password"}, - follow=True, + url + "?next=/admin/", data={"username": admin_user.username, "password": "password"}, follow=True, ) assert response.status_code == 200 @@ -71,8 +69,7 @@ def test_password_change(admin_client): response = admin_client.post( url, - data={"old_password": "password", "new_password1": "PickleRick123!!", - "new_password2": "PickleRick123!!"}, + data={"old_password": "password", "new_password1": "PickleRick123!!", "new_password2": "PickleRick123!!"}, follow=True, ) templates_used = [t.name for t in response.templates] @@ -215,12 +212,12 @@ def test_list(admin_client): "django/forms/widgets/hidden.html": 11, "django/forms/widgets/attrs.html": 34, "jazzmin/includes/ui_builder_panel.html": 1, - 'admin/filter_numeric_range.html': 1, - 'admin/filter_numeric_single.html': 1, - 'admin/filter_numeric_slider.html': 1, - 'django/forms/widgets/date.html': 2, - 'django/forms/widgets/number.html': 5, - 'rangefilter/date_filter.html': 1, + "admin/filter_numeric_range.html": 1, + "admin/filter_numeric_single.html": 1, + "admin/filter_numeric_slider.html": 1, + "django/forms/widgets/date.html": 2, + "django/forms/widgets/number.html": 5, + "rangefilter/date_filter.html": 1, } # The templates that were used @@ -247,12 +244,12 @@ def test_list(admin_client): "django/forms/widgets/hidden.html", "django/forms/widgets/attrs.html", "jazzmin/includes/ui_builder_panel.html", - 'admin/filter_numeric_range.html', - 'admin/filter_numeric_single.html', - 'admin/filter_numeric_slider.html', - 'django/forms/widgets/date.html', - 'django/forms/widgets/number.html', - 'rangefilter/date_filter.html', + "admin/filter_numeric_range.html", + "admin/filter_numeric_single.html", + "admin/filter_numeric_slider.html", + "django/forms/widgets/date.html", + "django/forms/widgets/number.html", + "rangefilter/date_filter.html", } diff --git a/tests/test_app/library/books/management/commands/reset.py b/tests/test_app/library/books/management/commands/reset.py index 14dbb91c..7110f1a9 100644 --- a/tests/test_app/library/books/management/commands/reset.py +++ b/tests/test_app/library/books/management/commands/reset.py @@ -26,10 +26,7 @@ def handle(self, *args, **options): library = LibraryFactory() UserFactory( - username="test@test.com", - email="test@test.com", - password="test", - is_superuser=True, + username="test@test.com", email="test@test.com", password="test", is_superuser=True, ) users = UserFactory.create_batch(2, is_staff=False) diff --git a/tests/test_app/library/books/migrations/0001_initial.py b/tests/test_app/library/books/migrations/0001_initial.py index 6d2b51cf..145de1ee 100644 --- a/tests/test_app/library/books/migrations/0001_initial.py +++ b/tests/test_app/library/books/migrations/0001_initial.py @@ -14,68 +14,27 @@ class Migration(migrations.Migration): migrations.CreateModel( name="Author", fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID",),), ("first_name", models.CharField(max_length=100)), ("last_name", models.CharField(max_length=100)), ("date_of_birth", models.DateField(blank=True, null=True)), - ( - "date_of_death", - models.DateField(blank=True, null=True, verbose_name="Died"), - ), + ("date_of_death", models.DateField(blank=True, null=True, verbose_name="Died"),), ], - options={ - "ordering": ("last_name", "first_name"), - }, + options={"ordering": ("last_name", "first_name"),}, ), migrations.CreateModel( name="Genre", fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ( - "name", - models.CharField( - help_text="Enter a book genre (e.g. Science Fiction)", - max_length=200, - ), - ), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID",),), + ("name", models.CharField(help_text="Enter a book genre (e.g. Science Fiction)", max_length=200,),), ], ), migrations.CreateModel( name="Book", fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID",),), ("title", models.CharField(max_length=200)), - ( - "summary", - models.TextField( - help_text="Enter a brief description of the book", - max_length=1000, - ), - ), + ("summary", models.TextField(help_text="Enter a brief description of the book", max_length=1000,),), ( "isbn", models.CharField( @@ -87,16 +46,9 @@ class Migration(migrations.Migration): ("published_on", models.DateField()), ( "author", - models.ForeignKey( - null=True, - on_delete=django.db.models.deletion.SET_NULL, - to="books.Author", - ), - ), - ( - "genre", - models.ManyToManyField(help_text="Select a genre for this book", to="books.Genre"), + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="books.Author",), ), + ("genre", models.ManyToManyField(help_text="Select a genre for this book", to="books.Genre"),), ], ), ] diff --git a/tests/test_app/library/books/migrations/0002_book_library.py b/tests/test_app/library/books/migrations/0002_book_library.py index f25bd281..931910e0 100644 --- a/tests/test_app/library/books/migrations/0002_book_library.py +++ b/tests/test_app/library/books/migrations/0002_book_library.py @@ -18,9 +18,7 @@ class Migration(migrations.Migration): model_name="book", name="library", field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="books", - to="loans.Library", + on_delete=django.db.models.deletion.CASCADE, related_name="books", to="loans.Library", ), ), ] diff --git a/tests/test_app/library/books/migrations/0004_book_pages.py b/tests/test_app/library/books/migrations/0004_book_pages.py index bc8897cc..afa18c29 100644 --- a/tests/test_app/library/books/migrations/0004_book_pages.py +++ b/tests/test_app/library/books/migrations/0004_book_pages.py @@ -10,9 +10,5 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AddField( - model_name="book", - name="pages", - field=models.IntegerField(null=True), - ), + migrations.AddField(model_name="book", name="pages", field=models.IntegerField(null=True),), ] diff --git a/tests/test_app/library/loans/migrations/0001_initial.py b/tests/test_app/library/loans/migrations/0001_initial.py index 5228b7f0..9f0daa74 100644 --- a/tests/test_app/library/loans/migrations/0001_initial.py +++ b/tests/test_app/library/loans/migrations/0001_initial.py @@ -19,10 +19,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name="Library", fields=[ - ( - "id", - models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), - ), + ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"),), ("address", models.CharField(max_length=255)), ( "librarian", @@ -52,21 +49,13 @@ class Migration(migrations.Migration): "status", models.CharField( blank=True, - choices=[ - ("m", "Maintenance"), - ("o", "On loan"), - ("a", "Available"), - ("r", "Reserved"), - ], + choices=[("m", "Maintenance"), ("o", "On loan"), ("a", "Available"), ("r", "Reserved"),], default="m", help_text="Book availability", max_length=1, ), ), - ( - "book", - models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="books.Book"), - ), + ("book", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="books.Book"),), ( "borrower", models.ForeignKey( @@ -74,8 +63,6 @@ class Migration(migrations.Migration): ), ), ], - options={ - "ordering": ("due_back",), - }, + options={"ordering": ("due_back",),}, ), ] diff --git a/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py b/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py index 08e55e19..6f6779d7 100644 --- a/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py +++ b/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py @@ -10,10 +10,7 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterModelOptions( - name="library", - options={"verbose_name_plural": "Libraries"}, - ), + migrations.AlterModelOptions(name="library", options={"verbose_name_plural": "Libraries"},), migrations.AddField( model_name="library", name="name", diff --git a/tests/test_app/library/loans/models.py b/tests/test_app/library/loans/models.py index c7822cc9..6b5646b3 100644 --- a/tests/test_app/library/loans/models.py +++ b/tests/test_app/library/loans/models.py @@ -19,9 +19,7 @@ def __str__(self): class BookLoan(models.Model): id = models.UUIDField( - primary_key=True, - default=uuid4, - help_text="Unique ID for this particular book across whole library", + primary_key=True, default=uuid4, help_text="Unique ID for this particular book across whole library", ) book = models.ForeignKey("books.Book", on_delete=models.SET_NULL, null=True) imprint = models.CharField(max_length=200) @@ -38,11 +36,7 @@ class BookLoan(models.Model): ) borrower = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True) status = models.CharField( - max_length=1, - choices=LOAN_STATUS, - blank=True, - default="m", - help_text="Book availability", + max_length=1, choices=LOAN_STATUS, blank=True, default="m", help_text="Book availability", ) class Meta: diff --git a/tests/test_app/library/urls.py b/tests/test_app/library/urls.py index 739b60ea..f680509f 100644 --- a/tests/test_app/library/urls.py +++ b/tests/test_app/library/urls.py @@ -31,13 +31,7 @@ def make_messages(request): urlpatterns += i18n_patterns(path("admin/", admin.site.urls)) if settings.DEBUG: - urlpatterns.append( - re_path( - r"^static/(?P.*)$", - serve, - kwargs={"document_root": settings.STATIC_ROOT}, - ) - ) + urlpatterns.append(re_path(r"^static/(?P.*)$", serve, kwargs={"document_root": settings.STATIC_ROOT},)) if "debug_toolbar" in settings.INSTALLED_APPS: try: diff --git a/tests/test_customisation.py b/tests/test_customisation.py index 6aef6085..285355e4 100644 --- a/tests/test_customisation.py +++ b/tests/test_customisation.py @@ -55,8 +55,7 @@ def test_changeform_template_override(admin_client, settings): users_url = reverse("admin:auth_user_change", args=(user.pk,)) settings.JAZZMIN_SETTINGS = override_jazzmin_settings( - changeform_format="vertical_tabs", - changeform_format_overrides={"books.book": "carousel"}, + changeform_format="vertical_tabs", changeform_format_overrides={"books.book": "carousel"}, ) response = admin_client.get(books_url) diff --git a/tests/test_jazzmin_menus.py b/tests/test_jazzmin_menus.py index 249fdb44..f7b26bb0 100644 --- a/tests/test_jazzmin_menus.py +++ b/tests/test_jazzmin_menus.py @@ -21,21 +21,10 @@ def test_side_menu(admin_client, settings): assert parse_sidemenu(response) == { "Administration": ["/en/admin/admin/logentry/"], - "Authentication and Authorization": [ - "/en/admin/auth/group/", - "/en/admin/auth/user/", - ], - "Books": [ - "/en/admin/books/author/", - "/en/admin/books/book/", - "/en/admin/books/genre/", - ], + "Authentication and Authorization": ["/en/admin/auth/group/", "/en/admin/auth/user/",], + "Books": ["/en/admin/books/author/", "/en/admin/books/book/", "/en/admin/books/genre/",], "Global": ["/en/admin/"], - "Loans": [ - "/make_messages/", - "/en/admin/loans/bookloan/", - "/en/admin/loans/library/", - ], + "Loans": ["/make_messages/", "/en/admin/loans/bookloan/", "/en/admin/loans/library/",], } settings.JAZZMIN_SETTINGS = override_jazzmin_settings(hide_models=["auth.user"]) @@ -44,16 +33,8 @@ def test_side_menu(admin_client, settings): assert parse_sidemenu(response) == { "Global": ["/en/admin/"], "Authentication and Authorization": ["/en/admin/auth/group/"], - "Books": [ - "/en/admin/books/author/", - "/en/admin/books/book/", - "/en/admin/books/genre/", - ], - "Loans": [ - "/make_messages/", - "/en/admin/loans/bookloan/", - "/en/admin/loans/library/", - ], + "Books": ["/en/admin/books/author/", "/en/admin/books/book/", "/en/admin/books/genre/",], + "Loans": ["/make_messages/", "/en/admin/loans/bookloan/", "/en/admin/loans/library/",], "Administration": ["/en/admin/admin/logentry/"], } @@ -103,11 +84,7 @@ def test_top_menu(admin_client, settings): settings.JAZZMIN_SETTINGS = override_jazzmin_settings( topmenu_links=[ {"name": "Home", "url": "admin:index", "permissions": ["auth.view_user"]}, - { - "name": "Support", - "url": "https://github.com/farridav/django-jazzmin/issues", - "new_window": True, - }, + {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True,}, {"model": "auth.User"}, {"app": "books"}, ] @@ -117,10 +94,7 @@ def test_top_menu(admin_client, settings): assert parse_topmenu(response) == [ {"name": "Home", "link": "/en/admin/"}, - { - "name": "Support", - "link": "https://github.com/farridav/django-jazzmin/issues", - }, + {"name": "Support", "link": "https://github.com/farridav/django-jazzmin/issues",}, {"name": "Users", "link": "/en/admin/auth/user/"}, { "name": "Books", @@ -144,11 +118,7 @@ def test_user_menu(admin_user, client, settings): settings.JAZZMIN_SETTINGS = override_jazzmin_settings( usermenu_links=[ {"name": "Home", "url": "admin:index", "permissions": ["auth.view_user"]}, - { - "name": "Support", - "url": "https://github.com/farridav/django-jazzmin/issues", - "new_window": True, - }, + {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True,}, {"model": "auth.User"}, ] ) @@ -160,13 +130,7 @@ def test_user_menu(admin_user, client, settings): {"link": "/en/admin/password_change/", "name": "Change password"}, {"link": "/en/admin/logout/", "name": "Log out"}, {"link": "/en/admin/", "name": "Home"}, - { - "link": "https://github.com/farridav/django-jazzmin/issues", - "name": "Support", - }, + {"link": "https://github.com/farridav/django-jazzmin/issues", "name": "Support",}, {"link": "/en/admin/auth/user/", "name": "Users"}, - { - "link": "/en/admin/auth/user/{}/change/".format(admin_user.pk), - "name": "See Profile", - }, + {"link": "/en/admin/auth/user/{}/change/".format(admin_user.pk), "name": "See Profile",}, ] diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index ef00e779..59ae3b6f 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -32,21 +32,9 @@ def test_action_message_to_list(admin_user): ] log_entry = LogEntry.objects.create(user=admin_user, action_flag=CHANGE, change_message=json.dumps(message)) assert jazzmin.action_message_to_list(log_entry) == [ - { - "msg": "Changed Owner, Text, Pub date and Active.", - "icon": "edit", - "colour": "blue", - }, - { - "msg": "Added choice “More random choices”.", - "icon": "plus-circle", - "colour": "success", - }, - { - "msg": "Deleted “Person serious choose tea”.", - "icon": "trash", - "colour": "danger", - }, + {"msg": "Changed Owner, Text, Pub date and Active.", "icon": "edit", "colour": "blue",}, + {"msg": "Added choice “More random choices”.", "icon": "plus-circle", "colour": "success",}, + {"msg": "Deleted “Person serious choose tea”.", "icon": "trash", "colour": "danger",}, ] From e5067f1fbbf319ea5f6616fc2882b9def06d5ca6 Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Sat, 27 Feb 2021 00:26:53 +0100 Subject: [PATCH 09/10] Reformat with Black (correct version now). --- jazzmin/templatetags/jazzmin.py | 12 +++- jazzmin/widgets.py | 6 +- tests/test_admin_views.py | 4 +- .../books/management/commands/reset.py | 5 +- .../library/books/migrations/0001_initial.py | 66 ++++++++++++++++--- .../books/migrations/0002_book_library.py | 4 +- .../books/migrations/0004_book_pages.py | 6 +- .../library/loans/migrations/0001_initial.py | 21 ++++-- .../migrations/0002_auto_20201015_1222.py | 5 +- tests/test_app/library/loans/models.py | 10 ++- tests/test_app/library/settings.py | 4 +- tests/test_app/library/urls.py | 8 ++- tests/test_customisation.py | 3 +- tests/test_jazzmin_menus.py | 44 ++++++++++--- tests/test_templatetags.py | 18 ++++- 15 files changed, 177 insertions(+), 39 deletions(-) diff --git a/jazzmin/templatetags/jazzmin.py b/jazzmin/templatetags/jazzmin.py index 7175ffae..1ba1a7f4 100644 --- a/jazzmin/templatetags/jazzmin.py +++ b/jazzmin/templatetags/jazzmin.py @@ -85,13 +85,18 @@ def get_side_menu(context: Context, using: str = "available_apps") -> List[Dict] custom_link_names = [x.get("name", "").lower() for x in app_custom_links] model_ordering = list( - filter(lambda x: x.lower().startswith("{}.".format(app_label)) or x.lower() in custom_link_names, ordering,) + filter( + lambda x: x.lower().startswith("{}.".format(app_label)) or x.lower() in custom_link_names, + ordering, + ) ) if len(menu_items): if model_ordering: menu_items = order_with_respect_to( - menu_items, model_ordering, getter=lambda x: x.get("model_str", x.get("name", "").lower()), + menu_items, + model_ordering, + getter=lambda x: x.get("model_str", x.get("name", "").lower()), ) app["models"] = menu_items menu.append(app) @@ -426,7 +431,8 @@ def deleted(x: str) -> Dict: elif "changed" in sub_message: sub_message["changed"]["fields"] = get_text_list( - [gettext(field_name) for field_name in sub_message["changed"]["fields"]], gettext("and"), + [gettext(field_name) for field_name in sub_message["changed"]["fields"]], + gettext("and"), ) if "name" in sub_message["changed"]: sub_message["changed"]["name"] = gettext(sub_message["changed"]["name"]) diff --git a/jazzmin/widgets.py b/jazzmin/widgets.py index a3345d03..2fcd18d5 100644 --- a/jazzmin/widgets.py +++ b/jazzmin/widgets.py @@ -8,7 +8,8 @@ class JazzminSelect(Select): @property def media(self): return forms.Media( - css={"all": ("vendor/select2/css/select2.min.css",)}, js=("vendor/select2/js/select2.min.js",), + css={"all": ("vendor/select2/css/select2.min.css",)}, + js=("vendor/select2/js/select2.min.js",), ) @@ -22,5 +23,6 @@ def build_attrs(self, base_attrs, extra_attrs=None): @property def media(self): return forms.Media( - css={"all": ("vendor/select2/css/select2.min.css",)}, js=("vendor/select2/js/select2.min.js",), + css={"all": ("vendor/select2/css/select2.min.css",)}, + js=("vendor/select2/js/select2.min.js",), ) diff --git a/tests/test_admin_views.py b/tests/test_admin_views.py index 1a808700..b1b9a8d7 100644 --- a/tests/test_admin_views.py +++ b/tests/test_admin_views.py @@ -19,7 +19,9 @@ def test_login(client, admin_user): assert templates_used == ["admin/login.html"] response = client.post( - url + "?next=/admin/", data={"username": admin_user.username, "password": "password"}, follow=True, + url + "?next=/admin/", + data={"username": admin_user.username, "password": "password"}, + follow=True, ) assert response.status_code == 200 diff --git a/tests/test_app/library/books/management/commands/reset.py b/tests/test_app/library/books/management/commands/reset.py index 7110f1a9..14dbb91c 100644 --- a/tests/test_app/library/books/management/commands/reset.py +++ b/tests/test_app/library/books/management/commands/reset.py @@ -26,7 +26,10 @@ def handle(self, *args, **options): library = LibraryFactory() UserFactory( - username="test@test.com", email="test@test.com", password="test", is_superuser=True, + username="test@test.com", + email="test@test.com", + password="test", + is_superuser=True, ) users = UserFactory.create_batch(2, is_staff=False) diff --git a/tests/test_app/library/books/migrations/0001_initial.py b/tests/test_app/library/books/migrations/0001_initial.py index 145de1ee..6d2b51cf 100644 --- a/tests/test_app/library/books/migrations/0001_initial.py +++ b/tests/test_app/library/books/migrations/0001_initial.py @@ -14,27 +14,68 @@ class Migration(migrations.Migration): migrations.CreateModel( name="Author", fields=[ - ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID",),), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), ("first_name", models.CharField(max_length=100)), ("last_name", models.CharField(max_length=100)), ("date_of_birth", models.DateField(blank=True, null=True)), - ("date_of_death", models.DateField(blank=True, null=True, verbose_name="Died"),), + ( + "date_of_death", + models.DateField(blank=True, null=True, verbose_name="Died"), + ), ], - options={"ordering": ("last_name", "first_name"),}, + options={ + "ordering": ("last_name", "first_name"), + }, ), migrations.CreateModel( name="Genre", fields=[ - ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID",),), - ("name", models.CharField(help_text="Enter a book genre (e.g. Science Fiction)", max_length=200,),), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "name", + models.CharField( + help_text="Enter a book genre (e.g. Science Fiction)", + max_length=200, + ), + ), ], ), migrations.CreateModel( name="Book", fields=[ - ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID",),), + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), ("title", models.CharField(max_length=200)), - ("summary", models.TextField(help_text="Enter a brief description of the book", max_length=1000,),), + ( + "summary", + models.TextField( + help_text="Enter a brief description of the book", + max_length=1000, + ), + ), ( "isbn", models.CharField( @@ -46,9 +87,16 @@ class Migration(migrations.Migration): ("published_on", models.DateField()), ( "author", - models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="books.Author",), + models.ForeignKey( + null=True, + on_delete=django.db.models.deletion.SET_NULL, + to="books.Author", + ), + ), + ( + "genre", + models.ManyToManyField(help_text="Select a genre for this book", to="books.Genre"), ), - ("genre", models.ManyToManyField(help_text="Select a genre for this book", to="books.Genre"),), ], ), ] diff --git a/tests/test_app/library/books/migrations/0002_book_library.py b/tests/test_app/library/books/migrations/0002_book_library.py index 931910e0..f25bd281 100644 --- a/tests/test_app/library/books/migrations/0002_book_library.py +++ b/tests/test_app/library/books/migrations/0002_book_library.py @@ -18,7 +18,9 @@ class Migration(migrations.Migration): model_name="book", name="library", field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, related_name="books", to="loans.Library", + on_delete=django.db.models.deletion.CASCADE, + related_name="books", + to="loans.Library", ), ), ] diff --git a/tests/test_app/library/books/migrations/0004_book_pages.py b/tests/test_app/library/books/migrations/0004_book_pages.py index afa18c29..bc8897cc 100644 --- a/tests/test_app/library/books/migrations/0004_book_pages.py +++ b/tests/test_app/library/books/migrations/0004_book_pages.py @@ -10,5 +10,9 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AddField(model_name="book", name="pages", field=models.IntegerField(null=True),), + migrations.AddField( + model_name="book", + name="pages", + field=models.IntegerField(null=True), + ), ] diff --git a/tests/test_app/library/loans/migrations/0001_initial.py b/tests/test_app/library/loans/migrations/0001_initial.py index 9f0daa74..5228b7f0 100644 --- a/tests/test_app/library/loans/migrations/0001_initial.py +++ b/tests/test_app/library/loans/migrations/0001_initial.py @@ -19,7 +19,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name="Library", fields=[ - ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"),), + ( + "id", + models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), + ), ("address", models.CharField(max_length=255)), ( "librarian", @@ -49,13 +52,21 @@ class Migration(migrations.Migration): "status", models.CharField( blank=True, - choices=[("m", "Maintenance"), ("o", "On loan"), ("a", "Available"), ("r", "Reserved"),], + choices=[ + ("m", "Maintenance"), + ("o", "On loan"), + ("a", "Available"), + ("r", "Reserved"), + ], default="m", help_text="Book availability", max_length=1, ), ), - ("book", models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="books.Book"),), + ( + "book", + models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to="books.Book"), + ), ( "borrower", models.ForeignKey( @@ -63,6 +74,8 @@ class Migration(migrations.Migration): ), ), ], - options={"ordering": ("due_back",),}, + options={ + "ordering": ("due_back",), + }, ), ] diff --git a/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py b/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py index 6f6779d7..08e55e19 100644 --- a/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py +++ b/tests/test_app/library/loans/migrations/0002_auto_20201015_1222.py @@ -10,7 +10,10 @@ class Migration(migrations.Migration): ] operations = [ - migrations.AlterModelOptions(name="library", options={"verbose_name_plural": "Libraries"},), + migrations.AlterModelOptions( + name="library", + options={"verbose_name_plural": "Libraries"}, + ), migrations.AddField( model_name="library", name="name", diff --git a/tests/test_app/library/loans/models.py b/tests/test_app/library/loans/models.py index 6b5646b3..c7822cc9 100644 --- a/tests/test_app/library/loans/models.py +++ b/tests/test_app/library/loans/models.py @@ -19,7 +19,9 @@ def __str__(self): class BookLoan(models.Model): id = models.UUIDField( - primary_key=True, default=uuid4, help_text="Unique ID for this particular book across whole library", + primary_key=True, + default=uuid4, + help_text="Unique ID for this particular book across whole library", ) book = models.ForeignKey("books.Book", on_delete=models.SET_NULL, null=True) imprint = models.CharField(max_length=200) @@ -36,7 +38,11 @@ class BookLoan(models.Model): ) borrower = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True, blank=True) status = models.CharField( - max_length=1, choices=LOAN_STATUS, blank=True, default="m", help_text="Book availability", + max_length=1, + choices=LOAN_STATUS, + blank=True, + default="m", + help_text="Book availability", ) class Meta: diff --git a/tests/test_app/library/settings.py b/tests/test_app/library/settings.py index 167d4eae..fcfee58a 100644 --- a/tests/test_app/library/settings.py +++ b/tests/test_app/library/settings.py @@ -73,7 +73,9 @@ DATABASES = { "default": dj_database_url.config( - env="DATABASE_URL", conn_max_age=500, default="sqlite:///{}".format(os.path.join(BASE_DIR, "db.sqlite3")), + env="DATABASE_URL", + conn_max_age=500, + default="sqlite:///{}".format(os.path.join(BASE_DIR, "db.sqlite3")), ) } diff --git a/tests/test_app/library/urls.py b/tests/test_app/library/urls.py index f680509f..739b60ea 100644 --- a/tests/test_app/library/urls.py +++ b/tests/test_app/library/urls.py @@ -31,7 +31,13 @@ def make_messages(request): urlpatterns += i18n_patterns(path("admin/", admin.site.urls)) if settings.DEBUG: - urlpatterns.append(re_path(r"^static/(?P.*)$", serve, kwargs={"document_root": settings.STATIC_ROOT},)) + urlpatterns.append( + re_path( + r"^static/(?P.*)$", + serve, + kwargs={"document_root": settings.STATIC_ROOT}, + ) + ) if "debug_toolbar" in settings.INSTALLED_APPS: try: diff --git a/tests/test_customisation.py b/tests/test_customisation.py index 285355e4..6aef6085 100644 --- a/tests/test_customisation.py +++ b/tests/test_customisation.py @@ -55,7 +55,8 @@ def test_changeform_template_override(admin_client, settings): users_url = reverse("admin:auth_user_change", args=(user.pk,)) settings.JAZZMIN_SETTINGS = override_jazzmin_settings( - changeform_format="vertical_tabs", changeform_format_overrides={"books.book": "carousel"}, + changeform_format="vertical_tabs", + changeform_format_overrides={"books.book": "carousel"}, ) response = admin_client.get(books_url) diff --git a/tests/test_jazzmin_menus.py b/tests/test_jazzmin_menus.py index 616848c5..582bc6f1 100644 --- a/tests/test_jazzmin_menus.py +++ b/tests/test_jazzmin_menus.py @@ -21,8 +21,15 @@ def test_side_menu(admin_client, settings): assert parse_sidemenu(response) == { "Administration": ["/en/admin/admin/logentry/"], - "Authentication and Authorization": ["/en/admin/auth/group/", "/en/admin/auth/user/",], - "Books": ["/en/admin/books/author/", "/en/admin/books/book/", "/en/admin/books/genre/",], + "Authentication and Authorization": [ + "/en/admin/auth/group/", + "/en/admin/auth/user/", + ], + "Books": [ + "/en/admin/books/author/", + "/en/admin/books/book/", + "/en/admin/books/genre/", + ], "Global": ["/en/admin/"], "Loans": [ "/make_messages/", @@ -38,7 +45,11 @@ def test_side_menu(admin_client, settings): assert parse_sidemenu(response) == { "Global": ["/en/admin/"], "Authentication and Authorization": ["/en/admin/auth/group/"], - "Books": ["/en/admin/books/author/", "/en/admin/books/book/", "/en/admin/books/genre/",], + "Books": [ + "/en/admin/books/author/", + "/en/admin/books/book/", + "/en/admin/books/genre/", + ], "Loans": [ "/make_messages/", "/en/admin/loans/bookloan/", @@ -94,7 +105,11 @@ def test_top_menu(admin_client, settings): settings.JAZZMIN_SETTINGS = override_jazzmin_settings( topmenu_links=[ {"name": "Home", "url": "admin:index", "permissions": ["auth.view_user"]}, - {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True,}, + { + "name": "Support", + "url": "https://github.com/farridav/django-jazzmin/issues", + "new_window": True, + }, {"model": "auth.User"}, {"app": "books"}, ] @@ -104,7 +119,10 @@ def test_top_menu(admin_client, settings): assert parse_topmenu(response) == [ {"name": "Home", "link": "/en/admin/"}, - {"name": "Support", "link": "https://github.com/farridav/django-jazzmin/issues",}, + { + "name": "Support", + "link": "https://github.com/farridav/django-jazzmin/issues", + }, {"name": "Users", "link": "/en/admin/auth/user/"}, { "name": "Books", @@ -128,7 +146,11 @@ def test_user_menu(admin_user, client, settings): settings.JAZZMIN_SETTINGS = override_jazzmin_settings( usermenu_links=[ {"name": "Home", "url": "admin:index", "permissions": ["auth.view_user"]}, - {"name": "Support", "url": "https://github.com/farridav/django-jazzmin/issues", "new_window": True,}, + { + "name": "Support", + "url": "https://github.com/farridav/django-jazzmin/issues", + "new_window": True, + }, {"model": "auth.User"}, ] ) @@ -140,7 +162,13 @@ def test_user_menu(admin_user, client, settings): {"link": "/en/admin/password_change/", "name": "Change password"}, {"link": "/en/admin/logout/", "name": "Log out"}, {"link": "/en/admin/", "name": "Home"}, - {"link": "https://github.com/farridav/django-jazzmin/issues", "name": "Support",}, + { + "link": "https://github.com/farridav/django-jazzmin/issues", + "name": "Support", + }, {"link": "/en/admin/auth/user/", "name": "Users"}, - {"link": "/en/admin/auth/user/{}/change/".format(admin_user.pk), "name": "See Profile",}, + { + "link": "/en/admin/auth/user/{}/change/".format(admin_user.pk), + "name": "See Profile", + }, ] diff --git a/tests/test_templatetags.py b/tests/test_templatetags.py index 59ae3b6f..ef00e779 100644 --- a/tests/test_templatetags.py +++ b/tests/test_templatetags.py @@ -32,9 +32,21 @@ def test_action_message_to_list(admin_user): ] log_entry = LogEntry.objects.create(user=admin_user, action_flag=CHANGE, change_message=json.dumps(message)) assert jazzmin.action_message_to_list(log_entry) == [ - {"msg": "Changed Owner, Text, Pub date and Active.", "icon": "edit", "colour": "blue",}, - {"msg": "Added choice “More random choices”.", "icon": "plus-circle", "colour": "success",}, - {"msg": "Deleted “Person serious choose tea”.", "icon": "trash", "colour": "danger",}, + { + "msg": "Changed Owner, Text, Pub date and Active.", + "icon": "edit", + "colour": "blue", + }, + { + "msg": "Added choice “More random choices”.", + "icon": "plus-circle", + "colour": "success", + }, + { + "msg": "Deleted “Person serious choose tea”.", + "icon": "trash", + "colour": "danger", + }, ] From db9a44d5778cbfb2ab6a9f49c51ace10a180074e Mon Sep 17 00:00:00 2001 From: Hielke Walinga Date: Wed, 14 Apr 2021 13:18:01 +0200 Subject: [PATCH 10/10] Moved some deps and added comments on deps. --- poetry.lock | 6 +++--- pyproject.toml | 4 ++-- tests/test_app/library/settings.py | 4 +++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/poetry.lock b/poetry.lock index 833b1fe0..409d8db8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -175,7 +175,7 @@ bcrypt = ["bcrypt"] name = "django-admin-numeric-filter" version = "0.1.6" description = "Numeric filters for Django admin" -category = "main" +category = "dev" optional = false python-versions = "*" @@ -186,7 +186,7 @@ django = "*" name = "django-admin-rangefilter" version = "0.7.0" description = "django-admin-rangefilter app, add the filter by a custom date range on the admin UI." -category = "main" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -1129,7 +1129,7 @@ testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] lock-version = "1.1" python-versions = ">=3.5" -content-hash = "f378b7700dc7ad3dabc3aa7dd7445bfb9fefdc86a94cc6107f4e0b40123e2820" +content-hash = "04f722cc8a85a13407310a729c78c4496dc48133c679ae6960e84c171fb6e00a" [metadata.files] appdirs = [ diff --git a/pyproject.toml b/pyproject.toml index 5238528c..9fdcaeb0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -43,8 +43,6 @@ exclude = ["tests", "docs"] [tool.poetry.dependencies] python = ">=3.5" django = ">=2" -django-admin-numeric-filter = "^0.1.6" -django-admin-rangefilter = "^0.7.0" [tool.black] line-length = 120 @@ -74,6 +72,8 @@ django-mptt = "^0.11.0" django-treebeard = "^4.3.1" django-import-export = "^2.4.0" dj-database-url = "^0.5.0" +django-admin-numeric-filter = "^0.1.6" +django-admin-rangefilter = "^0.7.0" [tool.poetry.urls] "Bug Tracker" = "https://github.com/farridav/django-jazzmin/issues" diff --git a/tests/test_app/library/settings.py b/tests/test_app/library/settings.py index c55722c4..e4672e7e 100644 --- a/tests/test_app/library/settings.py +++ b/tests/test_app/library/settings.py @@ -1,5 +1,5 @@ import os -from typing import Dict, Any +from typing import Any, Dict import dj_database_url from django.conf.global_settings import LANGUAGES as DJANGO_LANGUAGES @@ -18,8 +18,10 @@ INSTALLED_APPS = [ # Keep this above 'django.contrib.admin' "jazzmin", + # 3rd party app support demonstrated in test app (not a jazzmin requirement) "admin_numeric_filter", "rangefilter", + # Django apps "django.contrib.admin", "django.contrib.admindocs", "django.contrib.auth",