django sub admin panel
Question:
I am working on the Django admin panel but now client is asking me that he need a functionality to create sub admin from the admin panel and provide some permission to sub admin
flow –
Here admin need a tab like sub admin management- admin will be able to create new admin by providing email, name photo, once admin submit the details of the sub admin link will be shared to the sub admin inputted email from where he can set his password,
admin will also have the functionality to provide different permission to different sub admin, will be able to change these permission in future
i have 6 application in admin where admin is admin to perform cur operation on user management, device management. i.e permission for sub admin will be for example sub admin can view user management but view and edit device management and so on.
Questions
- How we can register the sub admin? i.e to register the super admin we go to terminal and write the commands to register the sub admin now registration for sub admin is done from admin panel
- How we can provide different permission to the sub admin
- Do I need to create a new project that will contain the functionality of sub admin?
i have done a little R&D on the same I got one solution
- 2 level admin panel
Answers:
Create User and give permission to that user. You can define which module that user can access.
You can create permission group and assign or you can directly assign permissions to the new user , so that they will be able to access given access controls only.
To send email and allow subuser to update the task you can first create a model:
from django.db import models
from django.contrib.auth.models import User
class SubAdmin(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
photo = models.ImageField(upload_to='sub_admin_photos/')
permissions = models.ManyToManyField(Permission, blank=True)
def __str__(self):
return self.user.email
and then register newly created model in you dajngo admin panel:
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from .models import SubAdmin
class SubAdminInline(admin.StackedInline):
model = SubAdmin
can_delete = False
class CustomUserAdmin(UserAdmin):
inlines = (SubAdminInline, )
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
admin.site.register(SubAdmin)
You will need custom views to send email to your sub user:
from django.contrib.auth.tokens import default_token_generator
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
def send_sub_admin_invite_email(sub_admin):
subject = 'Invitation to join the team'
token_generator = default_token_generator
uid = urlsafe_base64_encode(force_bytes(sub_admin.user.pk))
token = token_generator.make_token(sub_admin.user)
message = render_to_string('sub_admin_invite_email.html', {
'sub_admin': sub_admin,
'uid': uid,
'token': token,
})
email = EmailMessage(subject, message, to=[sub_admin.user.email])
email.content_subtype = 'html'
email.send()
To assign different roles by super admin to your sub admin you will need a form:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import SubAdmin
class SubAdminCreationForm(UserCreationForm):
photo = forms.ImageField()
permissions = forms.ModelMultipleChoiceField(
queryset=Permission.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=False,
)
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'photo', 'permissions')
def save(self, commit=True):
user = super().save(commit=False)
user.is_staff = True
user.is_active = False
user.set_unusable_password()
if commit:
user.save()
sub_admin = SubAdmin.objects.create(user=user, photo=self.cleaned_data.get('photo'))
sub_admin.permissions.set(self.cleaned_data.get('permissions'))
send_sub_admin_invite_email(sub_admin)
return user
On my case mostly I used to use Django built-in permissions to manage the permissions:
from django.contrib.auth.decorators import user_passes_test
def sub_admin_required(view_func):
decorated_view_func = user_passes_test(
lambda u: u.is_active and u.sub_admin, login_url='/admin/login/')
return decorated_view_func(view_func)
@sub_admin_required
def sub_admin_dashboard(request):
return render(request, 'sub_admin_dashboard.html')
This is my rough idea on how you can create sub-admin and assign different roles while giving them opportunity to update their profile related things.
I am working on the Django admin panel but now client is asking me that he need a functionality to create sub admin from the admin panel and provide some permission to sub admin
flow –
Here admin need a tab like sub admin management- admin will be able to create new admin by providing email, name photo, once admin submit the details of the sub admin link will be shared to the sub admin inputted email from where he can set his password,
admin will also have the functionality to provide different permission to different sub admin, will be able to change these permission in future
i have 6 application in admin where admin is admin to perform cur operation on user management, device management. i.e permission for sub admin will be for example sub admin can view user management but view and edit device management and so on.
Questions
- How we can register the sub admin? i.e to register the super admin we go to terminal and write the commands to register the sub admin now registration for sub admin is done from admin panel
- How we can provide different permission to the sub admin
- Do I need to create a new project that will contain the functionality of sub admin?
i have done a little R&D on the same I got one solution
- 2 level admin panel
Create User and give permission to that user. You can define which module that user can access.
You can create permission group and assign or you can directly assign permissions to the new user , so that they will be able to access given access controls only.
To send email and allow subuser to update the task you can first create a model:
from django.db import models
from django.contrib.auth.models import User
class SubAdmin(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
photo = models.ImageField(upload_to='sub_admin_photos/')
permissions = models.ManyToManyField(Permission, blank=True)
def __str__(self):
return self.user.email
and then register newly created model in you dajngo admin panel:
from django.contrib import admin
from django.contrib.auth.models import User
from django.contrib.auth.admin import UserAdmin
from .models import SubAdmin
class SubAdminInline(admin.StackedInline):
model = SubAdmin
can_delete = False
class CustomUserAdmin(UserAdmin):
inlines = (SubAdminInline, )
admin.site.unregister(User)
admin.site.register(User, CustomUserAdmin)
admin.site.register(SubAdmin)
You will need custom views to send email to your sub user:
from django.contrib.auth.tokens import default_token_generator
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_encode
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.conf import settings
def send_sub_admin_invite_email(sub_admin):
subject = 'Invitation to join the team'
token_generator = default_token_generator
uid = urlsafe_base64_encode(force_bytes(sub_admin.user.pk))
token = token_generator.make_token(sub_admin.user)
message = render_to_string('sub_admin_invite_email.html', {
'sub_admin': sub_admin,
'uid': uid,
'token': token,
})
email = EmailMessage(subject, message, to=[sub_admin.user.email])
email.content_subtype = 'html'
email.send()
To assign different roles by super admin to your sub admin you will need a form:
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from .models import SubAdmin
class SubAdminCreationForm(UserCreationForm):
photo = forms.ImageField()
permissions = forms.ModelMultipleChoiceField(
queryset=Permission.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=False,
)
class Meta:
model = User
fields = ('email', 'first_name', 'last_name', 'photo', 'permissions')
def save(self, commit=True):
user = super().save(commit=False)
user.is_staff = True
user.is_active = False
user.set_unusable_password()
if commit:
user.save()
sub_admin = SubAdmin.objects.create(user=user, photo=self.cleaned_data.get('photo'))
sub_admin.permissions.set(self.cleaned_data.get('permissions'))
send_sub_admin_invite_email(sub_admin)
return user
On my case mostly I used to use Django built-in permissions to manage the permissions:
from django.contrib.auth.decorators import user_passes_test
def sub_admin_required(view_func):
decorated_view_func = user_passes_test(
lambda u: u.is_active and u.sub_admin, login_url='/admin/login/')
return decorated_view_func(view_func)
@sub_admin_required
def sub_admin_dashboard(request):
return render(request, 'sub_admin_dashboard.html')
This is my rough idea on how you can create sub-admin and assign different roles while giving them opportunity to update their profile related things.