django-jutil
============
Collection of small utilities for Django and Django REST framework projects.
Django 3.0 compatible.
[](https://codecov.io/gh/kajala/django-jutil)
[](https://travis-ci.org/kajala/django-jutil)
Features
========
* Simplified admin changes history logging (admin_log)
* ModelAdmin with length limited history view (ModelAdminBase)
* Simplified object URL/link generation within admin (admin_obj_link and admin_obj_url)
* Extended admin log with changed field values and user IP (ModelAdminBase)
* Admin file download mixin with file permission checks (AdminFileDownloadMixin)
* User authentication helpers (require_auth, AuthUserMixin)
* Mixin for cached model fields management (CachedFieldsMixin)
* BaseCommand extension which catches, logs and emails errors (SafeCommand)
* Command options for simplified handling of date ranges (add_date_range_arguments, parse_date_range_arguments)
* Various utilities for date ranges generation and iteration (dates.py)
* Utilities for dict sorting and formatting, choices list label fetching (dict.py)
* Simplified email sending via SendGrid API (send_email)
* Various formatting utilities (e.g. XML, timedelta, Decimal)
* Decimal encoder for encoding JSON objects/dictionaries containing Decimal instances (SimpleDecimalEncoder)
* Django middleware for exception logging/emailing (LogExceptionMiddleware)
* Django middleware for language cookie handling (EnsureLanguageCookieMiddleware)
* Django middleware for user.profile.timezone based timezone activation
* Utilities or Django Model handling (e.g. clone_model, get_object_or_none)
* Utilities for parsing booleans and datetime values (using pytz)
* Simple user field based permission checking for REST APIs (permissions.py)
* Geo IP / IP info functions using IPStack API (request.py)
* Download responses (FileSystemFileResponse and CsvFileResponse)
* Simple SMS sending (send_sms)
* Mixin for basic test user setup (DefaultTestSetupMixin)
* Pretty good unit test coverage (tests.py)
* URL modifying/comparison functions (urls.py)
* Validators and filters for various types (validators.py)
* XML Element to/from dict conversions (dict_to_element, xml_to_dict)
* XML file/content pretty formatting (format_xml, format_xml_bytes, format_xml_file, FormattedXmlResponse)
Install
=======
pip install django-jutil
Notes About Features
====================
Extended Admin Logging
----------------------
jutil.ModelAdminBase supports (by default) extended logging using Django's native LogEntry' change_message
JSON field. Normally Django logs only field verbose names but jutil implementation
logs changed field names and values and user IP as well to the same change_message JSON field.
To actually show output from this extended logging data you need to format change_message using
format_change_message_ex filter. The default ModelAdminBase object history template (jutil/admin/object_history.html) uses it.
Static Code Analysis
====================
The library passes both prospector and mypy checking. To install:
pip install prospector
pip install mypy
To analyze:
prospector
mypy .
Test Code Coverage
==================
* `coverage run manage.py; coverage report`
Notes About Email Configurations
================================
# Microsoft 365 (2022)
EMAIL_HOST = "smtp.office365.com"
EMAIL_PORT = 587
EMAIL_HOST_USER = (microsoft 365 email account)
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = (email password)
EMAIL_USE_TLS = True
EMAIL_TIMEOUT = 60
# SendGrid (2022)
EMAIL_SENDGRID_API_KEY = (api_key)
EMAIL_HOST = "smtp.sendgrid.net"
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = "apikey"
EMAIL_HOST_PASSWORD = (sendgrid api key)
Changes
=======
3.11.1:
* REMOVED: AdminLogEntryMixin, no longer needed as ModelAdminBase logs everything automatically
* REMOVED: admin_log_changed_fields, no longer needed as ModelAdminBase logs everything automatically
* RENAMED: get_model_keys -> get_model_field_names, for consistent naming with Django
3.7.4:
* Stricter get_media_full_path and is_media_full_path
3.7.3:
* Unit tests
* Get media full path cleanup
3.7.2:
* Cleanup
3.7.1:
* Requirements.txt: deleted optional dependency sendgrid, add sendgrid on project level sendgrid>=6.3.1,<7.0.0
* Deleted deprecated auth.require_auth, use auth.get_auth_user and auth.get_auth_user_or_none
* Deleted deprecated dict.choices_label and dict.dict_to_html, use format.choices_label and format.format_dict_as_html
* Deleted deprecated logs.*, use logging directly
* Deleted deprecated object.*, use type-safer alternatives
* Deleted deprecated url_equals and url_host, use urlparse directly
* Removed deprecated testing.*
* Cleaned up parse_datetime, parse_bool, parse_datetime_or_none and parse_bool_or_none
* Simpler cleaned up testing mixin TestSetupMixin
3.6.11:
* Deprecated object.get/set obj attr functions
* Deprecated url equals and url host
* Deprecated testing.DefaultTestSetupMixin
* Separated parse functions /w xxx or none versions for better typing support
* Dropped python-dateutil dependency, added unit tests for get time steps
* Deprecated log event
* Updated send_email_sendgrid docs
* Refactored choices label and dict to html in dict and format, added deprecation warnings
* Added --this-month, --this-week, --this-year to add date range arguments, get date range by name, parse date range arguments
* Require auth refactoring
* Removed AdminFileDownloadMixin - Django 3.1 has new logic for uploaded file URL format making the mixin obsolete
* (origin/master, origin/HEAD, master) README update
3.6.10:
* Unit test fix
* Log entry ordering fix
3.6.9:
* Minor refactoring
3.6.8:
* API testing client to support non-json content
* Parse bool unit test
3.6.7:
* Added format as html json and unit tests
3.6.6:
* Millisecond handling to format timedelta
* Deploy cleanup
* Python-dotenv
3.6.5:
* API testing tweaks
3.6.4:
* Mypy fix
* Unit test improvements, added support for FI ssns before 1900 and after 2000
* Test-coverage tweak
3.6.3:
* Code QA / Prospector fixes
* Added wait object or none and unit test
3.6.2:
* Added .env to ignore
3.6.1:
* Cleanup
* Dropped parse sftp connection (as redundant)
* Docs
3.5.3:
* Tweaks to usage of ipware
3.5.2:
* Minor refactoring
3.5.1:
* Upgrade of ipware to newer version
* Dev requirements change of psycopg2
3.4.9:
* Mypy fix
* Added get_ip() wrapper for ipware
3.4.8:
* Usage cleanup of ipware
3.4.7:
* Minor refactoring, added unit tests
3.4.6:
* More relaxed typing to admin log
* DB check to build process
3.4.5:
* Format table max col setting fix
* Fixed format table bug, added docs
3.4.4:
* Added User as explicit opt parameter to admin log
3.4.3:
* Minor refactoring
3.4.2:
* Added strip tag fields and unit tests
3.4.1:
* Type checking fixes
* Added middleware unit tests
* Changed ActivateUserProfileTimezone -> ActivateUserProfileTimezoneMiddleware to conform Django naming conventions
* Cleanup, docs
* Test-coverage script tweaks
* Added dependency-check to requirements-dev.txt
* .gitignore tweaks
3.3.6:
* Unit test fix
* Build process cleanup
* Cleanup
* Test-coverage script update
* Added htmlcov to ignore
3.3.5:
* Test fixes
* Admin obj url fix
3.3.4:
* Admin log type fix
3.3.3:
* Code QA
* Unit test improvements
* Updated travis test to python 3.8
3.3.2:
* Added camel case conversion funcs
3.3.1:
* Format timedelta cleanup
* Test-coverage script update
* Unit test fixes
* Re-enabled pytype
3.2.21:
* Email fix
3.2.20:
* Unit test coverage update
* Sendgrid email format fix
3.2.19:
* Added end_of_month() (as in Excel) and unit tests
* L10n
3.2.18:
* Type checking fixes
3.2.17:
* Type checking fixes
3.2.16:
* Type checking fixes
3.2.15:
* CachedFieldsMixin save() TYPE CHECKING fix
3.2.14:
* Type checking fix
* Readme updates
* MANIFEST tweaks
* Pre-release script tweaks
3.2.13:
* Added py.typed marker file
3.2.12:
* Mypy / cleanup
3.2.11:
* Test coverage update
* Added twine to dev reqs
* Deploy script update
3.2.10:
* Test coverage update
* Mypy support
3.2.9:
* Test coverage update
* Pre-release script tweaks
* Test coverage script tweaks
3.2.8:
* Travis sys import
* Added vanity icons to readme
3.2.7:
* Added sudo apt-get install -y libxml2-utils to travis
3.2.6:
* Travis log changes
3.2.5:
* Added travis config
3.2.4:
* Codecov tests
3.2.3:
* Added codecov.yml
3.2.2:
* Test coverage update
3.2.1:
* Dependency cleanup
3.1.4:
* Test coverage update
* Language cookie to use secure and httponly settings
* Updated LICENSE.txt
3.1.3:
* Test coverage update
* Cleanup
* IBAN generation
3.1.2:
* Test coverage update
* Config tweaks / pytype
3.1.1:
* Test coverage update
3.0.16:
* Test coverage update
* Code QA pytype tool integration to build process
3.0.15:
* Formatting options to format timedelta as 3h40min14s
3.0.14:
* Test coverage update
* Added helpers for media path handling
3.0.13:
* BIC validator
* Added body and subject to test email
3.0.12:
* Test coverage update
* CsvFileResponse -> CsvResponse to be consistent with naming of other responses
* Separate XmlResponse and XmlFileResponse
3.0.11:
* Test coverage update
* Cleanup
3.0.10:
* Test coverage update
* Cleanup
* Xml formatting error reporting
3.0.9:
* Test coverage update
* Xml content decoding fix on error
* L10n
* Email unit tests
3.0.8:
* Test coverage update
* Test email sending tweaks
* More unit tests
3.0.7:
* Test coverage update
* Pre-release step update
3.0.6:
* Deploy tweaks
* Added coverage report
* Cleanup, deleted format xml (unnecessary since multiple tools for that)
3.0.5:
* Changed SafeCommand to be compatible with BaseCommand on Exception return
3.0.4:
* Unit tests, refactoring
3.0.3:
* Added ucfirst and ucfirst lazy
3.0.2:
* Added format table
* Added test-coverage script
* Docs
3.0.1:
* Prospector 1.2.0 fixes
* Django 3.0 compatibility
2.4.14:
* Unit tests, model changed check
2.4.13:
* Assert tweaks
* File download admin tweaks
* Admin download link fix
2.4.12:
* Support for multiple file fields in AdminFileDownloadMixin
2.4.11:
* Prospector / code QA fixes
* Added SMTP based email support, logging
2.4.10:
* Deploy fix
2.4.9:
* Deploy cleanup and tweaks
2.4.8:
* Improved testing coverage
* Coverage tweaks
* Added .coverage to .gitignore
* Removed coverage
2.4.7:
* Noqa fixes (prospector)
* Added .coveragerc
* Doc tweaks
* Sftp connection string parsing cleanup
2.4.6:
* Sftp connection string parsing
2.4.5:
* Sendgrid api usage fix
2.4.4:
* Added base url support to admin links
2.4.3:
* Disabled sendgrid click tracking by default
2.4.2:
* Updated to use sendgrid v3 api, added cc and bcc support
2.4.1:
* Reg id -> org id name refactoring
2.3.5:
* Format keys option to dict to html
2.3.4:
* Added fi company reg id generator
2.3.3:
* Admin helper stweaks
* Admin file download tweak
* Pre-release process
* Docs
2.3.2:
* Deploy tweaks
* Prospector check to build
* Prospector clean
2.3.1:
* Code cleanup
2.2.43:
* Etree related refactoring
2.2.42:
* ElementTree usage fix
2.2.41:
* Updated requirements
* Cleaned up ugettext usage
2.2.40:
* ElementTree cleanup, issues related to isinstance() usage
2.2.39:
* Separate FormattedXmlResponse and FormattedXmlFileResponse
2.2.38:
* Added FormattedXmlResponse
2.2.37:
* Format xml bytes
2.2.36:
* Format xml file improvements
* Advanced xml formatting using xmllint
2.2.35:
* Sweden clearing code fixes
2.2.34:
* Localized actions list sorting
2.2.33:
* Dict to html unit test
* Dict to html fix
2.2.32:
* Improved dict formatting
2.2.31:
* Added some sanitizers to validators.py
2.2.30:
* Admin obj link None handling
2.2.29:
* Nordea Sweden clearing code additions
2.2.28:
* Minor refactoring
2.2.27:
* Added obj tools
2.2.26:
* Debug code cleanup
2.2.25:
* Fi ssn generator fix
2.2.24:
* Added fi ssn generator
2.2.23:
* Nordea/SE clearing number addition
* Deploy cleanup
2.2.22:
* Added changelist view download support to AdminFileDownloadMixin
2.2.21:
* Unit tests
* L10n check
* Cleanup
2.2.20:
* Generic country filtering
* Docs
2.2.19:
* Added one NordeaAB clearing code range
2.2.18:
* Fixed non-xmllint xml data formatting
* Added format xml command
2.2.17:
* Added format xml file helper
2.2.16:
* Media path stripping
2.2.15:
* Int conversion fix / validators
* Unit test tweaks
* Better unit tests
2.2.13:
* Added missing Nordea AB / Sweden clearing number
* Clarification / swedish clearing code
2.2.12:
* Added admin obj link and admin obj url
2.2.11:
* Sweden clearing code filtering
2.2.10:
* Reduced Swedbank account number length requirement
2.2.9:
* Unit tests
2.2.8:
* Dk bank info
2.2.7:
* Unit test
* Sparbanken Syd account number length
2.2.6:
* Belgium iban data to 4 spaces instead of 8
* Validation of all iban countries
2.2.5:
* Added be iban validator, refactoring validator code a bit
* Doc cleanup
2.2.4:
* Docs
2.2.3:
* Element tree cleanup
2.2.2:
* Unified xml.etree.ElementTree.Element usage
2.2.1:
* Adding BE (Belgium) bic bank to iban bic validators (thanks kutera/master)
2.1.24:
* Sweden bank const fix
2.1.23:
* Unit test fixes
* Swedish bank const cleanup
2.1.22:
* Swedish bank clearing code fixes
2.1.21:
* Validator return space fix
2.1.20:
* Added ascii filter and unit tests
2.1.19:
* Refactoring
* Swedish bank const php generation
2.1.18:
* Cleanup
2.1.17:
* Updated bank constants, added Sweden
2.1.16:
* Added ActivateUserProfileTimezone middleware
2.1.15:
* Upgraded external dependencies, added days to time delta
2.1.14:
* Upgraded external dependencies
2.1.13:
* Age calculation
2.1.12:
* Upgraded django
2.1.11:
* Iso payment ref validator
2.1.10:
* Email filtering tweaks
2.1.9:
* Email filter tweak
2.1.8:
* Dependency upgrade
2.1.7:
* Error message improvements
2.1.6:
* Selective cached fields update
2.1.5:
* Added simple email validator
2.1.4:
* Company reg id validator tweak
2.1.3:
* Dropped separate read/write views since Django supports this natively
2.1.2:
* Dependency upgrade
2.1.1:
* Upgraded version to match django version
1.2.11:
* Bank info unit test fix, upgraded libs
1.2.10:
* Admin log convention change: user system username instead of the first user in the system
1.2.9:
* Iban bank info convention change
* Tests
* Version bump
* Iban bank info to return None, None to be more consistent with normal output
1.2.7:
* Replaced freegeoip.net API with ipstack.com
1.2.6:
* Unit tests and cleanup
1.2.5:
* Prev 30d, 60d and 90d time ranges
1.2.4:
* 404 check
1.2.3:
* Docs and cleanup
1.2.2:
* Minor version bump
* Admin file download cleanup
1.1.12:
* File download response cleanup
1.1.11:
* SafeCommand return value
1.1.10:
* Parse requirements compatibility
1.1.9:
* Gz .gitignore
* Cleanup
* Parse requirements fix
1.1.8:
* Cleanup
* Replaced parse requirements (fix)
1.1.7:
* Replaced parse requirements
1.1.6:
* FI company reg id check filtering
1.1.5:
* Extended FI company reg id acceptance
1.1.4:
* Permissions fix
1.1.3:
* Renamed passwd -> setpass to avoid name collision with django extensions project
1.1.2:
* Tests
1.1.1:
* Cleanup
1.0.5:
* Removed obsolete SimpleJsonDecoder since Django has better one now
* Language cookie fix
1.0.4:
* Unit test fix
1.0.3:
* Fi bank const update
1.0.2:
* Unit tests
* Dependency fix
* Twine up
1.0.1:
* Cleanup
* Docs
1.0.0:
* Docs
* Github repository init