(Beta) Simple and flexible way to swap default Django User
Project description
Django-Swap-User (Beta)
About
If you are tired from copying one custom user model from one project to another ones - use this package. This will do all for you.
Installation
pip install django-swap-user
Basic usage
- Choose one of models that suits for you and copy related settings from the table:
Application name | Username field | Description | INSTALLED_APPS |
AUTH_USER_MODEL |
---|---|---|---|---|
swap_to_email |
email |
User with email username |
"swap_user", "swap_to_email", |
"to_email.swap_to_email" |
swap_to_named_email |
email |
User with email username, first_name and last_name extra fields |
"swap_user", "swap_to_named_email", |
"swap_to_named_email.NamedEmailUser" |
swap_to_phone |
phone |
User with phone username |
"swap_user", "swap_to_phone", |
"swap_to_phone.PhoneUser" |
swap_to_phone_otp |
phone |
User with phone username and OTP authentication |
"swap_user", "swap_to_phone_otp", |
"swap_to_phone_otp.PhoneOTPUser" |
- Add corresponding app to
INSTALLED_APPS
:
INSTALLED_APPS = [
...
"swap_user",
"swap_to_named_email",
...
]
- Change
AUTH_USER_MODEL
to corresponding:
AUTH_USER_MODEL = "swap_to_named_email.NamedEmailUser"
- Apply migrations:
python manage.py migrate swap_to_named_email
Architecture
Application swap_user
split into 3 apps:
to_email
- provides user withemail
username fieldto_named_email
- provides user withemail
username field and withfirst_name
,last_name
extra fieldsto_phone
- provides user withphone
username fieldto_phone_otp
- provides user withphone
username field and with OTP authentication
Why so unusual architecture?
Because if we leave them in one app, they all will create migrations and tables - such approach leads us to redundant tables. They will be treated as 3 custom models within the same app, which causes perplexing and cognitive burden.
With such approach (when there is a common app which contains internal apps) - the user choose and connect only the specific user model which suits best for concrete business-logic.
I have found such approach at Django REST Framework authtoken
application and decide to use it - reference is here.
Providing User model at start of project
When you are starting a project from zero or scratch - this is a best moment to provide custom User model. Because you have't a lot of migrations or you can easily regenerate them. Moreover, Django's official docs recommend to provide custom User model even if you are fully satisfied with default one - in future it will be easier to extend custom model that fits into your business cases.
Providing User model at mid of project
This is a harder way of doing things, but it is still possible to do:
- Do all the steps at testing database and ONLY IF all of them was successful - try to apply at production environment
- Please note that these steps are common - they fit in most cases, but in some circumstances you need act on situation.
- Create a backup of your database
- Add stable tag into your repository or save a commit hash reference
- Pray to the heavens
- Remove all of yours migrations in every app of Django's project
- Remove all records from
django_migrations
table, for example with SQLTRUNCATE django_migrations
- Now we have a "clean" state, so we can change default model
- Generate new migrations for all of your applications -
python manage.py makemigrations
- Install this library and follow all instructions
- Now we need to fake migrate because we already have all the tables with data -
python manage.py migrate --fake
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for django_swap_user-0.5.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3807888a247de7e617606eb3e1ec4201553d774ac7f2b8dc76eefc8adb05bc12 |
|
MD5 | 2897df4abe3778274b30a84d060db5c2 |
|
BLAKE2b-256 | 244b1a10610dc57f32ffdc4e55a5991feee461b7baa304207a6083ed84a02b92 |