使用auth_membership.group_id标识特定的组内容

时间:2018-10-22 05:36:41

标签: web2py

我可以让注册用户仅查看他们发布的内容,而不查看其他人发布的内容,以下是我使用的简单代码。我现在想要的是如何仅让组成员查看其组成员发布的内容,而不查看其他组的成员: 如何更改我的 postedDetails控制器 以实现该目标?

模型

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

CONTROLLER

@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()

观看次数

索引

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

发布的详细信息

{{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}}

关于:

最想要的

1 个答案:

答案 0 :(得分:1)

由于与帖子相关的组必须在创建帖子时冻结,因此您应该将该组添加到帖子记录中:

在模型文件中:

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是一本词典,其中用户所属的组的ID作为键,而关联的角色作为值。它存储在会话中,并在每次调用auth.add_membershipauth.del_membership时进行更新。默认情况下,除了您设置的任何组外,每个用户还将有一个以“ user_”开头的个人组,因此上述get_group函数会过滤出该组并返回{{ 1}},使用该值作为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() 已经是用户的ID,因此没有理由仅调用auth.user_id来获取ID。实际上,db.auth_user(auth.user_id)auth.user中的用户记录,因此,即使您需要记录中的其他字段,通常也没有理由调用db.auth_user

第二,db.auth_user(auth.user_id)也需要登录,因此原始功能的第二行用于检查用户并重定向,否则是不必要的。