[Answered ]-Django admin site for limited privilege users

1πŸ‘

In admin you can make groups and assign access to models you wanted and same could be applied to users but you might be interested in limited access to models records to which logged user have itself added. in order to achieve this you have to define one column in model to foreign key to users like below I have defined model for company and assigned each company to user:

class Company(models.Model):

name = models.CharField(max_length=64, primary_key=True)
kam = models.ForeignKey(User, verbose_name='KAM', blank=True, null=True)
address = models.TextField(blank=True, null=True)
city = models.CharField(max_length=32, blank=True, null=True)
country = models.CharField(max_length=32, blank=True, null=True)
phone  = models.CharField(max_length=32, blank=True, null=True)
fax  = models.CharField(max_length=32, blank=True, null=True)
url = models.URLField(blank=True, null=True)


class Meta:
    verbose_name_plural = 'Companies'
    #unique_together = (('name', 'kam'),).

def __unicode__(self):
    return self.name

Now your model will be associated with user, Now you could restrict records to be loaded according to logged user using admin.py in modeladmin definition like given below:

def queryset(self, request):
    qs = super(CompanyAdmin, self).queryset(request)
    # If super-user, show all comments
    if request.user.is_superuser:
        return qs
    return qs.filter(kam=request.user)

thats simple let me know if this is what you want?

Also you could assign read only right. in model admin

πŸ‘€sharafjaffri

1πŸ‘

Admin uses a class ModelAdmin to render the page as you would probably already know. That class has a queryset method which you override based with a new filter, based on who is accessing the site, as suggested by sharafjaffri.

But that filtering alone isn’t sufficient. You also need to filter the values displayed in the dropdowns, to only those created by the user. And then when saved, you should associate the new object with the portal of the user adding it.

Here is my quick untested implementation of the same:

class PortalAdmin(admin.ModelAdmin):

    exclude = ('portal',)

    def queryset(self, request):
        """
        Filter the objects displayed in the change_list to only
        display those for the currently signed in user.
        """
        qs = super(UserAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        else:
            return qs.filter(portal=request.user.profile.portal) 

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        the_model = db_field.related.parent_model

        if hasattr(the_model,'portal'):
            kwargs['queryset'] = the_model.objects.filter(portal=request.portal)
        return super(PortalAdmin,self).formfield_for_foreignkey(db_field, request, **kwargs)

    def save_model(self, request, obj, form, change):
        if not change:
            obj.portal = request.portal
        obj.save()
πŸ‘€lprsd

Leave a comment