Как сохранить записи и получить записи от имени другого пользователя - PullRequest
0 голосов
/ 12 февраля 2019

Я работаю над Django 1.5 Project.

Приложение содержит пользовательскую иерархию

Owner
Admin
Viewer
  • Владелец владеет всемиданные в базе данных.
  • Администраторы создаются владельцем и имеют разные учетные данные для входа.Можно добавлять / редактировать / удалять данные под владельцем.
  • Пользователи средства просмотра создаются владельцем и имеют разные учетные данные для входа.Может просматривать данные, созданные под владельцем.

Пользователи * Модель 1019 * имеет поле is_shared (булево) для идентификации основного пользователя и общего пользователя, и access_level отображаетсяв другой модели MultiUser .

Я подумал реализовать это следующим образом:

  1. Обновить все наборы настроек и поставить отметку в get_queryset.
  2. , где будет сделана первая проверка, если у пользователя есть is_shared=True
  3. , затем зарегистрируйте модель MultiUser ,
  4. получите user от MultiUser , а затем фильтруйте записи от имени пользователя.

Но это потребует изменений во всех наборах приложений.

Есть ли способ сделать это без внесения изменений во все приложение.Может быть 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 голосов
/ 20 мая 2019

Я решил эту проблему, создав промежуточное ПО с контентом

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 с пользовательским объектом владельца.,Это также предотвращает изменение владельца запроса для определенных путей, определенных в файле settings (например, профиль, пароль_перемены и т. Д.).

0 голосов
/ 12 февраля 2019

Вместо обновления всех наборов представлений вы можете использовать один базовый класс для работы.

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')
...