【问题标题】:Overriding the check_permissions management command in django-userena to fix permissions for django-oscar覆盖 django-userena 中的 check_permissions 管理命令以修复 django-oscar 的权限
【发布时间】:2014-07-10 20:27:14
【问题描述】:

我正在尝试将 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 不返回对象。这是因为django-userena 中的check_permissions 命令会检查以下权限:

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绝不是partnerpartner是奥斯卡应用程序之一)。所以我想我应该重写check_permissions 管理命令来检查适应django-oscar 的权限。我的问题是:

  1. 如何在不接触虚拟环境中的代码的情况下覆盖或扩展check_permissions 管理命令?我咨询了https://docs.djangoproject.com/en/1.6/howto/custom-management-commands/,并首先将managers.py 代码从userena 复制到我项目中的management/commands 文件夹,但得到了一个命令未实现错误。

  2. 如何修改检查权限以引用“合作伙伴”的应用标签?

  3. 我在这方面做得对吗?也许我误解了oscaruserena 如何或是否可以一起工作。

【问题讨论】:

    标签: django-oscar django-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
    

    这对我有用 - 通过这个 hack,我现在可以将非员工用户链接到履行合作伙伴。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-22
      • 2016-03-12
      • 2016-09-04
      • 1970-01-01
      • 2011-11-13
      • 2013-06-05
      • 2012-03-02
      • 2013-01-23
      相关资源
      最近更新 更多