管理员

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

打开你的浏览器,网址为 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会记录下这个参与人标签。它会被用来在oTree管理员界面和报酬页面等地方标识参与者身份。你也可以在你的代码中通过 participant.label 来访问它。

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

到达顺序

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

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

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

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

下面是屏幕截图:

_images/admin-report.png

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

首先,定义一个函数 vars_for_admin_report。这与 vars_for_template() 原理类似。例如:

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>

注意:

  • subsessionsessionC 会被自动传递给模板。
  • admin_report.html 不需要使用 {{ block }}。上面的例子包含了 admin_report.html 完整有效的内容。

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

导出数据

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

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

自定义数据导出

你可以在应用中自定义数据导出。在oTree Studio中,前往 “Player” 模块并点击底部的”custom_export”。(如果使用文本编辑器,定义下面的函数。)参数 players 是数据库中所有玩家组成的queryset。使用 yield 来获取每一行数据。

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]

Or, you can ignore the players argument and export some other data instead, e.g.:

def custom_export(players):
    # Export an ExtraModel called "Trial"

    yield ['session', 'participant', 'round_number', 'response', 'response_msec']

    # 'filter' without any args returns everything
    trials = Trial.filter()
    for trial in trials:
        player = trial.player
        participant = player.participant
        session = player.session
        yield [session.code, participant.code, player.round_number, trial.response, trial.response_msec]

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

Debug信息

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

报酬

如果你定义了一个名为 finishedparticipant field,那么你可以在参与人完成会话之后设置 participant.finished = True,这会在报酬页面等不同地方显示。

实验者与参与人聊天

为让参与人可以向你发送聊天信息,考虑使用类似 Papercups 的软件。点击”Deploy to Heroku”按钮一键部署你的Papercups服务器。填写必需的配置参数,余下可以不填。BACKEND_URLREACT_APP_URL 指的是你的Papercups站点,不是oTree站点。登录你的网站并复制HTML内嵌代码至一个可包含的模板,命名为 papercups.html这里 有一个名为”chat with experimenter”的例子。