Переопределение команды управления check_permissions в django-userena для исправления разрешений для django-oscar
Я пытаюсь использовать django-userena с django-oscar. Пока что это работает хорошо, за исключением случаев, когда я пытаюсь связать внештатного пользователя с партнером по исполнению (связь с штатным пользователем работает нормально). Вот ошибка, которую я получаю:
Traceback:
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
112. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/db/transaction.py" in inner
371. return func(*args, **kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/contrib/auth/decorators.py" in _wrapped_view
22. return view_func(request, *args, **kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/views/generic/base.py" in view
69. return self.dispatch(request, *args, **kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/views/generic/base.py" in dispatch
87. return handler(request, *args, **kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/oscar/apps/dashboard/partners/views.py" in post
219. if self.link_user(user, partner):
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/oscar/apps/dashboard/partners/views.py" in link_user
206. content_type__app_label='partner')
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/db/models/manager.py" in get
151. return self.get_queryset().get(*args, **kwargs)
File "/Users/shafiquejamal/allfiles/htdocs/venvs/av4env/lib/python2.7/site-packages/django/db/models/query.py" in get
310. self.model._meta.object_name)
Exception Type: DoesNotExist at /en/store/dashboard/partners/1/users/380/link/
Exception Value: Permission matching query does not exist.
Кажется, что проблема в oscar.apps.dashboards.partners.views
:
class PartnerUserLinkView(generic.View):
def link_user(self, user, partner):
"""
Links a user to a partner, and adds the dashboard permission if needed.
Returns False if the user was linked already; True otherwise.
"""
if partner.users.filter(pk=user.pk).exists():
return False
partner.users.add(user)
if not user.is_staff:
dashboard_access_perm = Permission.objects.get(
codename='dashboard_access',
content_type__app_label='partner')
user.user_permissions.add(dashboard_access_perm)
return True
Permission.objects.get
не возвращает объект. Это потому что check_permissions
команда в django-userena
проверяет следующие разрешения:
ASSIGNED_PERMISSIONS = {
'profile':
(('view_profile', 'Can view profile'),
('change_profile', 'Can change profile'),
('delete_profile', 'Can delete profile')),
'user':
(('change_user', 'Can change user'),
('delete_user', 'Can delete user'))
}
который, не включает dashboard_access
, Я пытался добавить другое разрешение профиля ('dashboard_access', _('Can access dashboard')),),
в ASSIGNED_PERMISSIONS.profile
, но это не сработало - я все еще получил ту же ошибку выше. Я думаю, что проблема в том, что даже если dashboard_access
является одним из разрешений, link_user
метод определяет content_type__app_label='partner'
, но content_type__app_label
никогда partner
(partner
является одним из приложений Оскар). Так что я думаю, я должен переопределить check_permissions
Команда управления для проверки разрешений в гостях, которая вмещает Джанго-Оскар. Мои вопросы:
Как переопределить или расширить
check_permissions
команда управления, не касаясь кода в моей виртуальной среде? Я обратился к https://docs.djangoproject.com/en/1.6/howto/custom-management-commands/ и начал с копирования кода Manager.py изuserena
кmanagement/commands
Папка в моем проекте, но получил команду не реализована ошибка.Как изменить разрешения на проверку, чтобы они ссылались на ярлык приложения "партнер"?
Я даже правильно говорю об этом? Может быть, я неправильно понимаю, как или
oscar
а такжеuserena
может работать вместе.
1 ответ
Я думаю, что я переосмыслил проблему. Кажется, что unlink_user
Метод удаляет объект разрешения, который link_user
метод ищет, что является одной из причин того, что последний метод не может найти объект разрешения (другая причина в том, что объект, возможно, не был создан в первую очередь). Я взломал вместе (не правда?) Решение, переопределив link_user
метод следующим образом:
# yourproject/dashboard/partners/views.py
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import Permission
from oscar.apps.dashboard.partners.views import PartnerUserLinkView as CorePartnerUserLinkView
class PartnerUserLinkView(CorePartnerUserLinkView):
def link_user(self, user, partner):
"""
Links a user to a partner, and adds the dashboard permission if needed.
Returns False if the user was linked already; True otherwise.
"""
if partner.users.filter(pk=user.pk).exists():
return False
partner.users.add(user)
if not user.is_staff:
try:
dashboard_access_perm = Permission.objects.get(
codename='dashboard_access',
content_type__app_label='partner')
except:
try:
my_content_type = ContentType.objects.get(name='partner',
app_label='partner',model='partner')
except:
my_content_type = ContentType.objects.create(name='partner',
app_label='partner',model='partner')
my_content_type.save()
my_permission = Permission.objects.create(name='partner',
content_type=my_content_type,codename='dashboard_access')
my_permission.save()
dashboard_access_perm = Permission.objects.get(
codename='dashboard_access',
content_type__app_label='partner')
user.user_permissions.add(dashboard_access_perm)
return True
Это работает для меня - с этим хаком я теперь могу связать внештатных пользователей с партнерами по выполнению.