管理员(Admin)

oTree的管理员界面允许你创建会话,监控会话,并从会话中导出数据。

打开你的浏览器,网址为 http://localhost:8000/ 或你的服务器的URL。

密码保护

当你首次安装oTree后,整个管理员界面是不需要密码访问的。然而,当你准备向用户部署时,你应当用密码保护管理员界面。

如果你发起实验时想让访问者仅可通过所提供的开始链接进行游戏,将环境变量 OTREE_AUTH_LEVEL 设为 STUDY.

将你的网站上线并设为公开demo模式,也就是说任何人都可以游玩你游戏的demo版本(但不能完全访问管理员界面),设置 OTREE_AUTH_LEVELDEMO.

通常管理员的用户名是”admin”。你应当在环境变量 OTREE_ADMIN_PASSWORD 中设置你的密码(在Heroku中,登录到你的Heroku仪表盘,并将其定义为一个配置变量(config var))

如果你修改了管理员的用户名或者密码,你需要重置数据库。

参与人标签

不管使用 room 与否,你可以给每位参与人的开始链接添加 participant_label 参数来标识他们,比如通过名字,ID号码,电脑等。例如:

http://localhost:8000/room/my_room_name/?participant_label=John

oTree will record this participant label. It will be used to identify that participant in the oTree admin interface and the payments page, etc. You can also access it from your code as participant.label.

另一个使用参与人标签的好处是如果参与人打开了参与链接两次,他们会被分配为同一个参与者(如果你使用了房间链接或者会话链接)。这减少了重复参与。

If you’re using Prolific, you can add participant_label={{{PROLIFIC_PID}}} to your study URL. When the user clicks the link, Prolific will replace that with the participant’s actual Prolific ID.

到达顺序

oTree会将第一个到达的人分配为P1,第二个分配为P2,以此类推,除非你使用了单次使用链接。

定制管理员界面(管理员报告)

你可以在会话的管理员界面上添加一个自定义标签,放入任何你想要的内容。例如:

  • 玩家结果的表格/图
  • 与oTree内置不同的定制的报酬页面

下面是屏幕截图:

_images/admin-report.png

下面是一个简单的例子,我们添加一个管理员报告,它展示了某一给定轮次的排序过的收益列表。

First, define a function vars_for_admin_report. This works the same way as vars_for_template(). For example:

def vars_for_admin_report(subsession):
    payoffs = sorted([p.payoff for p in subsession.get_players()])
    return dict(payoffs=payoffs)

然后在你的应用中创建一个可包含的模板 admin_report.html ,并展示任何你想展示的通过 vars_for_admin_report 传入的变量:

<p>Here is the sorted list of payoffs in round {{ subsession.round_number }}</p>

<ul>
    {{ for payoff in payoffs }}
        <li>{{ payoff }}</li>
    {{ endfor }}
</ul>

注意:

  • subsession, session, 与 Constants 会被自动传递给模板。
  • admin_report.html does not need to use {{ block }}. The above example is valid as the full contents of admin_report.html.

如果你会话中有一个或多个应用具有 admin_report.html,你的管理员页面就会有 “Reports” 选项卡。使用菜单选择应用与轮数,以查看特定子会话的报告。

Tip: if you are displaying the same chart in the admin report and participant pages, you can reuse admin_report.html in the participant template with an {{ include }}, and pass the variables like this:

class Results(Page):

    @staticmethod
    def vars_for_template(player):
        subsession = player.subsession
        return vars_for_admin_report(subsession)

导出数据

在管理员界面,点击“Data”来下载你的数据,以CSV或者Excel的形式。

有一种数据导出是为”页面时间“准备的,它保存了用户完成每一个页面的精确时间。 是一个Python脚本,你可以用它列出每一页分别花了多长时间。你可以修改这个脚本来计算类似的事情,比如每位参与人在等待页面上一共花了多长时间。

自定义数据导出

You can make your own custom data export for an app. In oTree Studio, go to the “Player” model and click on “custom_export” at the bottom. (If using a text editor, define the below function.) The argument players is a queryset of all the players in the database. Use a yield for each row of data.

def custom_export(players):
    # header row
    yield ['session', 'participant_code', 'round_number', 'id_in_group', 'payoff']
    for p in players:
        participant = p.participant
        session = p.session
        yield [session.code, participant.code, p.round_number, p.id_in_group, p.payoff]

一旦定义了这个函数,你的自定义数据导出就在正常的数据导出页面可用。

Debug信息

当oTree以 DEBUG 模式(也即环境变量 OTREE_PRODUCTION 未被设置)运行时,debug信息会被显示在屏幕的底部。

Payments

If you define a participant field called finished, then you can set participant.finished = True when a participant finishes the session, and this will be displayed in various places such as the payments page.

Chat between participants and experimenter

To enable your participants to send you chat messages, consider using a software like Papercups. Click on the “Deploy to Heroku” button for 1-click setup of your Papercups server. Fill out the required config vars and leave the others empty. BACKEND_URL and REACT_APP_URL refer to your Papercups site, not your oTree site. Login to your site and copy the HTML embedding code to an includable template called papercups.html, then use {{ include }} to add the widget to each of your pages. (Put it somewhere in your page content, not inside <head> as suggested by Papercups documentation.) We recommend also adding this to the embedding config:

customer: {
  name: '{{participant.code}}',
  external_id: '{{participant.code}}',
}