Поскольку группа, связанная с сообщением, должна быть заморожена во время создания сообщения, необходимо добавить группу в запись сообщения:
В файле модели:
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
также требует входа в систему, поэтому вторая строка исходной функции, которая проверяет пользователя и в противном случае перенаправляет, не требуется.