I think I've found the problem. In my Django version I have in `contrib/admin/sites.py` line 371:
has_module_perms = user.has_module_perms(app_label) Here it is instead: https://github.com/django/django/blob/master/django/contrib/admin/sites.py line 383: has_module_perms = model_admin.has_module_permission(request) I was probably reading the dev documentation of something that's not in Django 1.7 but will be in Django 1.8. https://github.com/django/django/commit/504c89e8008c557a1e83c45535b549f77a3503b2 Thanks! Andrea 2014-10-07 11:54 GMT+02:00 Daniel Rus Morales <[email protected]>: > I think it’s clear to me what you are trying to do. By overriding those > methods in BarAdmin you go down that line (bypass the django admin > permission system), but to get the app listed in the admin index page you > would have to actually rewrite the view function. This view function makes > an explicit verification on the add/change/delete permissions for the > logged in user and app Foo, and as long as your users don’t have them > granted for such app they can’t see it listed. > > Going back to my concern on overriding the permissions system, have you > considered getting the functionality by providing your staff users with > permissions at app Foo configuration time? That way your users would get > access and you would write less code. You would create a group and would > assign permissions to the group. At AppConfig.ready() you could assign your > users to the new group, and thus grant them access. > > Best, > Daniel > > > On 07 Oct 2014, at 11:25, Andrea <[email protected]> wrote: > > Dear Daniel, > > thank you for your answer. > I think I was not clear enough in explaining my problem. I will try to > rephrase the problem, please tell me if from the first message this point > was clear or seemed different. > > I do want that the user is able to add or change some objects. My goal is > to bypass the django admin permission system, and overriding > "has_*_permission" methods seemed the correct option. > > The following example is correlated but a bit simpler. Let's suppose I > grant the access to all the users to the admin panel (is_staff=True for > each user). > > Now I want them to be able to add an instance of Bar model. > > class BarAdmin(admin.ModelAdmin): > def has_add_permission(self, request): > return True > > def has_module_permission(self, request): > return True > > In my opinion that should do the trick, in fact the link to add a new > instance is enabled, but it's not shown in the admin index page (and that's > my problem). > What I do not want to do is to specifically assign the `foo.add_bar` > permission under the `permissions` section in the user profile for each > user. > > Thanks for your time spent in tackling this issue. > > Andrea > > 2014-10-07 11:01 GMT+02:00 Daniel Rus Morales <[email protected]>: > >> Hi Andrea, >> >> I answer below in between lines. >> >> On 07 Oct 2014, at 08:53, Andrea <[email protected]> wrote: >> >> Let's suppose I have a Foo app with a Bar model with a owner field. I >> want a user to be able to edit all the instances for which obj.owner == >> request.user. >> >> The model appears correctly in the admin panel for superusers and for >> users for which I have explicitly assigned the permission change_bar or >> add_bar, as explained here >> <https://docs.djangoproject.com/en/dev/topics/auth/default/#topic-authorization> >> : >> >> Assuming you have an application with an app_label foo and a model named >> Bar, to test for basic permissions you should use: >> >> add: user.has_perm('foo.add_bar') >> change: user.has_perm('foo.change_bar') >> delete: user.has_perm('foo.delete_bar') >> >> How can I show the model Bar in the admin index list without explicitly >> assigning foo.change_bar or foo.add_bar to the user? >> >> >> You can’t. The admin interface of Django assumes that when a user has >> access to the administrative interface of an App-Model it’s not to act as a >> mere passive consumer with read-only access but rather as an active admin >> over the content (add, change, delete). An administrator who does only >> inspect or supervise the content doesn’t fit in the sort of administrator >> that the Django administration app allows. It’s like allowing an >> administrator who actually does not administer. >> >> So far I tried the following, expecting the Bar model to appear in the >> index list page, but it didn't work. >> >> class BarAdmin(admin.ModelAdmin): >> def get_queryset(self, request): >> qs = super(BarAdmin, self).get_queryset(request) >> if request.user.is_superuser: >> return qs >> return qs.filter(owner=request.user) >> >> def has_add_permission(self, request): >> return True >> >> def has_change_permission(self, request, obj=None): >> if obj is None: >> return True >> if obj.owner == request.user: >> return True >> return False >> >> def has_delete_permission(self, request, obj=None): >> if obj is None: >> return True >> if obj.owner == request.user: >> return True >> return False >> >> def has_module_permission(self, request): >> return True >> >> Accessing the link admin/foo/bar/ works correctly for every user and >> returns the list of Bar instances for which obj.owner == request.user. >> admin/foo/bar/add allows the user to add a new object correctly. These >> links are although not displayed in the admin index page: which is the >> function that triggers the appearance of the model in the index page? >> admin/foo/ returns 403 Forbidden. >> >> >> Uhm… this looks strange to me. So you don’t want to provide the user with >> add/change/delete permissions but you are faking them. >> >> The Bar model doesn’t appear in the App index list page because the view >> function in charge first verifies whether the user has any of the >> add/change/delete permissions granted for such App, and given that your >> user doesn’t have them the App Foo is not listed. In other words, you would >> have to override the index admin view too (in >> django.contrib.admin.sites.py), which I don’t recommend. Think that by >> overriding the way permissions are handled in the admin interface you might >> end up giving change access to regular users that shouldn’t have access at >> all. >> >> My recommendation here is to create your own supervising interface for >> Foo, with its own URLs, to provide the readonly functionality your target >> users needs. Those users might not probably fall in the category of admins. >> I’m thinking in maybe managers who need to see what’s going on but doesn’t >> have to have write access. >> >> Does this answer your questions? >> >> I'm using Django 1.7 >> >> Thanks, >> >> Andrea >> >> >> Cheers, >> Daniel >> >> > > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/django-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/CAAPQ7Y2DOSaYnScD68Ev-Mh%3D%2B6tH_GMrcKUrDOfsV76fX8OM_g%40mail.gmail.com > <https://groups.google.com/d/msgid/django-users/CAAPQ7Y2DOSaYnScD68Ev-Mh%3D%2B6tH_GMrcKUrDOfsV76fX8OM_g%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > > > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAAPQ7Y2q-RO3FdUjfBd6SLfCNLHE2dX8WVZOSSM-Z5X0d03OCA%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

