Hi Picio, Luke and anyone else interested in challenging Django
problems like this,

For those new to this thread, Picio and I independently tried using
this recipe:
http://code.djangoproject.com/wiki/CookBookThreadlocalsAndUser
to create model managers that only permit a logged in user to see and
change their own records.

I think there are two levels to this problem. One has to do with the
correct syntax for using the threadlocals.get_current_user() in a
get_query_set filter. The other has to do with the way the Admin
ChangeList class obtains its list of objects.

Regarding the first issue, my test code in the manager like this (model
code is at the bottom of this post):

class ProjManager(models.Manager):
        def get_query_set(self):
        return(super(ProjManager,
self).get_query_set().filter(owner__exact = 1))
works in the manage.py shell. It filters out objects whose owner id !=
1.

But is is hard to test this syntax which we would like to use:
return(super(ProjManager, self).get_query_set().filter(owner__exact
=threadlocals.get_current_user()))
in the shell, because I haven't figured out how to log in from the
shell.

Regarding the second issue: when using the test manager above with the
hard coded owner id, in the Admin ChangeList interface, the entire list
of objects belonging to all owners is displayed. It should not., the
shell proved that the manager was filtering properly. The admin list is
not playing fair, and skipping the filter in the first manager example.

But, when I click on any of the listed objects not belonging to owner
id = 1, I get Page Not Found 404 error, so even though the list had the
name of the object, it could not actually fetch the object.

So the filter seems not to be observed by the part of the Admin
interface which provides objects to change_list.html, but not to the
object manipulator. I've been trying to read
django/contrib/admin/views/main.py which contains the ChangeList class,
but I'm afraid I'm not able to understand it well enough to solve this
problem.

Picio and I will be very grateful for any insight that can be provided.

Thanks,
Tom


class Project(models.Model):
        class Admin:
                pass

        owner = models.ForeignKey(User,related_name="owner",blank=True,
editable=False)
        last_edited_by =
models.ForeignKey(User,related_name="last_edited_by",blank=True)
        name = models.CharField(maxlength=100)
        time_added = models.DateTimeField(auto_now_add=True)
        time_modified = models.DateTimeField(auto_now=True)
        objects = ProjManager()
        allobjects = models.Manager()


--~--~---------~--~----~------------~-------~--~----~
 You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to