Как проверить, есть ли у пользователя разрешение при просмотре всех разрешений? - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть модель с именем Account, которая связана с моделью пользователя по умолчанию.На данный момент я перебираю все разрешения, связанные с моделью учетной записи, но я также хочу проверить, есть ли у пользователя страницы профиля учетной записи одно или несколько определенных разрешений, которые проходят через него.Цель состоит в том, чтобы просто создать простой обзор.

Я также пытался проверить perms.cms.get_permission_codename.

models.py

class Account(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    site = models.CharField(max_length=50, choices=(('all', 'all'), ('danielk', 'danielk'), ('flis', 'flis'), ('vmusic', 'vmusic')), blank=True)
    site_role = models.CharField(max_length=50, choices=(('Administrator', 'Administrator'), ('Moderator', 'Moderator'), ('Editor', 'Editor')))
    phone_number = models.CharField(max_length=8)
    birth_date = models.DateField()
    street_adress = models.CharField(max_length=255)
    note = models.TextField(blank=True);
    zip_code = models.CharField(max_length=4)
    city = models.CharField(max_length=255)

    def formatedPhone(self, country=None):
        return phonenumbers.parse(Account.phone_number, "NO")

    """
    def __str__(self):
        return "%s %s" % (self.User.first_name, self.user.last_name)
    """

    def get_absolute_url(self):
        return reverse('account-detail', kwargs={'pk': self.pk})

    class Meta:
        verbose_name = 'Account meta'
        verbose_name_plural = 'Accounts meta'
        permissions = (
            ("has_user_hijack_permission", "Allows the user to log in as others"),
            ("has_user_management", "Allows a user to deactivate/delete other users"),
            ("has_user_site_edit", "Allows a user to edit site and role details"),
            ("has_user_takeout", "Can export user details"),
        )

views.py

class cms_users_user_permissions(generic.DetailView):
    model = Account
    template_name = 'cms/users/cms-users-user-permissions.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["permissions"] = Permission.objects.filter(content_type=ContentType.objects.get_for_model(Account))
        #context['permissions'] = Permission.objects.filter(content_type_id=7)
        return context

table.html

<table class="table is-fullwidth">
    <tbody>
        {% for permission in permissions %}
            <tr>
                <td style="width: 300px;">{{ permission.codename }}</td>
                 <td>{{ permission.name }}</td>

                 {% if account.user.has_perm %}
                     <td>
                         <span class="icon is-small">
                             <i class="fas fa-check-circle has-text-success"></i>
                         </span>
                     </td>
                  {% else %}
                      <td>
                          <span class="icon is-small">
                              <i class="fas fa-times-circle has-text-danger"></i>
                          </span>
                       </td>
                   {% endif %}
             </tr>
          {% endfor %}      
       </tbody>
   </table>

1 Ответ

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

Я не уверен, что вы на самом деле спрашиваете, но я попробую.

Если вы хотите проверить в шаблоне, имеет ли пользователь какое-либо из четырех разрешений, вы можете изменить

context["permissions"] = Permission.objects.filter(content_type=ContentType.objects.get_for_model(Account))

до

context["permissions"] = Permission.objects.filter(content_type=ContentType.objects.get_for_model(Account), user_set=self.request.user)

Поскольку Permission имеет отношение ManyToMany к User, user_set для экземпляра Permission будет содержать все Usersимея это разрешение.В результате context["permissions"] содержит только те права доступа Account, которые есть у User.Это означает, что в вашей таблице не отображаются разрешения, которых нет у пользователей, поэтому это может быть не то, что вам нужно.

Если у вас возникли проблемы с частью

 {% if account.user.has_perm %}

,есть 2 решения, которые приходят мне на ум;Статическое решение и динамическое решение.

Статический:
Так как в этом случае есть только 4 разрешения, вы также можете попробовать, что Тим Каманин делает в https://timonweb.com/posts/how-to-get-a-list-of-all-user-permissions-available-in-django-based-project/. Это будет означать, что вы удалите цикл и для каждого изВ 4 разрешения вы можете добавить блок, похожий на

{% if perm.account.has_user_hijack_permission %}
   <td>
      <span class="icon is-small">
        <i class="fas fa-check-circle has-text-success"></i>
      </span>
   </td>
{% else %}
   <td>
      <span class="icon is-small">
        <i class="fas fa-times-circle has-text-danger"></i>
      </span>
   </td>
{% endif %}

Динамический:
На Проверить разрешение внутри шаблона в Django написано, что {{ perms }} содержит все разрешения пользователяимеет, поэтому динамическое решение будет

{% for permission in permissions %}
  {% if permission in perms %}
   <td>
      <span class="icon is-small">
        <i class="fas fa-check-circle has-text-success"></i>
      </span>
   </td>
  {% else %}
   <td>
      <span class="icon is-small">
        <i class="fas fa-times-circle has-text-danger"></i>
      </span>
   </td>
  {% endif %}
{% endfor %}

Динамическое решение обладает большей гибкостью и является более RESTFUL, так как если вы расширяете запрос в context["permissions"] или добавляете дополнительные разрешения для класса Account, это все ещеработает.

--- редактирует учетные записи для комментариев ---

В случае, если вам нужны разрешения для User, к которому вы обращаетесь вместо User, который вывыполнив вход, вы можете, согласно Как получить разрешения пользователя? , заменить {{ perms }} на {{ accessed_user_permissions }} после добавления

context["accessed_user_permissions "] = user.user_permissions.all()

Обратите внимание, что это не включает разрешения группы,Если вы хотите включить разрешение groep, вам нужно сделать что-то вроде

context["accessed_user_permissions "] = user.user_permissions.all() | user.group_permissions.all()
...