2013-08-12 2 views
0

У меня есть модель django с именем archive, которая связана с group (django auth) с помощью внешнего ключа. Чтобы пользователь мог что-то редактировать в этом архиве, они должны иметь разрешение на это через django-guardian. Я могу связать архив с группой, как показано в моем коде ниже, однако мне нужно иметь возможность устанавливать для каждого объекта объекты-объекты (архивы). Я пытаюсь сделать это, используя сигнал post_save или post_delete (для правильной защиты от сиротских разрешений).Django Assign-perm w/Post-Save Signal

Другими словами, вот шаги, которые я хочу выполнить. Посетите страницу администратора. Создать/Редактировать экземпляр Archive. Укажите на этой странице, какая группа пользователей будет связана с этим конкретным Archive.. При сохранении этого экземпляра Django должен автоматически аутентифицировать указанную группу с разрешениями «читать» для этого экземпляра Archive.

В каком файле я могу хранить Archive_post_save_handler? models.py? Как бы то ни было, я не могу назначить групповые разрешения, потому что я думаю, что мне не удается передать объекты через мои функции. Как я могу это сделать? Как вопрос с бонусом, будет ли этот крючок применяться, если я отредактировал модель через оболочку?

models.py

from django.db import models 
from django.contrib.auth.models import Group 
from django.db.models.signals import * 
from django.dispatch import receiver 

class Archive(models.Model): 
    name = models.CharField(max_length = 30) 
    nickname = models.CharField(max_length = 30, blank=True) 
    Group = models.ForeignKey(Group, blank=True, null=True, help_text='A group of users that are allowed access to the archive. This should typically be called the same thing as the archive name.') 

    class Meta: 
     permissions = (
      ('read', 'Read Archive'), 
     ) 

    def __unicode__(self): 
     return self.name 

@receiver(post_save, sender=Archive) 
def Archive_post_save_handler(sender, instance, **kwarks): 
    group = Group.objects.get(name=instance.Group) 
    assign_perm('read', group, instance) #what I primarily want to accomplish in this question is on this line 
+0

Моя проблема, похоже, устраняет фразу 'archive' в' assign_perm ('read', group, archive) '. Я не думаю, что у меня есть правильная переменная. – mh00h

ответ

2

Я думаю, что код, который вы вставили сюда вызовет рекурсивный вызов Archive_post_save_handler, потому что последняя строка кода будет также вызвать другой post_save сигнал. Вы должны получить аргумент created из kwargs, чтобы проверить, создан ли экземпляр в первый раз.

+0

Хм ... интересный. Я получаю сообщение об ошибке: «Максимальная глубина рекурсии превышена в cmp». Мне все еще нужна помощь, чтобы мой job_perm работал, хотя, если у вас есть идея; который весит больше со мной. Я отредактировал вопрос, чтобы это отразить. – mh00h

+1

Ну, сигнал будет вызываться из django admin или django shell. Что касается вашей проблемы, 1. Вы назначили пользователей экземпляру 'group'? 2. 'group = Group.objects.get (name = instance.Group)', почему не просто 'group = instance.Group' – toozoofoo

+0

Пользователи назначаются экземпляру группы. Я получаю 'не существует ошибки:' 'Запрос соответствия разрешений не существует. Параметры поиска были {'codename': u'read ',' content_type ': } '. Есть ли что-то еще, что принадлежит вместо последнего «экземпляра» моего кода? – mh00h

Смежные вопросы