otree 6.0.0b32__tar.gz → 6.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {otree-6.0.0b32/otree.egg-info → otree-6.0.1}/PKG-INFO +1 -1
- {otree-6.0.0b32 → otree-6.0.1}/otree/__init__.py +1 -1
- {otree-6.0.0b32 → otree-6.0.1}/otree/api.pyi +2 -2
- {otree-6.0.0b32 → otree-6.0.1}/otree/currency.py +18 -1
- {otree-6.0.0b32 → otree-6.0.1}/otree/database.py +8 -2
- {otree-6.0.0b32 → otree-6.0.1}/otree/decimal.py +9 -1
- {otree-6.0.0b32 → otree-6.0.1}/otree/export.py +31 -2
- {otree-6.0.0b32 → otree-6.0.1}/otree/forms/widgets.py +1 -1
- {otree-6.0.0b32 → otree-6.0.1}/otree/main.py +26 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models/participant.py +1 -1
- {otree-6.0.0b32 → otree-6.0.1}/otree/session.py +8 -2
- {otree-6.0.0b32 → otree-6.0.1}/otree/settings.py +27 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/session_data.js +6 -6
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionData.html +3 -3
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/admin.py +2 -4
- {otree-6.0.0b32 → otree-6.0.1/otree.egg-info}/PKG-INFO +1 -1
- {otree-6.0.0b32 → otree-6.0.1}/LICENSE +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/MANIFEST.in +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/README.rst +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/api.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/asgi.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/__pycache__/__init__.cpython-310.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/__pycache__/__init__.cpython-311.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/MyPage.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/Results.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/__pycache__/__init__.cpython-310.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/__pycache__/__init__.cpython-311.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/Results.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/Task.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/__pycache__/__init__.cpython-310.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/__pycache__/__init__.cpython-311.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/trials.csv +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/trials.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/.gitignore +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/Procfile +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/__init__.cpython-310.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/__init__.cpython-311.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/settings.cpython-310.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/settings.cpython-311.pyc +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/_static/global/empty.css +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/requirements.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/settings.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/auth.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/bots/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/bots/bot.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/bots/browser.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/bots/browser_launcher.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/bots/runner.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/channels/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/channels/consumers.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/channels/routing.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/channels/utils.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/chat.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/checks.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/base.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/bots.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/browser_bots.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/create_session.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/devserver.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/devserver_inner.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/prodserver.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/prodserver1of2.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/prodserver2of2.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/resetdb.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/startapp.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/startapp_trials.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/startproject.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/timeoutsubprocess.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/unzip.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/zip.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/cli/zipserver.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/common.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/common2.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/constants.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/errorpage.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/forms/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/forms/fields.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/forms/forms.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/forms/multistring.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/i18n.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/live.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ar/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ar/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/babel.ini +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/cs/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/cs/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/de/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/de/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/django.pot +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/es/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/es/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/fi/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/fi/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/fr/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/fr/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/he/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/he/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/hi/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/hi/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/hu/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/hu/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/id/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/id/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/it/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/it/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ja/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ja/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ko/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ko/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/nb/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/nb/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/nl/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/nl/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/pl/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/pl/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/pt/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/pt/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ru/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/ru/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/tr/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/tr/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/lookup.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/middleware.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models/group.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models/player.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models/session.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models/subsession.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/models_concrete.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/mturk_client.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/patch.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/read_csv.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/room.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/bootstrap5/css/bootstrap.min.css +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/bootstrap5/css/bootstrap.min.css.map +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/bootstrap5/js/bootstrap.bundle.min.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/bootstrap5/js/bootstrap.bundle.min.js.map +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/favicon.ico +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/clock.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/cloud.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/cogwheel.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/delete.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/download-alt.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/eye-open.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/folder-closed.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/link.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/list-alt.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/pencil.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/plus.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/pushpin.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/refresh.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/stats.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/glyphicons/usd.png +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/css/table.css +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/css/theme2.css +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/back_button.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/common_admin.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/common_user_facing.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/formInputs.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/internet-explorer.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/jquery-3.2.1.min.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/jquery.color-2.1.2.min.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/jquery.countdown.min.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/jquery.timeago.en-short.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/jquery.timeago.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/live.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/page-websocket-redirect.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/preserve_unsubmitted_inputs.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/reconnecting-websocket-iife.min.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/session_monitor.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/trials-core.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/trials-core.js.backup +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/otree/js/trials-pre.js +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/static/robots.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/tasks.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/global/Base.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/global/Page.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/AdminReport.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/BaseAdminAll.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/BaseAdminRegular.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/Base_UserFacing.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/CreateDemoSession.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/CreateSession.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/DemoIndex.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/ExportIndex.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/FormPage.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/GBATInactive.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/Login.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/MTurkCreateHIT.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/MTurkHTMLQuestion.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/MTurkSessionPayments.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/OutOfRangeNotification.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/Page.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/RoomWelcomePage.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/RoomWithSession.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/RoomWithoutSession.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/Rooms.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/ServerCheck.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/Session.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionDemoGridView.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionDescription.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionEditProperties.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionMonitor.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionPayments.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionSplitScreen.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/SessionStartLinks.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/Sessions.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/WaitPage.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/WaitPageGeneric.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/CreateSessionForm.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/RoomParticipantLinks.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/SessionInfo.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/TimeLimit.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/TimeLimit.js.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/debug_info.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/hidden_form_errors.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/messages.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/mturk_payment_table.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/navbar.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/includes/participant_code_links_table.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templates/otree/tags/chat.html +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/compiler.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/context.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/errors.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/filters.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/loader.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/nodes.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/template.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/templating/utils.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/test.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/trials.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/update.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/urls.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/__init__.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/abstract.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/cbv.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/demo.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/export.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/mturk.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/participant.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/querystring.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/rest.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree/views/room.py +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree.egg-info/SOURCES.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree.egg-info/dependency_links.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree.egg-info/entry_points.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree.egg-info/not-zip-safe +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree.egg-info/requires.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/otree.egg-info/top_level.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/pyproject.toml +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/requirements.txt +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/setup.cfg +0 -0
- {otree-6.0.0b32 → otree-6.0.1}/setup.py +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
__version__ = '6.0.
|
|
1
|
+
__version__ = '6.0.1'
|
|
2
2
|
# don't import anything else here because setup.py imports this.
|
|
@@ -15,7 +15,7 @@ cu = Currency
|
|
|
15
15
|
class DecimalUnit(Decimal):
|
|
16
16
|
storage_places: int
|
|
17
17
|
input_places: int
|
|
18
|
-
|
|
18
|
+
input_unit_label: str
|
|
19
19
|
output_min_places: int
|
|
20
20
|
output_max_places: int
|
|
21
21
|
|
|
@@ -136,7 +136,7 @@ class models:
|
|
|
136
136
|
def __init__(
|
|
137
137
|
self,
|
|
138
138
|
*,
|
|
139
|
-
|
|
139
|
+
unit: Type[DecimalUnit],
|
|
140
140
|
choices: Iterable | None = None,
|
|
141
141
|
widget: Any | None = None,
|
|
142
142
|
initial: AnyNumber | None = None,
|
|
@@ -164,6 +164,15 @@ class BaseCurrency(Decimal):
|
|
|
164
164
|
|
|
165
165
|
|
|
166
166
|
class Currency(BaseCurrency):
|
|
167
|
+
def __new__(cls, amount):
|
|
168
|
+
# If CURRENCY_UNIT is defined, create instance of custom unit instead
|
|
169
|
+
if settings.CURRENCY_UNIT_CLASS is not None:
|
|
170
|
+
return settings.CURRENCY_UNIT_CLASS(amount)
|
|
171
|
+
# Otherwise use normal Currency behavior
|
|
172
|
+
if amount is None:
|
|
173
|
+
raise ValueError('Cannot convert None to currency')
|
|
174
|
+
return Decimal.__new__(cls, cls._sanitize(amount))
|
|
175
|
+
|
|
167
176
|
@classmethod
|
|
168
177
|
def get_num_decimal_places(cls):
|
|
169
178
|
if settings.USE_POINTS:
|
|
@@ -209,6 +218,15 @@ class Currency(BaseCurrency):
|
|
|
209
218
|
class RealWorldCurrency(BaseCurrency):
|
|
210
219
|
'''payment currency'''
|
|
211
220
|
|
|
221
|
+
def __new__(cls, amount):
|
|
222
|
+
# If CURRENCY_UNIT is defined, create instance of custom unit instead
|
|
223
|
+
if settings.CURRENCY_UNIT_CLASS is not None:
|
|
224
|
+
return settings.CURRENCY_UNIT_CLASS(amount)
|
|
225
|
+
# Otherwise use normal RealWorldCurrency behavior
|
|
226
|
+
if amount is None:
|
|
227
|
+
raise ValueError('Cannot convert None to currency')
|
|
228
|
+
return Decimal.__new__(cls, cls._sanitize(amount))
|
|
229
|
+
|
|
212
230
|
def to_real_world_currency(self, session):
|
|
213
231
|
return self
|
|
214
232
|
|
|
@@ -260,4 +278,3 @@ def currency_range(first, last, increment):
|
|
|
260
278
|
values.append(current_value)
|
|
261
279
|
current_value += increment
|
|
262
280
|
|
|
263
|
-
|
|
@@ -904,15 +904,21 @@ def IntegerField(**kwargs):
|
|
|
904
904
|
|
|
905
905
|
|
|
906
906
|
def CurrencyField(**kwargs):
|
|
907
|
+
# If CURRENCY_UNIT is defined, CurrencyField is an alias for DecimalField
|
|
908
|
+
if settings.CURRENCY_UNIT_CLASS is not None:
|
|
909
|
+
return DecimalField(unit=settings.CURRENCY_UNIT_CLASS, **kwargs)
|
|
907
910
|
return wrap_column(CurrencyType, **kwargs)
|
|
908
911
|
|
|
909
912
|
|
|
910
913
|
def RealWorldCurrencyField(**kwargs):
|
|
914
|
+
# If CURRENCY_UNIT is defined, RealWorldCurrencyField is an alias for DecimalField
|
|
915
|
+
if settings.CURRENCY_UNIT_CLASS is not None:
|
|
916
|
+
return DecimalField(unit=settings.CURRENCY_UNIT_CLASS, **kwargs)
|
|
911
917
|
return wrap_column(RealWorldCurrencyType, **kwargs)
|
|
912
918
|
|
|
913
919
|
|
|
914
|
-
def DecimalField(*,
|
|
915
|
-
return wrap_column(DecimalFieldType(unit=
|
|
920
|
+
def DecimalField(*, unit, **kwargs):
|
|
921
|
+
return wrap_column(DecimalFieldType(unit=unit), **kwargs)
|
|
916
922
|
|
|
917
923
|
|
|
918
924
|
# aliases for compat
|
|
@@ -16,7 +16,7 @@ class DecimalUnit(Decimal):
|
|
|
16
16
|
# Default class attributes (should be overridden by subclasses)
|
|
17
17
|
storage_places = None
|
|
18
18
|
input_places = None
|
|
19
|
-
|
|
19
|
+
input_unit_label = ''
|
|
20
20
|
output_min_places = None
|
|
21
21
|
output_max_places = None
|
|
22
22
|
|
|
@@ -144,6 +144,14 @@ class DecimalUnit(Decimal):
|
|
|
144
144
|
max_places = self.__class__.output_max_places
|
|
145
145
|
return self._format_with_places(min_places, max_places)
|
|
146
146
|
|
|
147
|
+
def to_real_world_currency(self, session):
|
|
148
|
+
"""
|
|
149
|
+
Compatibility method for when CurrencyField is aliased to DecimalField.
|
|
150
|
+
Since there's only one currency type when CURRENCY_UNIT is defined,
|
|
151
|
+
just return self (similar to Currency.to_real_world_currency when USE_POINTS=False)
|
|
152
|
+
"""
|
|
153
|
+
return self
|
|
154
|
+
|
|
147
155
|
def _make_result(self, result, other):
|
|
148
156
|
"""DRY helper for arithmetic operations"""
|
|
149
157
|
if not isinstance(other, DecimalUnit):
|
|
@@ -27,6 +27,31 @@ from otree import settings
|
|
|
27
27
|
logger = logging.getLogger(__name__)
|
|
28
28
|
|
|
29
29
|
|
|
30
|
+
# Single source of truth for fixed columns in SessionData view
|
|
31
|
+
# These columns always appear first, in this order
|
|
32
|
+
DATA_TAB_FIXED_COLUMNS = [
|
|
33
|
+
{
|
|
34
|
+
'field': 'participant.label',
|
|
35
|
+
'display': 'label',
|
|
36
|
+
'prefix': 'pp.',
|
|
37
|
+
'getter': lambda p, g, s, participant_label: participant_label,
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
'field': 'group.id_in_subsession',
|
|
41
|
+
'display': 'group',
|
|
42
|
+
'prefix': '',
|
|
43
|
+
'getter': lambda p, g, s, participant_label: g['id_in_subsession'],
|
|
44
|
+
},
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
# Automatically derive the group column index
|
|
48
|
+
GROUP_COL_INDEX = next(
|
|
49
|
+
i
|
|
50
|
+
for i, col in enumerate(DATA_TAB_FIXED_COLUMNS)
|
|
51
|
+
if col['field'] == 'group.id_in_subsession'
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
30
55
|
def get_fields_for_monitor():
|
|
31
56
|
return _get_table_fields(Participant, for_export=False)
|
|
32
57
|
|
|
@@ -85,7 +110,8 @@ def _get_table_fields(Model, custom_fields=None, for_export=False):
|
|
|
85
110
|
|
|
86
111
|
specs = [
|
|
87
112
|
('player', BasePlayer, ['id_in_group', 'role', 'payoff']),
|
|
88
|
-
|
|
113
|
+
# group.id_in_subsession is in DATA_TAB_FIXED_COLUMNS, not here
|
|
114
|
+
('group', BaseGroup, []),
|
|
89
115
|
# don't need round_number because it's already in the SessionData navigation toolbar
|
|
90
116
|
('subsession', BaseSubsession, []),
|
|
91
117
|
]
|
|
@@ -502,7 +528,10 @@ def get_rows_for_data_tab_app(session, app_name):
|
|
|
502
528
|
s = subsessions[p['subsession_id']]
|
|
503
529
|
try:
|
|
504
530
|
row = (
|
|
505
|
-
[
|
|
531
|
+
[
|
|
532
|
+
col['getter'](p, g, s, participant_label)
|
|
533
|
+
for col in DATA_TAB_FIXED_COLUMNS
|
|
534
|
+
]
|
|
506
535
|
+ [p[fname] for fname in pfields]
|
|
507
536
|
+ [g[fname] for fname in gfields]
|
|
508
537
|
+ [s[fname] for fname in sfields]
|
|
@@ -114,7 +114,7 @@ class DecimalWidget(BaseWidget):
|
|
|
114
114
|
|
|
115
115
|
def __init__(self, unit):
|
|
116
116
|
self.unit = unit
|
|
117
|
-
self.input_label = unit.
|
|
117
|
+
self.input_label = unit.input_unit_label
|
|
118
118
|
self.places = unit.input_places
|
|
119
119
|
|
|
120
120
|
def get_html_fragments(self):
|
|
@@ -124,6 +124,32 @@ def setup():
|
|
|
124
124
|
|
|
125
125
|
init_i18n(settings.LANGUAGE_CODE_ISO)
|
|
126
126
|
|
|
127
|
+
# Import CURRENCY_UNIT class if defined (delayed to avoid circular imports)
|
|
128
|
+
if settings.CURRENCY_UNIT_PATH:
|
|
129
|
+
import importlib
|
|
130
|
+
import sys
|
|
131
|
+
from otree.decimal import DecimalUnit
|
|
132
|
+
|
|
133
|
+
try:
|
|
134
|
+
module_path, class_name = settings.CURRENCY_UNIT_PATH.rsplit('.', 1)
|
|
135
|
+
module = importlib.import_module(module_path)
|
|
136
|
+
currency_unit_class = getattr(module, class_name)
|
|
137
|
+
|
|
138
|
+
# Validate it's a DecimalUnit subclass
|
|
139
|
+
if not issubclass(currency_unit_class, DecimalUnit):
|
|
140
|
+
msg = (
|
|
141
|
+
f"CURRENCY_UNIT must be a subclass of DecimalUnit, "
|
|
142
|
+
f"but {settings.CURRENCY_UNIT_PATH} is not."
|
|
143
|
+
)
|
|
144
|
+
sys.exit(msg)
|
|
145
|
+
|
|
146
|
+
# Set it globally - Currency/RealWorldCurrency __new__ will use this
|
|
147
|
+
settings.CURRENCY_UNIT_CLASS = currency_unit_class
|
|
148
|
+
|
|
149
|
+
except (ValueError, ImportError, AttributeError) as e:
|
|
150
|
+
msg = f"Failed to import CURRENCY_UNIT '{settings.CURRENCY_UNIT_PATH}': {e}"
|
|
151
|
+
sys.exit(msg)
|
|
152
|
+
|
|
127
153
|
from otree.database import init_orm # noqa
|
|
128
154
|
|
|
129
155
|
check_for_sentry()
|
|
@@ -31,7 +31,7 @@ class Participant(MixinVars, otree.database.SSPPGModel):
|
|
|
31
31
|
payoff = Column(CurrencyType, default=0)
|
|
32
32
|
|
|
33
33
|
# status could be 'finished', 'dropped out', etc. Empty string means active/in progress
|
|
34
|
-
status = Column(st.String(50), default='')
|
|
34
|
+
status = Column(st.String(50), default='', nullable=False)
|
|
35
35
|
|
|
36
36
|
# better to use a string so that it doesn't become unofficial API
|
|
37
37
|
time_started_utc = Column(st.String(50), nullable=True)
|
|
@@ -76,7 +76,12 @@ class SessionConfig(dict):
|
|
|
76
76
|
return num_cases
|
|
77
77
|
|
|
78
78
|
def clean(self):
|
|
79
|
-
|
|
79
|
+
required_keys = ['participation_fee']
|
|
80
|
+
# When CURRENCY_UNIT is defined, there's no currency conversion (like USE_POINTS=False)
|
|
81
|
+
if settings.CURRENCY_UNIT_CLASS is None:
|
|
82
|
+
required_keys.append('real_world_currency_per_point')
|
|
83
|
+
|
|
84
|
+
for k in required_keys:
|
|
80
85
|
if k not in self:
|
|
81
86
|
msg = f'SESSION_CONFIG_DEFAULTS is missing {k}'
|
|
82
87
|
raise SessionConfigError(msg)
|
|
@@ -127,7 +132,8 @@ class SessionConfig(dict):
|
|
|
127
132
|
|
|
128
133
|
def builtin_editable_fields(self):
|
|
129
134
|
fields = ['participation_fee']
|
|
130
|
-
|
|
135
|
+
# Only show real_world_currency_per_point when using old currency system with points
|
|
136
|
+
if settings.CURRENCY_UNIT_CLASS is None and settings.USE_POINTS:
|
|
131
137
|
fields.append('real_world_currency_per_point')
|
|
132
138
|
return fields
|
|
133
139
|
|
|
@@ -53,6 +53,33 @@ def get_OTREE_APPS(SESSION_CONFIGS):
|
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
OTREE_APPS = get_OTREE_APPS(settings.SESSION_CONFIGS)
|
|
56
|
+
|
|
57
|
+
# Handle CURRENCY_UNIT if defined
|
|
58
|
+
# Note: We don't import the class here to avoid circular imports
|
|
59
|
+
# The actual import happens in otree/main.py:setup()
|
|
60
|
+
CURRENCY_UNIT_CLASS = None
|
|
61
|
+
CURRENCY_UNIT_PATH = None
|
|
62
|
+
if hasattr(settings, 'CURRENCY_UNIT'):
|
|
63
|
+
# Check for incompatible old currency settings
|
|
64
|
+
old_currency_settings = [
|
|
65
|
+
'USE_POINTS',
|
|
66
|
+
'REAL_WORLD_CURRENCY_CODE',
|
|
67
|
+
'POINTS_DECIMAL_PLACES',
|
|
68
|
+
'POINTS_CUSTOM_NAME',
|
|
69
|
+
'REAL_WORLD_CURRENCY_DECIMAL_PLACES',
|
|
70
|
+
]
|
|
71
|
+
found_old_settings = [s for s in old_currency_settings if hasattr(settings, s)]
|
|
72
|
+
if found_old_settings:
|
|
73
|
+
msg = (
|
|
74
|
+
f"CURRENCY_UNIT is defined, but the following deprecated currency settings "
|
|
75
|
+
f"are also defined: {', '.join(found_old_settings)}. "
|
|
76
|
+
f"Please remove these settings when using CURRENCY_UNIT."
|
|
77
|
+
)
|
|
78
|
+
sys.exit(msg)
|
|
79
|
+
|
|
80
|
+
# Store the path for later import (done in main.py:setup() to avoid circular imports)
|
|
81
|
+
CURRENCY_UNIT_PATH = settings.CURRENCY_UNIT
|
|
82
|
+
|
|
56
83
|
if not hasattr(settings, 'REAL_WORLD_CURRENCY_DECIMAL_PLACES'):
|
|
57
84
|
if REAL_WORLD_CURRENCY_CODE in [
|
|
58
85
|
'KRW',
|
|
@@ -45,10 +45,10 @@ function filterGroup(rowIdx) {
|
|
|
45
45
|
let tbody = table.querySelector('tbody');
|
|
46
46
|
let trs = tbody.querySelectorAll('tr');
|
|
47
47
|
|
|
48
|
-
let curGroup = data[rowIdx][
|
|
48
|
+
let curGroup = data[rowIdx][GROUP_COL_INDEX];
|
|
49
49
|
let rowsInSameGroup = [];
|
|
50
50
|
for (let i = 0; i < data.length; i++) {
|
|
51
|
-
if (data[i][
|
|
51
|
+
if (data[i][GROUP_COL_INDEX] === curGroup)
|
|
52
52
|
rowsInSameGroup.push(i);
|
|
53
53
|
}
|
|
54
54
|
for (let i = 0; i < trs.length; i++) {
|
|
@@ -71,8 +71,7 @@ function createTableRow(row, row_number) {
|
|
|
71
71
|
for (let i = 0; i < row.length; i++) {
|
|
72
72
|
let value = row[i];
|
|
73
73
|
let td = document.createElement('td');
|
|
74
|
-
if (i ===
|
|
75
|
-
// i === 1 is now the group column (participant.label is at i === 0)
|
|
74
|
+
if (i === GROUP_COL_INDEX) {
|
|
76
75
|
td.innerHTML = `<a href="#" onclick="filterGroup(${row_number})">${value}</a>`;
|
|
77
76
|
} else {
|
|
78
77
|
td.innerHTML = makeCellDisplayValue(value);
|
|
@@ -106,7 +105,7 @@ function makeCellDisplayValue(value, fieldName) {
|
|
|
106
105
|
|
|
107
106
|
|
|
108
107
|
|
|
109
|
-
function updateDataTable($table, new_json, old_json,
|
|
108
|
+
function updateDataTable($table, new_json, old_json, headers) {
|
|
110
109
|
let changeDescriptions = [];
|
|
111
110
|
let $tbody = $table.find('tbody');
|
|
112
111
|
// build table for the first time
|
|
@@ -121,7 +120,8 @@ function updateDataTable($table, new_json, old_json, field_headers) {
|
|
|
121
120
|
let new_value = makeCellDisplayValue(rawValue);
|
|
122
121
|
$cell.text(new_value);
|
|
123
122
|
flashGreen($cell);
|
|
124
|
-
let
|
|
123
|
+
let header = headers[j];
|
|
124
|
+
let fieldName = header.prefix ? header.prefix + header.name : header.name;
|
|
125
125
|
let newValueTrunc = truncateStringEllipsis(new_value, 7);
|
|
126
126
|
rowChanges.push(`${fieldName}=${newValueTrunc}`);
|
|
127
127
|
}
|
|
@@ -168,7 +168,8 @@
|
|
|
168
168
|
let tables = document.getElementsByClassName('results-table');
|
|
169
169
|
const round_numbers_by_subsession = {{ round_numbers_by_subsession|safe }};
|
|
170
170
|
const app_names_by_subsession = {{ app_names_by_subsession|safe }};
|
|
171
|
-
const
|
|
171
|
+
const TABLE_HEADERS = {{ tables|safe }}.map(t => t.headers);
|
|
172
|
+
const GROUP_COL_INDEX = {{ GROUP_COL_INDEX }};
|
|
172
173
|
let populatedTables = new Set(); // Track which tables have been populated
|
|
173
174
|
$(document).ready(function () {
|
|
174
175
|
$('#btn-refresh').click(function () {
|
|
@@ -267,8 +268,7 @@
|
|
|
267
268
|
// REFRESH: Only update populated tables
|
|
268
269
|
for (let tableIdx of populatedTables) {
|
|
269
270
|
let table = tables[tableIdx];
|
|
270
|
-
let
|
|
271
|
-
let headers = FIELD_HEADERS[appName];
|
|
271
|
+
let headers = TABLE_HEADERS[tableIdx];
|
|
272
272
|
let data = new_json[tableIdx];
|
|
273
273
|
changeDescriptions = changeDescriptions.concat(updateDataTable($(table), data, old_json[tableIdx], headers));
|
|
274
274
|
}
|
|
@@ -313,7 +313,6 @@ class SessionData(AdminSessionPage):
|
|
|
313
313
|
session = self.session
|
|
314
314
|
|
|
315
315
|
tables = []
|
|
316
|
-
field_headers = {}
|
|
317
316
|
app_names_by_subsession = []
|
|
318
317
|
round_numbers_by_subsession = []
|
|
319
318
|
table_index = 0
|
|
@@ -323,7 +322,6 @@ class SessionData(AdminSessionPage):
|
|
|
323
322
|
session=session
|
|
324
323
|
).count()
|
|
325
324
|
pfields, gfields, sfields = export.get_fields_for_data_tab(app_name)
|
|
326
|
-
field_headers[app_name] = pfields + gfields + sfields
|
|
327
325
|
|
|
328
326
|
for round_number in range(1, num_rounds + 1):
|
|
329
327
|
# Build headers with indexes for sortability
|
|
@@ -331,7 +329,7 @@ class SessionData(AdminSessionPage):
|
|
|
331
329
|
field_index = 0
|
|
332
330
|
|
|
333
331
|
for field_name, prefix in [
|
|
334
|
-
('
|
|
332
|
+
*[(col['display'], col['prefix']) for col in export.DATA_TAB_FIXED_COLUMNS],
|
|
335
333
|
*[(f, '') for f in pfields],
|
|
336
334
|
*[(f, 'group.') for f in gfields],
|
|
337
335
|
*[(f, 'subsession.') for f in sfields],
|
|
@@ -353,9 +351,9 @@ class SessionData(AdminSessionPage):
|
|
|
353
351
|
table_index += 1
|
|
354
352
|
return dict(
|
|
355
353
|
tables=tables,
|
|
356
|
-
field_headers_json=json.dumps(field_headers),
|
|
357
354
|
app_names_by_subsession=app_names_by_subsession,
|
|
358
355
|
round_numbers_by_subsession=round_numbers_by_subsession,
|
|
356
|
+
GROUP_COL_INDEX=export.GROUP_COL_INDEX,
|
|
359
357
|
DATA_EXPORT_HASH=otree.common.DATA_EXPORT_HASH,
|
|
360
358
|
)
|
|
361
359
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/__pycache__/__init__.cpython-310.pyc
RENAMED
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/__pycache__/__init__.cpython-310.pyc
RENAMED
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/app_template_trials/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/__init__.cpython-310.pyc
RENAMED
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/__init__.cpython-311.pyc
RENAMED
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/settings.cpython-310.pyc
RENAMED
|
File without changes
|
{otree-6.0.0b32 → otree-6.0.1}/otree/assets/project_template/__pycache__/settings.cpython-311.pyc
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|