Обработчик сигнала Django, который отслеживает изменения в группах и разрешениях? - PullRequest
2 голосов
/ 09 июня 2011

Я бы хотел зарегистрировать обработчик сигнала в модели User, который выглядит примерно так:

def post_save_handler(sender, instance, created, **kwargs): 
    should_have_profile = instance.has_perm('profile.should_have')

    if should_have_profile: 
        profile, created = Profile.objects.get_or_create(user=instance)
        if crated: 
            profile.save() 
    else: 
        old_profile = Profile.objects.filter(user=instance)
        if old_profile: 
            old_profile.delete() 

Но в обработчике сигналов тест для has_perm для нового разрешения (который был добавлен или удален в коде представления посредством изменения членства в группе) не проходит корректно. Как будто новые группы еще не были применены.

Я кратко заподозрил _group_perm_cache и _perm_cache в contrib.auth.backends.py, но я увеличил свой обработчик сигналов, чтобы удалить эти значения из входящего экземпляра, и результат тот же.

Все, что я могу предположить, - это то, что любые изменения в текущих группах для этого пользователя не передаются. Я также попытался зарегистрировать прослушиватель m2m_changed на объекте User для этой цели, но он также не вызывался (вероятно, потому что User.groups не реализован как ManyToManyField).

Есть ли способ правильно сделать то, что я хочу?

1 Ответ

0 голосов
/ 09 июня 2011

m2m_changed включает аргумент, который сообщает, на какой стороне отношения произошло изменение, так что это подразумевает, что оно будет работать в обоих направлениях. Группы M2M, но ManyToManyField использует модель Group, а не модель User. Возможно, что если вы передаете sender в методе connect, то на самом деле он должен быть Group, потому что именно там находится ManyToManyField. Не уверен в этом, но это единственное, о чем я могу подумать, почему ваш m2m_changed сигнал не был бы отправлен.

...