如何保存记录并代表另一个用户获取记录

时间:2019-02-12 06:21:30

标签: django django-1.5

我正在研究 Django 1.5 项目。

该应用程序包含的用户层次结构

Owner
Admin
Viewer
  
      
  • 所有者拥有数据库中的所有数据。
  •   
  • 管理员用户由所有者创建,并具有不同的登录凭据。可以在“所有者”下添加/编辑/删除数据。
  •   
  • 查看器用户由所有者创建,并具有不同的登录凭据。可以查看在所有者下创建的数据。
  •   

用户模型具有字段is_shared(布尔值)以标识主要用户和共享用户,并且access_level映射到另一个模型 MultiUser 中。

我已经考虑过以这种方式实现

  1. 更新所有视图集并签入get_queryset
  2. 如果用户具有is_shared=True,将在哪里进行第一次检查
  3. 然后检入 MultiUser 模型,
  4. MultiUser 获取user,然后代表用户过滤记录。

但这需要在整个应用程序视图集中进行更改。

是否可以在不更改整个应用程序的情况下执行此操作。 可能是middleware

  

编辑2:多用户模型

class MultiUser(models.Model):
    user = models.ForeignKey(User, related_name='owner_user')
    shared_user = models.ForeignKey(User, related_name='shared_user')
    access_level = models.CharField(max_length=50)

2 个答案:

答案 0 :(得分:1)

代替更新所有视图集,您可以使用单个基类来处理。

from django.http import HttpResponse
from django.views import View

class BaseView(View):
    def get_queryset(self, request):
        if request.user.is_shared:
            #some is_shared value
            u = MultiUser.objects.filter(user=request.user)
            if u.exists():
                return #some multiuser value
            else:
                return #some non multi user value

    class Meta:
        abstract=True

class MyView(BaseView):
    def get(self, request):
        q = self.get_queryset
        #view logic
        return HttpResponse('result')

class MyView2(BaseView):
    def get(self, request):
        q = self.get_queryset
        #view logic
        return HttpResponse('result')

答案 1 :(得分:0)

我通过创建一个具有内容的中间件来解决了这个问题

class MultiUserMiddleware(object):
    def process_request(self, request):
        """
        Check if user profile is is_shared=True
        If user is a shared user, get owner user from multi user
        and assign owner user to request.user

        Any multi user profile created by the owner user will work on behalf of the owner user
        """

        user = request.user
        if not user.is_anonymous():
            # if request.path in settings.MUTLIUSER_ALLOWED_PATH:
            #     return None

            # Search using wildcard
            if any(fnmatch(request.path, p) for p in settings.MUTLIUSER_ALLOWED_PATH):
                return None

            try:
                if user.profile.get().is_shared:
                    owner = MultiUser.objects.filter(shared_user=user)[0].user
                    request.user = owner
            except:
                return None

        return None

该中间件检查用户的帐户是否是基于is_shared的共享用户,然后使用所有者用户对象更改request.user。这也可以防止更改设置文件中定义的特定路径(例如,配置文件,change_password等)的请求所有者。