Определите содержание определенной группы с помощью auth_membership.group_id - PullRequest
0 голосов
/ 22 октября 2018

Я могу заставить зарегистрированных пользователей просматривать только то, что они публикуют, а не то, что публикуют другие, ниже приведен простой код, который я использовал.Теперь я хочу, чтобы только участники групп могли видеть только то, что публикуют члены их групп, а не члены других групп: как я могу изменить свой контроллер postsDetails , чтобы иметь возможностьдостичь этого?

МОДЕЛЬ

db.define_table('post',
            Field('body', 'text', requires=IS_NOT_EMPTY(), label='What is on your mind'),
            Field('posted_on', 'datetime', default=request.now, readable=False, writable=False),
            Field('posted_by', 'reference auth_user', default=auth.user_id, readable=False, writable=False))

КОНТРОЛЛЕР

@auth.requires_membership('firstGroup')
def index():
    form=SQLFORM(db.post)
    if form.process().accepted:
        response.flash=T('Entered')
    return locals()

@auth.requires_membership('firstGroup')
def postedDetails():
    user=db.auth_user(auth.user_id)
    if not user or not(user.id==auth.user_id): redirect(URL('index'))
    details=db(db.post.posted_by==user.id).select(db.post.ALL)
    return locals()

ПРОСМОТРЫ

index

{{extend 'layout.html'}}
{{=form}}
{{pass}

postsDetails

{{extend 'layout.html'}}
{{for details in details:}}
Post: {{=details.body}}<br />
Date & Time of Post: {{=details.posted_on}}<br />
Posted By: {{=details.posted_by.first_name}}<br />
{{pass}}

С уважением:

Mostwanted

1 Ответ

0 голосов
/ 22 октября 2018

Поскольку группа, связанная с сообщением, должна быть заморожена во время создания сообщения, необходимо добавить группу в запись сообщения:

В файле модели:

def get_group():
    groups = auth.user_groups
    if not groups:
        return None
    group_ids = [id for id in groups if not groups[id].startswith('user_')]
    return group_ids[0] if group_ids else None

db.define_table('post',
    Field('body', 'text', requires=IS_NOT_EMPTY(), label='What is on your mind'),
    Field('posted_on', 'datetime', default=request.now, readable=False, writable=False),
    Field('posted_by', 'reference auth_user', default=auth.user_id,
          readable=False, writable=False),
    Field('group', 'reference auth_group', default=get_group()

Обратите внимание, auth.user_groups - это словарь с идентификаторами групп, к которым пользователь относится в качестве ключей, и связанных ролей в качестве значений.Он сохраняется в сеансе и обновляется при каждом вызове auth.add_membership и auth.del_membership.По умолчанию в дополнение к любым группам, которые вы настраиваете, у каждого пользователя будет личная группа, которая начинается с «user_», поэтому вышеуказанная функция get_group отфильтровывает эту группу и возвращает идентификатор оставшейся группы в auth.user_groups,используя это значение в качестве значения по умолчанию для поля db.post.group.

Затем в контроллере:

@auth.requires_membership('firstGroup')
def postedDetails():
    user_group = get_group()
    details = db(db.post.group == user_group).select()
    return locals()

В качестве отступления в исходном коде:

@auth.requires_membership('firstGroup')
def postedDetails():
    user=db.auth_user(auth.user_id)
    if not user or not(user.id==auth.user_id): redirect(URL('index'))
    details=db(db.post.posted_by==user.id).select(db.post.ALL)
    return locals()

Во-первых, auth.user_id уже является идентификатором пользователя, поэтому нет необходимости вызывать db.auth_user(auth.user_id) просто для получения идентификатора.На самом деле, auth.user - это запись пользователя из db.auth_user, поэтому в общем случае нет необходимости вызывать db.auth_user(auth.user_id), даже если вам нужны другие поля в записи.

Второе, auth.requires_membershipтакже требует входа в систему, поэтому вторая строка исходной функции, которая проверяет пользователя и в противном случае перенаправляет, не требуется.

...