diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3d29960 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +venv +staticfiles +./db.sqlite3 +.idea +*~ +*.sqlite3 +_static_root +_bots*s +__temp* +__pycache__/ +*.py[cod] +.DS_Store +*.otreezip \ No newline at end of file diff --git a/.ipynb_checkpoints/Procfile-checkpoint b/.ipynb_checkpoints/Procfile-checkpoint new file mode 100644 index 0000000..11e1b7d --- /dev/null +++ b/.ipynb_checkpoints/Procfile-checkpoint @@ -0,0 +1,2 @@ +web: otree prodserver1of2 +worker: otree prodserver2of2 diff --git a/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..7fec515 --- /dev/null +++ b/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/.ipynb_checkpoints/Untitled1-checkpoint.ipynb b/.ipynb_checkpoints/Untitled1-checkpoint.ipynb new file mode 100644 index 0000000..7fec515 --- /dev/null +++ b/.ipynb_checkpoints/Untitled1-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/.ipynb_checkpoints/data-checkpoint.txt b/.ipynb_checkpoints/data-checkpoint.txt new file mode 100644 index 0000000..e2777c8 --- /dev/null +++ b/.ipynb_checkpoints/data-checkpoint.txt @@ -0,0 +1 @@ +{"people": [{"name": "Scott", "website": "stackabuse.com", "from": "Nebraska"}, {"name": "Larry", "website": "google.com", "from": "Michigan"}, {"name": "Tim", "website": "apple.com", "from": "Alabama"}]} \ No newline at end of file diff --git a/.ipynb_checkpoints/fig_groupe2-checkpoint.png b/.ipynb_checkpoints/fig_groupe2-checkpoint.png new file mode 100644 index 0000000..76a94dd Binary files /dev/null and b/.ipynb_checkpoints/fig_groupe2-checkpoint.png differ diff --git a/.ipynb_checkpoints/manage-checkpoint.py b/.ipynb_checkpoints/manage-checkpoint.py new file mode 100644 index 0000000..d6f4caa --- /dev/null +++ b/.ipynb_checkpoints/manage-checkpoint.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +import os +import sys + + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") + + from otree.management.cli import execute_from_command_line + + execute_from_command_line(sys.argv, script_file=__file__) diff --git a/.ipynb_checkpoints/multiples_chocs_figures-checkpoint.ipynb b/.ipynb_checkpoints/multiples_chocs_figures-checkpoint.ipynb new file mode 100644 index 0000000..cd93544 --- /dev/null +++ b/.ipynb_checkpoints/multiples_chocs_figures-checkpoint.ipynb @@ -0,0 +1,155 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.colors import colorConverter as cc\n", + "import numpy as np\n", + " \n", + "def plot_mean_and_CI(mean, lb, ub, color_mean=None, color_shading=None):\n", + " # plot the shaded range of the confidence intervals\n", + " plt.fill_between(range(mean.shape[0]), ub, lb,\n", + " color=color_shading, alpha=.5)\n", + " # plot the mean on top\n", + " plt.plot(mean, color_mean)\n", + " \n", + "# generate 3 sets of random means and confidence intervals to plot\n", + "mean0 = np.random.random(50)\n", + "ub0 = mean0 + np.random.random(50) + .5\n", + "lb0 = mean0 - np.random.random(50) - .5\n", + " \n", + "mean1 = np.random.random(50) + 2\n", + "ub1 = mean1 + np.random.random(50) + .5\n", + "lb1 = mean1 - np.random.random(50) - .5\n", + " \n", + "mean2 = np.random.random(50) -1\n", + "ub2 = mean2 + np.random.random(50) + .5\n", + "lb2 = mean2 - np.random.random(50) - .5\n", + " \n", + "# plot the data\n", + "fig = plt.figure(1, figsize=(7, 2.5))\n", + "plot_mean_and_CI(mean0, ub0, lb0, color_mean='k', color_shading='k')\n", + "plot_mean_and_CI(mean1, ub1, lb1, color_mean='b', color_shading='b')\n", + "plot_mean_and_CI(mean2, ub2, lb2, color_mean='g--', color_shading='g')\n", + " \n", + "class LegendObject(object):\n", + " def __init__(self, facecolor='red', edgecolor='white', dashed=False):\n", + " self.facecolor = facecolor\n", + " self.edgecolor = edgecolor\n", + " self.dashed = dashed\n", + " \n", + " def legend_artist(self, legend, orig_handle, fontsize, handlebox):\n", + " x0, y0 = handlebox.xdescent, handlebox.ydescent\n", + " width, height = handlebox.width, handlebox.height\n", + " patch = mpatches.Rectangle(\n", + " # create a rectangle that is filled with color\n", + " [x0, y0], width, height, facecolor=self.facecolor,\n", + " # and whose edges are the faded color\n", + " edgecolor=self.edgecolor, lw=3)\n", + " handlebox.add_artist(patch)\n", + " \n", + " # if we're creating the legend for a dashed line,\n", + " # manually add the dash in to our rectangle\n", + " if self.dashed:\n", + " patch1 = mpatches.Rectangle(\n", + " [x0 + 2*width/5, y0], width/5, height, facecolor=self.edgecolor,\n", + " transform=handlebox.get_transform())\n", + " handlebox.add_artist(patch1)\n", + " \n", + " return patch\n", + " \n", + "bg = np.array([1, 1, 1]) # background of the legend is white\n", + "colors = ['black', 'blue', 'green']\n", + "# with alpha = .5, the faded color is the average of the background and color\n", + "colors_faded = [(np.array(cc.to_rgb(color)) + bg) / 2.0 for color in colors]\n", + " \n", + "plt.legend([0, 1, 2], ['Data 0', 'Data 1', 'Data 2'],\n", + " handler_map={\n", + " 0: LegendObject(colors[0], colors_faded[0]),\n", + " 1: LegendObject(colors[1], colors_faded[1]),\n", + " 2: LegendObject(colors[2], colors_faded[2], dashed=True),\n", + " })\n", + " \n", + "plt.title('Example mean and confidence interval plot')\n", + "plt.tight_layout()\n", + "plt.grid()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0.37747772, 0.07693753, 0.1940634 , 0.15176569, 0.14293999,\n", + " 0.60894227, 0.09985447, 0.41118113, 0.68274936, 0.85285374,\n", + " 0.4541564 , 0.63333913, 0.35620657, 0.51059929, 0.85266049,\n", + " 0.23237531, 0.23283028, 0.47911222, 0.40544178, 0.81126309,\n", + " 0.86811543, 0.35334637, 0.86403165, 0.86593378, 0.25916208,\n", + " 0.21492518, 0.92107401, 0.32022366, 0.93038498, 0.4327189 ,\n", + " 0.24912534, 0.77540019, 0.13939365, 0.79231252, 0.65351859,\n", + " 0.11080199, 0.48425663, 0.7100898 , 0.02117045, 0.41127722,\n", + " 0.16392522, 0.32550661, 0.95452695, 0.42164106, 0.22468096,\n", + " 0.65491521, 0.36794668, 0.78792547, 0.17727132, 0.82141194])" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mean0" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/.ipynb_checkpoints/nb_multiples_chocs-checkpoint.ipynb b/.ipynb_checkpoints/nb_multiples_chocs-checkpoint.ipynb new file mode 100644 index 0000000..0411718 --- /dev/null +++ b/.ipynb_checkpoints/nb_multiples_chocs-checkpoint.ipynb @@ -0,0 +1,5117 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "x1 = [1, 2, 2, 3, 4, 4, 4, 4, 4, 5, 5]\n", + "x2 = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5]\n", + "bins = [x + 0.5 for x in range(0, 6)]\n", + "plt.hist([x1, x2], bins = bins, color = ['yellow', 'green'],\n", + " edgecolor = 'red', hatch = '/', label = ['x1', 'x2'],\n", + " histtype = 'bar') # bar est le defaut\n", + "plt.ylabel('valeurs')\n", + "plt.xlabel('nombres')\n", + "plt.title('2 series')\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df = pd.read_stata('/Users/waelbousselmi/Google Drive/docs_multiples_chocs/doc_Avril_2021/plm_MC_190712_v1.dta')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
var1periodnmarketdirec_shockpost_shock1_npost_shock2_nuuddt0t_shock...r6_negr11_negr6_shockr11_shockstd_riskmean_risk_v1median_risk_v1numvarnumvarupnumvardown
0170703_08501100.0NaN1001...0.00.00.00.02.8644.0883.75NaNNaNNaN
1170703_08502100.0NaN1001...0.00.00.00.03.0764.9385.002.00.02.0
2170703_08503100.0NaN1001...0.00.00.00.03.1704.4753.751.01.00.0
3170703_08504100.0NaN1001...0.00.00.00.03.5955.6886.002.00.02.0
4170703_08505100.0NaN1001...0.00.00.00.03.7535.0753.751.01.00.0
\n", + "

5 rows × 65 columns

\n", + "
" + ], + "text/plain": [ + " var1 period nmarket direc_shock post_shock1_n post_shock2_n \\\n", + "0 170703_0850 1 1 0 0.0 NaN \n", + "1 170703_0850 2 1 0 0.0 NaN \n", + "2 170703_0850 3 1 0 0.0 NaN \n", + "3 170703_0850 4 1 0 0.0 NaN \n", + "4 170703_0850 5 1 0 0.0 NaN \n", + "\n", + " uu dd t0 t_shock ... r6_neg r11_neg r6_shock r11_shock std_risk \\\n", + "0 1 0 0 1 ... 0.0 0.0 0.0 0.0 2.864 \n", + "1 1 0 0 1 ... 0.0 0.0 0.0 0.0 3.076 \n", + "2 1 0 0 1 ... 0.0 0.0 0.0 0.0 3.170 \n", + "3 1 0 0 1 ... 0.0 0.0 0.0 0.0 3.595 \n", + "4 1 0 0 1 ... 0.0 0.0 0.0 0.0 3.753 \n", + "\n", + " mean_risk_v1 median_risk_v1 numvar numvarup numvardown \n", + "0 4.088 3.75 NaN NaN NaN \n", + "1 4.938 5.00 2.0 0.0 2.0 \n", + "2 4.475 3.75 1.0 1.0 0.0 \n", + "3 5.688 6.00 2.0 0.0 2.0 \n", + "4 5.075 3.75 1.0 1.0 0.0 \n", + "\n", + "[5 rows x 65 columns]" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ptftrad_nrd_nt0uuddperiod
0-10.003.333333-3.3333330101
10.001.666667-1.6666670102
25.001.666667-0.5555560103
310.002.0833330.4166670104
45.052.0033330.6700000105
\n", + "
" + ], + "text/plain": [ + " ptft rad_n rd_n t0 uu dd period\n", + "0 -10.00 3.333333 -3.333333 0 1 0 1\n", + "1 0.00 1.666667 -1.666667 0 1 0 2\n", + "2 5.00 1.666667 -0.555556 0 1 0 3\n", + "3 10.00 2.083333 0.416667 0 1 0 4\n", + "4 5.05 2.003333 0.670000 0 1 0 5" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ptft = df[['ptft','rad_n', 'rd_n','t0','uu','dd','period']]\n", + "ptft.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "ptft_p1 = ptft[ptft['period']<6]\n", + "ptft_p2 = ptft[(ptft.period >5) & (ptft.period < 11) ]\n", + "ptft_p3 = ptft[(ptft.period >10)]\n", + "ptft_p1_t0 = ptft_p1[ptft_p1.t0 == 1]\n", + "ptft_p1_uu = ptft_p1[ptft_p1.uu == 1]\n", + "ptft_p1_dd = ptft_p1[ptft_p1.dd == 1]\n", + "ptft_p2_t0 = ptft_p2[ptft_p2.t0 == 1]\n", + "ptft_p2_uu = ptft_p2[ptft_p2.uu == 1]\n", + "ptft_p2_dd = ptft_p2[ptft_p2.dd == 1]\n", + "ptft_p3_t0 = ptft_p3[ptft_p3.t0 == 1]\n", + "ptft_p3_uu = ptft_p3[ptft_p3.uu == 1]\n", + "ptft_p3_dd = ptft_p3[ptft_p3.dd == 1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "import statistics as st\n", + "v11 = st.mean(ptft_p1_t0.ptft)\n", + "v12 = st.mean(ptft_p2_t0.ptft)\n", + "v13 = st.mean(ptft_p3_t0.ptft)\n", + "v21 = st.mean(ptft_p1_uu.ptft)\n", + "v22 = st.mean(ptft_p2_uu.ptft)\n", + "v23 = st.mean(ptft_p3_uu.ptft)\n", + "v31 = st.mean(ptft_p1_dd.ptft)\n", + "v32 = st.mean(ptft_p2_dd.ptft)\n", + "v33 = st.mean(ptft_p3_dd.ptft)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "data = [[v11, v21, v31],\n", + "[v12, v22, v32],\n", + "[v13, v23, v33]]\n", + "X = np.arange(3)\n", + "fig = plt.figure()\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)\n", + "ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)\n", + "ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import statistics as st\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "v11 = st.mean(ptft_p1_t0.rad_n)\n", + "v12 = st.mean(ptft_p2_t0.rad_n)\n", + "v13 = st.mean(ptft_p3_t0.rad_n)\n", + "v21 = st.mean(ptft_p1_uu.rad_n)\n", + "v22 = st.mean(ptft_p2_uu.rad_n)\n", + "v23 = st.mean(ptft_p3_uu.rad_n)\n", + "v31 = st.mean(ptft_p1_dd.rad_n)\n", + "v32 = st.mean(ptft_p2_dd.rad_n)\n", + "v33 = st.mean(ptft_p3_dd.rad_n)\n", + "data = [[v11, v21, v31],\n", + "[v12, v22, v32],\n", + "[v13, v23, v33]]\n", + "X = np.arange(3)\n", + "fig = plt.figure()\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)\n", + "ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)\n", + "ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import statistics as st\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "v11 = st.median(ptft_p1_t0.rad_n)\n", + "v12 = st.median(ptft_p2_t0.rad_n)\n", + "v13 = st.median(ptft_p3_t0.rad_n)\n", + "v21 = st.median(ptft_p1_uu.rad_n)\n", + "v22 = st.median(ptft_p2_uu.rad_n)\n", + "v23 = st.median(ptft_p3_uu.rad_n)\n", + "v31 = st.median(ptft_p1_dd.rad_n)\n", + "v32 = st.median(ptft_p2_dd.rad_n)\n", + "v33 = st.median(ptft_p3_dd.rad_n)\n", + "data = [[v11, v21, v31],\n", + "[v12, v22, v32],\n", + "[v13, v23, v33]]\n", + "X = np.arange(3)\n", + "fig = plt.figure()\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)\n", + "ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)\n", + "ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import statistics as st\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "v11 = st.mean(ptft_p1_t0.rd_n)\n", + "v12 = st.mean(ptft_p2_t0.rd_n)\n", + "v13 = st.mean(ptft_p3_t0.rd_n)\n", + "v21 = st.mean(ptft_p1_uu.rd_n)\n", + "v22 = st.mean(ptft_p2_uu.rd_n)\n", + "v23 = st.mean(ptft_p3_uu.rd_n)\n", + "v31 = st.mean(ptft_p1_dd.rd_n)\n", + "v32 = st.mean(ptft_p2_dd.rd_n)\n", + "v33 = st.mean(ptft_p3_dd.rd_n)\n", + "data = [[v11, v21, v31],\n", + "[v12, v22, v32],\n", + "[v13, v23, v33]]\n", + "X = np.arange(3)\n", + "fig = plt.figure()\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)\n", + "ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)\n", + "ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import statistics as st\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "v11 = st.median(ptft_p1_t0.rd_n)\n", + "v12 = st.median(ptft_p2_t0.rd_n)\n", + "v13 = st.median(ptft_p3_t0.rd_n)\n", + "v21 = st.median(ptft_p1_uu.rd_n)\n", + "v22 = st.median(ptft_p2_uu.rd_n)\n", + "v23 = st.median(ptft_p3_uu.rd_n)\n", + "v31 = st.median(ptft_p1_dd.rd_n)\n", + "v32 = st.median(ptft_p2_dd.rd_n)\n", + "v33 = st.median(ptft_p3_dd.rd_n)\n", + "data = [[v11, v21, v31],\n", + "[v12, v22, v32],\n", + "[v13, v23, v33]]\n", + "X = np.arange(3)\n", + "fig = plt.figure()\n", + "ax = fig.add_axes([0,0,1,1])\n", + "ax.bar(X + 0.00, data[0], color = 'b', width = 0.25)\n", + "ax.bar(X + 0.25, data[1], color = 'g', width = 0.25)\n", + "ax.bar(X + 0.50, data[2], color = 'r', width = 0.25)" + ] + }, + { + "cell_type": "code", + "execution_count": 113, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "

df1

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegroup
0BobAccounting
1JakeEngineering
2LisaEngineering
3SueHR
\n", + "
\n", + "
\n", + "
\n", + "

df2

\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeehire_date
0Lisa2004
1Bob2008
2Jake2012
3Sue2014
\n", + "
\n", + "
" + ], + "text/plain": [ + "df1\n", + " employee group\n", + "0 Bob Accounting\n", + "1 Jake Engineering\n", + "2 Lisa Engineering\n", + "3 Sue HR\n", + "\n", + "df2\n", + " employee hire_date\n", + "0 Lisa 2004\n", + "1 Bob 2008\n", + "2 Jake 2012\n", + "3 Sue 2014" + ] + }, + "execution_count": 113, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "class display(object):\n", + " \"\"\"Display HTML representation of multiple objects\"\"\"\n", + " template = \"\"\"
\n", + "

{0}

{1}\n", + "
\"\"\"\n", + " def __init__(self, *args):\n", + " self.args = args\n", + " \n", + " def _repr_html_(self):\n", + " return '\\n'.join(self.template.format(a, eval(a)._repr_html_())\n", + " for a in self.args)\n", + " \n", + " def __repr__(self):\n", + " return '\\n\\n'.join(a + '\\n' + repr(eval(a))\n", + " for a in self.args)\n", + "df1 = pd.DataFrame({'employee': ['Bob', 'Jake', 'Lisa', 'Sue'],\n", + " 'group': ['Accounting', 'Engineering', 'Engineering', 'HR']})\n", + "df2 = pd.DataFrame({'employee': ['Lisa', 'Bob', 'Jake', 'Sue'],\n", + " 'hire_date': [2004, 2008, 2012, 2014]})\n", + "display('df1', 'df2') " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegrouphire_date
0BobAccounting2008
1JakeEngineering2012
2LisaEngineering2004
3SueHR2014
\n", + "
" + ], + "text/plain": [ + " employee group hire_date\n", + "0 Bob Accounting 2008\n", + "1 Jake Engineering 2012\n", + "2 Lisa Engineering 2004\n", + "3 Sue HR 2014" + ] + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df3 = pd.merge(df1, df2)\n", + "#df3" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "df4 = pd.concat([df1, df1])\n", + "#df4" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegrouptest
0BobAccounting1
1JakeEngineering1
2LisaEngineering3
3SueHR3
0BobAccounting1
1JakeEngineering1
2LisaEngineering3
3SueHR3
\n", + "
" + ], + "text/plain": [ + " employee group test\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 1\n", + "2 Lisa Engineering 3\n", + "3 Sue HR 3\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 1\n", + "2 Lisa Engineering 3\n", + "3 Sue HR 3" + ] + }, + "execution_count": 128, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df4" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegroupAddress
0BobAccounting0
1JakeEngineering0
2LisaEngineering0
3SueHR0
\n", + "
" + ], + "text/plain": [ + " employee group Address\n", + "0 Bob Accounting 0\n", + "1 Jake Engineering 0\n", + "2 Lisa Engineering 0\n", + "3 Sue HR 0" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "df3 = df1.copy()\n", + "df3['Address']=0\n", + "df3 " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1\n", + "2\n", + "3\n", + "4\n", + " employee group Address\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 6\n", + "2 Lisa Engineering 11\n", + "3 Sue HR 16\n" + ] + } + ], + "source": [ + "b=0\n", + "a=1\n", + "for i in range(0,4):\n", + " df3.at[b,'Address']=a\n", + " a+=5\n", + " b+=1\n", + " print(b) \n", + "print(df3) " + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegroupAddress
0BobAccounting1
1JakeEngineering6
2LisaEngineering11
3SueHR16
\n", + "
" + ], + "text/plain": [ + " employee group Address\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 6\n", + "2 Lisa Engineering 11\n", + "3 Sue HR 16" + ] + }, + "execution_count": 148, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df4=df3.copy()\n", + "df4" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegroupAddress
0BobAccounting2
1JakeEngineering7
2LisaEngineering12
3SueHR17
\n", + "
" + ], + "text/plain": [ + " employee group Address\n", + "0 Bob Accounting 2\n", + "1 Jake Engineering 7\n", + "2 Lisa Engineering 12\n", + "3 Sue HR 17" + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "b=0\n", + "a=2\n", + "for i in range(0,4):\n", + " df3.at[b,'Address']=a\n", + " a+=5\n", + " b+=1 \n", + "df3 " + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegroupAddress
0BobAccounting1
1JakeEngineering6
2LisaEngineering11
3SueHR16
0BobAccounting2
1JakeEngineering7
2LisaEngineering12
3SueHR17
\n", + "
" + ], + "text/plain": [ + " employee group Address\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 6\n", + "2 Lisa Engineering 11\n", + "3 Sue HR 16\n", + "0 Bob Accounting 2\n", + "1 Jake Engineering 7\n", + "2 Lisa Engineering 12\n", + "3 Sue HR 17" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df4 = pd.concat([df4, df3])\n", + "df4" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [], + "source": [ + "b=0\n", + "c+=1\n", + "a=c" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "A\n", + " employee group Address\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 6\n", + "2 Lisa Engineering 11\n", + "3 Sue HR 16\n", + "0 Bob Accounting 2\n", + "1 Jake Engineering 7\n", + "2 Lisa Engineering 12\n", + "3 Sue HR 17\n", + "A\n", + " employee group Address\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 6\n", + "2 Lisa Engineering 11\n", + "3 Sue HR 16\n", + "0 Bob Accounting 2\n", + "1 Jake Engineering 7\n", + "2 Lisa Engineering 12\n", + "3 Sue HR 17\n", + "0 Bob Accounting 3\n", + "1 Jake Engineering 8\n", + "2 Lisa Engineering 13\n", + "3 Sue HR 18\n" + ] + }, + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
employeegroupAddress
0BobAccounting1
1JakeEngineering6
2LisaEngineering11
3SueHR16
0BobAccounting2
1JakeEngineering7
2LisaEngineering12
3SueHR17
0BobAccounting3
1JakeEngineering8
2LisaEngineering13
3SueHR18
\n", + "
" + ], + "text/plain": [ + " employee group Address\n", + "0 Bob Accounting 1\n", + "1 Jake Engineering 6\n", + "2 Lisa Engineering 11\n", + "3 Sue HR 16\n", + "0 Bob Accounting 2\n", + "1 Jake Engineering 7\n", + "2 Lisa Engineering 12\n", + "3 Sue HR 17\n", + "0 Bob Accounting 3\n", + "1 Jake Engineering 8\n", + "2 Lisa Engineering 13\n", + "3 Sue HR 18" + ] + }, + "execution_count": 152, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import numpy as np\n", + "\n", + "df3 = df1.copy()\n", + "df3['Address']=0\n", + "#\n", + "b=0\n", + "a=1\n", + "for i in range(0,4):\n", + " df3.at[b,'Address']=a\n", + " a+=5\n", + " b+=1 \n", + "# \n", + "df4=df3.copy()\n", + "b=0\n", + "a=2\n", + "c=2\n", + "for i in range(1,3):\n", + " for i in range(0,4):\n", + " df3.at[b,'Address']=a\n", + " a+=5\n", + " b+=1 \n", + " df4 = pd.concat([df4, df3])\n", + " b=0\n", + " c+=1\n", + " a=c\n", + " print(\"A\")\n", + " print(df4)\n", + "df4" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'df1' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf3\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf1\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0mdf3\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'count'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;31m# création de la colonne count\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0mb\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'df1' is not defined" + ] + } + ], + "source": [ + "import numpy as np\n", + "df3 = df1.copy()\n", + "df3['count']=0\n", + "# création de la colonne count\n", + "b=0\n", + "a=0 #1\n", + "n=4 # 4 lignes // 2160 lignes \n", + "for i in range(0,n):\n", + " df3.at[b,'count']=a\n", + " a+= 5 #+=240\n", + " b+=1 \n", + "# on va répliquer la même chose 240 fois pour avoir une observation \n", + "# par seconde par sujet \n", + "df3['secnd']=0 #@\n", + "df4=df3.copy()\n", + "b=0\n", + "a=1 # 2\n", + "c=1 #2\n", + "n=4 # 4: répéter 5 fois // 240 / nbr de secondes 2min\n", + "v=4 # 2160 / (8 sujets * 18 marchés * 15 périodes)\n", + "for i in range(0,n):\n", + " for i in range(0,v):\n", + " df3.at[b,'count']=a\n", + " a+= 5 # +=120\n", + " b+=1\n", + " df3['secnd']=c #@ \n", + " df4 = pd.concat([df4, df3])\n", + " b=0\n", + " c+=1\n", + " a=c\n", + "# print(\"A\")\n", + "# print(df4)\n", + "df4\n", + "df5 = df4.sort_values(by=['count'])\n", + "df5" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# pour importer une table Excel\n", + "import pandas as pd\n", + "ddf = pd.read_excel('/Users/waelbousselmi/Desktop/data_mc_2021.xlsx')\n", + "#print(ddf)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "170703_0850 2160\n", + "nmarket 2160\n", + "traitement 2160\n", + "treament 2160\n", + "Period 2160\n", + "Subject 2160\n", + "UpperBound1 2160\n", + "MedianP1 2160\n", + "LowerBound1 2160\n", + "StartWealth 2160\n", + "EndWealth 2160\n", + "variation_wealth 2160\n", + "GainPrevision 2160\n", + "GainPrevisionCumule 2160\n", + "Risk_debutperiode 2160\n", + "Risk_finperiode 2160\n", + "variation_risk 2160\n", + "StartMoney 2160\n", + "StartStock 2160\n", + "EndMoney 2160\n", + "EndStock 2160\n", + "VarMoney 2160\n", + "VarStock 2160\n", + "TResult 2160\n", + "TotalDividende 2160\n", + "DividendeCumule 2160\n", + "MaxPrice 2160\n", + "MinPrice 2160\n", + "MeanPrice 2160\n", + "MedianPrice 2160\n", + "GainFinal 2160\n", + "GainFinalEUR 2160\n", + "GainForecastECU 2160\n", + "GainForecastEUR 2160\n", + "CompteEpargne 2160\n", + "CompteEpargneEUR 2160\n", + "dtype: int64" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ddf.count()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
170703_0850nmarkettraitementtreamentPeriodSubjectUpperBound1MedianP1LowerBound1StartWealth...MedianPriceGainFinalGainFinalEURGainForecastECUGainForecastEURCompteEpargneCompteEpargneEURcountsecndsecnd2
0170703_08501HH011320.0320.0320.06750.0...290.007350.021.781012.503.00877.502.60000
0170703_08501HH011320.0320.0320.06750.0...290.007350.021.781012.503.00877.502.60111
0170703_08501HH011320.0320.0320.06750.0...290.007350.021.781012.503.00877.502.60222
0170703_08501HH011320.0320.0320.06750.0...290.007350.021.781012.503.00877.502.60333
0170703_08501HH011320.0320.0320.06750.0...290.007350.021.781012.503.00877.502.60444
..................................................................
2159171026_083818NO2158-111.0-111.0-111.07795.0...300.757810.023.142413.447.152128.446.312613551161796
2159171026_083818NO2158-111.0-111.0-111.07795.0...300.757810.023.142413.447.152128.446.312613561171797
2159171026_083818NO2158-111.0-111.0-111.07795.0...300.757810.023.142413.447.152128.446.312613571181798
2159171026_083818NO2158-111.0-111.0-111.07795.0...300.757810.023.142413.447.152128.446.312613581191799
2159171026_083818NO2158-111.0-111.0-111.07795.0...300.757810.023.142413.447.152128.446.312613591201800
\n", + "

261360 rows × 39 columns

\n", + "
" + ], + "text/plain": [ + " 170703_0850 nmarket traitement treament Period Subject UpperBound1 \\\n", + "0 170703_0850 1 HH 0 1 1 320.0 \n", + "0 170703_0850 1 HH 0 1 1 320.0 \n", + "0 170703_0850 1 HH 0 1 1 320.0 \n", + "0 170703_0850 1 HH 0 1 1 320.0 \n", + "0 170703_0850 1 HH 0 1 1 320.0 \n", + "... ... ... ... ... ... ... ... \n", + "2159 171026_0838 18 NO 2 15 8 -111.0 \n", + "2159 171026_0838 18 NO 2 15 8 -111.0 \n", + "2159 171026_0838 18 NO 2 15 8 -111.0 \n", + "2159 171026_0838 18 NO 2 15 8 -111.0 \n", + "2159 171026_0838 18 NO 2 15 8 -111.0 \n", + "\n", + " MedianP1 LowerBound1 StartWealth ... MedianPrice GainFinal \\\n", + "0 320.0 320.0 6750.0 ... 290.00 7350.0 \n", + "0 320.0 320.0 6750.0 ... 290.00 7350.0 \n", + "0 320.0 320.0 6750.0 ... 290.00 7350.0 \n", + "0 320.0 320.0 6750.0 ... 290.00 7350.0 \n", + "0 320.0 320.0 6750.0 ... 290.00 7350.0 \n", + "... ... ... ... ... ... ... \n", + "2159 -111.0 -111.0 7795.0 ... 300.75 7810.0 \n", + "2159 -111.0 -111.0 7795.0 ... 300.75 7810.0 \n", + "2159 -111.0 -111.0 7795.0 ... 300.75 7810.0 \n", + "2159 -111.0 -111.0 7795.0 ... 300.75 7810.0 \n", + "2159 -111.0 -111.0 7795.0 ... 300.75 7810.0 \n", + "\n", + " GainFinalEUR GainForecastECU GainForecastEUR CompteEpargne \\\n", + "0 21.78 1012.50 3.00 877.50 \n", + "0 21.78 1012.50 3.00 877.50 \n", + "0 21.78 1012.50 3.00 877.50 \n", + "0 21.78 1012.50 3.00 877.50 \n", + "0 21.78 1012.50 3.00 877.50 \n", + "... ... ... ... ... \n", + "2159 23.14 2413.44 7.15 2128.44 \n", + "2159 23.14 2413.44 7.15 2128.44 \n", + "2159 23.14 2413.44 7.15 2128.44 \n", + "2159 23.14 2413.44 7.15 2128.44 \n", + "2159 23.14 2413.44 7.15 2128.44 \n", + "\n", + " CompteEpargneEUR count secnd secnd2 \n", + "0 2.60 0 0 0 \n", + "0 2.60 1 1 1 \n", + "0 2.60 2 2 2 \n", + "0 2.60 3 3 3 \n", + "0 2.60 4 4 4 \n", + "... ... ... ... ... \n", + "2159 6.31 261355 116 1796 \n", + "2159 6.31 261356 117 1797 \n", + "2159 6.31 261357 118 1798 \n", + "2159 6.31 261358 119 1799 \n", + "2159 6.31 261359 120 1800 \n", + "\n", + "[261360 rows x 39 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#1ere étape (note garder l'ordre)\n", + "import numpy as np\n", + "ddf3 = ddf.copy()\n", + "ddf3['count']=0\n", + "# création de la colonne count\n", + "b=0\n", + "a=0\n", + "n=2160 # 4 lignes // 2160 lignes \n", + "for i in range(0,n):\n", + " ddf3.at[b,'count']=a\n", + " a+= 121 # +=121\n", + " b+=1\n", + "# 2eme étape \n", + "# on va répliquer la même chose 120 fois pour avoir une observation \n", + "# par seconde par sujet \n", + "ddf3['secnd']=0 #@\n", + "ddf4=ddf3.copy()\n", + "b=0\n", + "a=1\n", + "c=1\n", + "n=120 # 4: répéter 5 fois // 120 nbr de secondes 2min (avec sec=0 avant de commencer le marché)\n", + "v=2160 # 2160 / (8 sujets * 18 marchés * 15 périodes)\n", + "for i in range(0,n):\n", + " for i in range(0,v):\n", + " ddf3.at[b,'count']=a\n", + " a+=121 # +=121 2min\n", + " b+=1\n", + " ddf3['secnd']=c #@ \n", + " ddf4 = pd.concat([ddf4, ddf3])\n", + " b=0\n", + " c+=1\n", + " a=c\n", + "#ddf4\n", + "ddf4['secnd2']= ddf4['secnd'] + (120* (ddf4['Period']-1))\n", + "ddf5 = ddf4.sort_values(by=['count'])\n", + "ddf5" + ] + }, + { + "cell_type": "code", + "execution_count": 322, + "metadata": { + "collapsed": true, + "jupyter": { + "outputs_hidden": true + } + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'ddf5' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mddf5\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mby\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'nmarket'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Subject'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'Period'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'secnd'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mddf5\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mr'/Users/waelbousselmi/Desktop/ddf5.csv'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheader\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mNameError\u001b[0m: name 'ddf5' is not defined" + ] + } + ], + "source": [ + "ddf5.to_csv(r'/Users/waelbousselmi/Desktop/ddf5.csv', index = False, header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "# pour importer une table Excel\n", + "import pandas as pd\n", + "df6 = pd.read_excel('/Users/waelbousselmi/Desktop/risque_continu.xlsx')\n", + "#print(ddf)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df7 = pd.read_csv('/Users/waelbousselmi/Desktop/ddf5.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 315, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "875" + ] + }, + "execution_count": 315, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "#df6.shape[0] #875\n", + "#df7.shape[0] # 261360" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "alpha = 34 sur 34\n" + ] + } + ], + "source": [ + "###### pour intégrer les valeurs risque \n", + "df7['risk_test']= \"\"\n", + "a = df7.shape[0] # 875\n", + "b = 34 # df6.shape[0] # 261360\n", + "alpha = 0\n", + "c=0\n", + "for i in range (0,b):\n", + " for i in range (0,a):\n", + " if (df6.at[c,\"nmarket\"]==df7.at[i,\"nmarket\"] and \n", + " df6.at[c,\"Subject\"]==df7.at[i,\"Subject\"] and\n", + " df6.at[c,\"Period\"]==df7.at[i,\"Period\"] and \n", + " df6.at[c,\"treatment\"]==df7.at[i,\"traitement\"] and \n", + " df6.at[c,\"timerisk_start\"]==df7.at[i,\"secnd2\"]):\n", + "# print(\"A\",i, \"/ sujet=\",df6.at[c,\"Subject\"], \"/ période=\",df6.at[c,\"Period\"],\"/ traitement\",df6.at[c,\"treatment\"], \"/ nmarket\",df6.at[c,\"nmarket\"],\n", + "# \"/ q1_risk=\", df6.at[c,\"q1_risk\"], \"/ temps_sec:\",df6.at[c,\"timerisk_start\"] )\n", + " df7.at[i,'risk_test'] = df6.at[c,\"q1_risk\"]\n", + " alpha +=1 \n", + " c+=1\n", + "# print(\"c=\",c)\n", + "print(\"alpha = \", alpha, \"sur\",b)" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "# ça pris > 30 min pour faire la boucle !!!\n", + "# df7.to_csv(r'/Users/waelbousselmi/Desktop/df7_test.csv', index = False, header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df7 = pd.read_csv('/Users/waelbousselmi/Desktop/df7.csv')\n", + "#/Users/waelbousselmi/Google Drive/docs_multiples_chocs/doc_MC_juin2021/df13.csv" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [], + "source": [ + "df8 = df7.sort_values(by=['nmarket', 'Subject', 'Period', 'secnd2']) #, ascending = (False) !!! " + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "## très très important (after sorting or concat) !!!!!\n", + "df9 = df8.reset_index(drop=True)\n", + "#df9.at[150,\"Subject\"] # pour vérifier" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [], + "source": [ + "## très important pour remplacer les NaN !!!!\n", + "df9['risk_test'] = df9['risk_test'].fillna(\"\")" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [], + "source": [ + "#df9.at[3,\"risk_test\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [], + "source": [ + "#len(df9)" + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": {}, + "outputs": [], + "source": [ + "#len(df9[(df9['secnd']== 120)])" + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": {}, + "outputs": [], + "source": [ + "#len(df9[(df9['secnd2']== 120)])" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [], + "source": [ + "# pour supprimer les doublants avec eg. secnd2 = 120 deux fois !!!!!!!! (important)\n", + "df10 = df9[(df9['secnd']== 0) & (df9['secnd2']!= 0)].index\n", + "df9.drop(df10 , inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [], + "source": [ + "df11 = df9.copy()" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [], + "source": [ + "df11['risk_test2']=df11['risk_test']" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [], + "source": [ + "## très très important (after sorting or concat) !!!!!\n", + "df12 = df11.reset_index(drop=True) # faut créer un nouveau df si non ça ne marche pas " + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "962\n" + ] + } + ], + "source": [ + "a = df12.shape[0]\n", + "count=0\n", + "for i in range (0,a):\n", + " if df12.at[i,'Period'] != \"\":\n", + " val = df12.at[i,'risk_test2']\n", + "# print(i,val)\n", + " count +=1\n", + " else :\n", + " df12.at[i,'risk_test2'] = val \n", + "print(count) " + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
170703_0850nmarkettraitementtreamentPeriodSubjectUpperBound1MedianP1LowerBound1StartWealth...GainFinalEURGainForecastECUGainForecastEURCompteEpargneCompteEpargneEURcountsecndsecnd2risk_testrisk_test2
0170703_08501HH011320.0320.0320.06750.0...21.781012.503.00877.502.600001010
1170703_08501HH011320.0320.0320.06750.0...21.781012.503.00877.502.6011110
2170703_08501HH011320.0320.0320.06750.0...21.781012.503.00877.502.6022210
3170703_08501HH011320.0320.0320.06750.0...21.781012.503.00877.502.6033310
4170703_08501HH011320.0320.0320.06750.0...21.781012.503.00877.502.6044410
..................................................................
259339171026_083818NO2158-111.0-111.0-111.07795.0...23.142413.447.152128.446.3126135511617963
259340171026_083818NO2158-111.0-111.0-111.07795.0...23.142413.447.152128.446.3126135611717973
259341171026_083818NO2158-111.0-111.0-111.07795.0...23.142413.447.152128.446.3126135711817983
259342171026_083818NO2158-111.0-111.0-111.07795.0...23.142413.447.152128.446.3126135811917993
259343171026_083818NO2158-111.0-111.0-111.07795.0...23.142413.447.152128.446.31261359120180000
\n", + "

259344 rows × 41 columns

\n", + "
" + ], + "text/plain": [ + " 170703_0850 nmarket traitement treament Period Subject \\\n", + "0 170703_0850 1 HH 0 1 1 \n", + "1 170703_0850 1 HH 0 1 1 \n", + "2 170703_0850 1 HH 0 1 1 \n", + "3 170703_0850 1 HH 0 1 1 \n", + "4 170703_0850 1 HH 0 1 1 \n", + "... ... ... ... ... ... ... \n", + "259339 171026_0838 18 NO 2 15 8 \n", + "259340 171026_0838 18 NO 2 15 8 \n", + "259341 171026_0838 18 NO 2 15 8 \n", + "259342 171026_0838 18 NO 2 15 8 \n", + "259343 171026_0838 18 NO 2 15 8 \n", + "\n", + " UpperBound1 MedianP1 LowerBound1 StartWealth ... GainFinalEUR \\\n", + "0 320.0 320.0 320.0 6750.0 ... 21.78 \n", + "1 320.0 320.0 320.0 6750.0 ... 21.78 \n", + "2 320.0 320.0 320.0 6750.0 ... 21.78 \n", + "3 320.0 320.0 320.0 6750.0 ... 21.78 \n", + "4 320.0 320.0 320.0 6750.0 ... 21.78 \n", + "... ... ... ... ... ... ... \n", + "259339 -111.0 -111.0 -111.0 7795.0 ... 23.14 \n", + "259340 -111.0 -111.0 -111.0 7795.0 ... 23.14 \n", + "259341 -111.0 -111.0 -111.0 7795.0 ... 23.14 \n", + "259342 -111.0 -111.0 -111.0 7795.0 ... 23.14 \n", + "259343 -111.0 -111.0 -111.0 7795.0 ... 23.14 \n", + "\n", + " GainForecastECU GainForecastEUR CompteEpargne CompteEpargneEUR \\\n", + "0 1012.50 3.00 877.50 2.60 \n", + "1 1012.50 3.00 877.50 2.60 \n", + "2 1012.50 3.00 877.50 2.60 \n", + "3 1012.50 3.00 877.50 2.60 \n", + "4 1012.50 3.00 877.50 2.60 \n", + "... ... ... ... ... \n", + "259339 2413.44 7.15 2128.44 6.31 \n", + "259340 2413.44 7.15 2128.44 6.31 \n", + "259341 2413.44 7.15 2128.44 6.31 \n", + "259342 2413.44 7.15 2128.44 6.31 \n", + "259343 2413.44 7.15 2128.44 6.31 \n", + "\n", + " count secnd secnd2 risk_test risk_test2 \n", + "0 0 0 0 10 10 \n", + "1 1 1 1 10 \n", + "2 2 2 2 10 \n", + "3 3 3 3 10 \n", + "4 4 4 4 10 \n", + "... ... ... ... ... ... \n", + "259339 261355 116 1796 3 \n", + "259340 261356 117 1797 3 \n", + "259341 261357 118 1798 3 \n", + "259342 261358 119 1799 3 \n", + "259343 261359 120 1800 0 0 \n", + "\n", + "[259344 rows x 41 columns]" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df12" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [], + "source": [ + "#df12.to_csv(r'/Users/waelbousselmi/Desktop/df12.csv', index = False, header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": {}, + "outputs": [], + "source": [ + "df13 = df12.rename(columns={'170703_0850': 'ref_date'}) ## pour renommer une colonne\n", + "#df13.to_stata('/Users/waelbousselmi/Desktop/df13.dta') ### je n'ai pas besoin d'avoir un format dta " + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "df13['choc1']= \"\"\n", + "a = df13.shape[0] \n", + "for i in range (0,a):\n", + " if (df13.at[i,\"Period\"] > 5 and df13.at[i,\"traitement\"] != \"NO\"):\n", + " df13.at[i,\"choc1\"] = 1\n", + " else:\n", + " df13.at[i,\"choc1\"] = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "df13['choc2']= \"\"\n", + "a = df13.shape[0] \n", + "for i in range (0,a):\n", + " if (df13.at[i,\"Period\"] > 10 and df13.at[i,\"traitement\"] != \"NO\"):\n", + " df13.at[i,\"choc2\"] = 1\n", + " else:\n", + " df13.at[i,\"choc2\"] = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "df13['choc1_nn']= \"\"\n", + "a = df13.shape[0] \n", + "for i in range (0,a):\n", + " if (df13.at[i,\"Period\"] > 5 and df13.at[i,\"Period\"] < 11 and df13.at[i,\"traitement\"] != \"NO\"):\n", + " df13.at[i,\"choc1_nn\"] = 1\n", + " elif (df13.at[i,\"Period\"] <6 and df13.at[i,\"traitement\"] != \"NO\"):\n", + " df13.at[i,\"choc1_nn\"] = 0" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [], + "source": [ + "df13['choc2']= \"\"\n", + "a = df13.shape[0] \n", + "for i in range (0,a):\n", + " if (df13.at[i,\"Period\"] < 11):\n", + " df13.at[i,\"choc2\"] = 0\n", + " else:\n", + " df13.at[i,\"choc2\"] = 1" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ref_datenmarkettraitementtreamentPeriodSubjectUpperBound1MedianP1LowerBound1StartWealth...CompteEpargneCompteEpargneEURcountsecndsecnd2risk_testrisk_test2choc1choc2newid
0170703_08501HH011320.0320.0320.06750.0...877.502.6000010.010.0001
1170703_08501HH011320.0320.0320.06750.0...877.502.60111NaN10.0001
2170703_08501HH011320.0320.0320.06750.0...877.502.60222NaN10.0001
3170703_08501HH011320.0320.0320.06750.0...877.502.60333NaN10.0001
4170703_08501HH011320.0320.0320.06750.0...877.502.60444NaN10.0001
..................................................................
259339171026_083818NO2158-111.0-111.0-111.07795.0...2128.446.312613551161796NaN3.011144
259340171026_083818NO2158-111.0-111.0-111.07795.0...2128.446.312613561171797NaN3.011144
259341171026_083818NO2158-111.0-111.0-111.07795.0...2128.446.312613571181798NaN3.011144
259342171026_083818NO2158-111.0-111.0-111.07795.0...2128.446.312613581191799NaN3.011144
259343171026_083818NO2158-111.0-111.0-111.07795.0...2128.446.3126135912018000.00.011144
\n", + "

259344 rows × 44 columns

\n", + "
" + ], + "text/plain": [ + " ref_date nmarket traitement treament Period Subject \\\n", + "0 170703_0850 1 HH 0 1 1 \n", + "1 170703_0850 1 HH 0 1 1 \n", + "2 170703_0850 1 HH 0 1 1 \n", + "3 170703_0850 1 HH 0 1 1 \n", + "4 170703_0850 1 HH 0 1 1 \n", + "... ... ... ... ... ... ... \n", + "259339 171026_0838 18 NO 2 15 8 \n", + "259340 171026_0838 18 NO 2 15 8 \n", + "259341 171026_0838 18 NO 2 15 8 \n", + "259342 171026_0838 18 NO 2 15 8 \n", + "259343 171026_0838 18 NO 2 15 8 \n", + "\n", + " UpperBound1 MedianP1 LowerBound1 StartWealth ... CompteEpargne \\\n", + "0 320.0 320.0 320.0 6750.0 ... 877.50 \n", + "1 320.0 320.0 320.0 6750.0 ... 877.50 \n", + "2 320.0 320.0 320.0 6750.0 ... 877.50 \n", + "3 320.0 320.0 320.0 6750.0 ... 877.50 \n", + "4 320.0 320.0 320.0 6750.0 ... 877.50 \n", + "... ... ... ... ... ... ... \n", + "259339 -111.0 -111.0 -111.0 7795.0 ... 2128.44 \n", + "259340 -111.0 -111.0 -111.0 7795.0 ... 2128.44 \n", + "259341 -111.0 -111.0 -111.0 7795.0 ... 2128.44 \n", + "259342 -111.0 -111.0 -111.0 7795.0 ... 2128.44 \n", + "259343 -111.0 -111.0 -111.0 7795.0 ... 2128.44 \n", + "\n", + " CompteEpargneEUR count secnd secnd2 risk_test risk_test2 choc1 \\\n", + "0 2.60 0 0 0 10.0 10.0 0 \n", + "1 2.60 1 1 1 NaN 10.0 0 \n", + "2 2.60 2 2 2 NaN 10.0 0 \n", + "3 2.60 3 3 3 NaN 10.0 0 \n", + "4 2.60 4 4 4 NaN 10.0 0 \n", + "... ... ... ... ... ... ... ... \n", + "259339 6.31 261355 116 1796 NaN 3.0 1 \n", + "259340 6.31 261356 117 1797 NaN 3.0 1 \n", + "259341 6.31 261357 118 1798 NaN 3.0 1 \n", + "259342 6.31 261358 119 1799 NaN 3.0 1 \n", + "259343 6.31 261359 120 1800 0.0 0.0 1 \n", + "\n", + " choc2 newid \n", + "0 0 1 \n", + "1 0 1 \n", + "2 0 1 \n", + "3 0 1 \n", + "4 0 1 \n", + "... ... ... \n", + "259339 1 144 \n", + "259340 1 144 \n", + "259341 1 144 \n", + "259342 1 144 \n", + "259343 1 144 \n", + "\n", + "[259344 rows x 44 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "#df14 = df13.groupby('secnd2').risk_test2.mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [], + "source": [ + "#df14" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "# calcul interval de confiance (autre méthode de calcul) \n", + "#import numpy as np\n", + "#import scipy.stats as st\n", + "#data = df14\n", + "#st.t.interval(alpha=0.95, df=len(data)-1, loc=np.mean(data), scale=st.sem(data)) " + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": {}, + "outputs": [], + "source": [ + "# nouvelle variable \"newid\", id pour chaque sujet \n", + "df13['newid']= \"\"\n", + "a = df13.shape[0]\n", + "var = 1\n", + "cc = df13.at[0,\"Subject\"]\n", + "for i in range (0,a):\n", + " if (df13.at[i,\"Subject\"] == cc):\n", + " df13.at[i,\"newid\"] = var\n", + " else:\n", + " cc = df13.at[i,\"Subject\"]\n", + " var += 1\n", + " df13.at[i,\"newid\"] = var" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "df13 = pd.read_csv('/Users/waelbousselmi/Google Drive/docs_multiples_chocs/doc_MC_juin2021/df13.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "df13.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "dfhh = df13[(df13[\"traitement\"] == \"HH\")]\n", + "dfbb = df13[(df13[\"traitement\"] == \"BB\")]\n", + "dft0 = df13[(df13[\"traitement\"] == \"NO\")]" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "# pour créer deux groupe par traitement (groupe 1: ceux qui sont plus averses au risque et \n", + "#groupe 2: ceux qui sont plus amateurs de risque)\n", + "import statistics as st\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "median1 = st.median(dfhh[\"risk_test2\"])\n", + "median2 = st.median(dfbb[\"risk_test2\"])\n", + "median3 = st.median(dft0[\"risk_test2\"])\n", + "dfhh_g1 = dfhh[(dfhh[\"risk_test2\"] < median1)]\n", + "dfhh_g2 = dfhh[(dfhh[\"risk_test2\"] >= median1)]\n", + "dfbb_g1 = dfbb[(dfbb[\"risk_test2\"] < median2)]\n", + "dfbb_g2 = dfbb[(dfbb[\"risk_test2\"] >= median2)]\n", + "dft0_g1 = dft0[(dft0[\"risk_test2\"] < median3)]\n", + "dft0_g2 = dft0[(dft0[\"risk_test2\"] >= median3)]" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "# pour calculer l'interval de confiance à 95%\n", + "import pandas as pd\n", + "import numpy as np\n", + "import math\n", + "\n", + "stats_hh = dfhh.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "stats_bb = dfbb.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "stats_t0 = dft0.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "\n", + "stats_hh_g1 = dfhh_g1.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "stats_bb_g1 = dfbb_g1.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "stats_t0_g1 = dft0_g1.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "\n", + "stats_hh_g2 = dfhh_g2.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "stats_bb_g2 = dfbb_g2.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "stats_t0_g2 = dft0_g2.groupby(['secnd2'])['risk_test2'].agg(['mean', 'count', 'std'])\n", + "\n", + "\n", + "ci95_hi_hh = []\n", + "ci95_lo_hh = []\n", + "ci95_hi_bb = []\n", + "ci95_lo_bb = []\n", + "ci95_hi_t0 = []\n", + "ci95_lo_t0 = []\n", + "\n", + "ci95_hi_hh_g1 = []\n", + "ci95_lo_hh_g1 = []\n", + "ci95_hi_bb_g1 = []\n", + "ci95_lo_bb_g1 = []\n", + "ci95_hi_t0_g1 = []\n", + "ci95_lo_t0_g1 = []\n", + "\n", + "ci95_hi_hh_g2 = []\n", + "ci95_lo_hh_g2 = []\n", + "ci95_hi_bb_g2 = []\n", + "ci95_lo_bb_g2 = []\n", + "ci95_hi_t0_g2 = []\n", + "ci95_lo_t0_g2 = []\n", + "\n", + "for i in stats_hh.index:\n", + " m, c, s = stats_hh.loc[i]\n", + " ci95_hi_hh.append(m + 1.95*s/math.sqrt(c))\n", + " ci95_lo_hh.append(m - 1.95*s/math.sqrt(c))\n", + "\n", + "for i in stats_bb.index:\n", + " m1, c1, s1 = stats_bb.loc[i]\n", + " ci95_hi_bb.append(m1 + 1.95*s1/math.sqrt(c1))\n", + " ci95_lo_bb.append(m1 - 1.95*s1/math.sqrt(c1))\n", + "\n", + "for i in stats_t0.index:\n", + " m2, c2, s2 = stats_t0.loc[i]\n", + " ci95_hi_t0.append(m2 + 1.95*s2/math.sqrt(c2))\n", + " ci95_lo_t0.append(m2 - 1.95*s2/math.sqrt(c2))\n", + "\n", + " \n", + "for i in stats_hh_g1.index:\n", + " m_g1_g1, c_g1, s_g1 = stats_hh_g1.loc[i]\n", + " ci95_hi_hh_g1.append(m_g1 + 1.95*s_g1/math.sqrt(c_g1))\n", + " ci95_lo_hh_g1.append(m_g1 - 1.95*s_g1/math.sqrt(c_g1))\n", + "\n", + "for i in stats_bb_g1.index:\n", + " m1_g1, c1_g1, s1_g1 = stats_bb_g1.loc[i]\n", + " ci95_hi_bb_g1.append(m1_g1 + 1.95*s1_g1/math.sqrt(c1_g1))\n", + " ci95_lo_bb_g1.append(m1_g1 - 1.95*s1_g1/math.sqrt(c1_g1))\n", + "\n", + "for i in stats_t0_g1.index:\n", + " m2_g1, c2_g1, s2_g1 = stats_t0_g1.loc[i]\n", + " ci95_hi_t0_g1.append(m2_g1 + 1.95*s2_g1/math.sqrt(c2_g1))\n", + " ci95_lo_t0_g1.append(m2_g1 - 1.95*s2_g1/math.sqrt(c2_g1))\n", + "\n", + " \n", + "for i in stats_hh_g2.index:\n", + " m_g2, c_g2, s_g2 = stats_hh_g2.loc[i]\n", + " ci95_hi_hh_g2.append(m_g2 + 1.95*s_g2/math.sqrt(c_g2))\n", + " ci95_lo_hh_g2.append(m_g2 - 1.95*s_g2/math.sqrt(c_g2))\n", + "\n", + "for i in stats_bb_g2.index:\n", + " m1_g2, c1_g2, s1_g2 = stats_bb_g2.loc[i]\n", + " ci95_hi_bb_g2.append(m1_g2 + 1.95*s1_g2/math.sqrt(c1_g2))\n", + " ci95_lo_bb_g2.append(m1_g2 - 1.95*s1_g2/math.sqrt(c1_g2))\n", + "\n", + "for i in stats_t0_g2.index:\n", + " m2_g2, c2_g2, s2_g2 = stats_t0_g2.loc[i]\n", + " ci95_hi_t0_g2.append(m2_g2 + 1.95*s2_g2/math.sqrt(c2_g2))\n", + " ci95_lo_t0_g2.append(m2_g2 - 1.95*s2_g2/math.sqrt(c2_g2))\n", + "\n", + " \n", + "stats_hh['ci95_hi_hh'] = ci95_hi_hh\n", + "stats_hh['ci95_lo_hh'] = ci95_lo_hh\n", + "stats_bb['ci95_hi_bb'] = ci95_hi_bb\n", + "stats_bb['ci95_lo_bb'] = ci95_lo_bb\n", + "stats_t0['ci95_hi_t0'] = ci95_hi_t0\n", + "stats_t0['ci95_lo_t0'] = ci95_lo_t0\n", + "\n", + "stats_hh_g1['ci95_hi_hh_g1'] = ci95_hi_hh_g1\n", + "stats_hh_g1['ci95_lo_hh_g1'] = ci95_lo_hh_g1\n", + "stats_bb_g1['ci95_hi_bb_g1'] = ci95_hi_bb_g1\n", + "stats_bb_g1['ci95_lo_bb_g1'] = ci95_lo_bb_g1\n", + "stats_t0_g1['ci95_hi_t0_g1'] = ci95_hi_t0_g1\n", + "stats_t0_g1['ci95_lo_t0_g1'] = ci95_lo_t0_g1\n", + "\n", + "stats_hh_g2['ci95_hi_hh_g2'] = ci95_hi_hh_g2\n", + "stats_hh_g2['ci95_lo_hh_g2'] = ci95_lo_hh_g2\n", + "stats_bb_g2['ci95_hi_bb_g2'] = ci95_hi_bb_g2\n", + "stats_bb_g2['ci95_lo_bb_g2'] = ci95_lo_bb_g2\n", + "stats_t0_g2['ci95_hi_t0_g2'] = ci95_hi_t0_g2\n", + "stats_t0_g2['ci95_lo_t0_g2'] = ci95_lo_t0_g2\n", + "\n", + "#print(stats)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.colors import colorConverter as cc\n", + "import numpy as np\n", + "from matplotlib.collections import LineCollection\n", + " \n", + "def plot_mean_and_CI(mean, lb, ub, color_mean=None, color_shading=None):\n", + " # plot the shaded range of the confidence intervals\n", + " plt.fill_between(range(mean.shape[0]), ub, lb,\n", + " color=color_shading, alpha=.3)\n", + " # plot the mean on top\n", + " plt.plot(mean, color_mean, lw=5)\n", + " \n", + "# generate 3 sets of random means and confidence intervals to plot\n", + "mean0 = stats_hh[\"mean\"]\n", + "ub0 = stats_hh['ci95_hi_hh']\n", + "lb0 = stats_hh['ci95_lo_hh']\n", + " \n", + "mean1 = stats_bb[\"mean\"]\n", + "ub1 = stats_bb['ci95_hi_bb']\n", + "lb1 = stats_bb['ci95_lo_bb']\n", + " \n", + "mean2 = stats_t0[\"mean\"]\n", + "ub2 = stats_t0['ci95_hi_t0']\n", + "lb2 = stats_t0['ci95_lo_t0']\n", + " \n", + " \n", + "# plot the data\n", + "fig = plt.figure(1, figsize=(10, 10))\n", + "plot_mean_and_CI(mean0, ub0, lb0, color_mean='g', color_shading='green')\n", + "plot_mean_and_CI(mean1, ub1, lb1, color_mean='r', color_shading='red')\n", + "plot_mean_and_CI(mean2, ub2, lb2, color_mean='b', color_shading='blue')\n", + " \n", + "class LegendObject(object):\n", + " def __init__(self, facecolor='red', edgecolor='white', dashed=False):\n", + " self.facecolor = facecolor\n", + " self.edgecolor = edgecolor\n", + " self.dashed = dashed\n", + " \n", + " def legend_artist(self, legend, orig_handle, fontsize, handlebox):\n", + " x0, y0 = handlebox.xdescent, handlebox.ydescent\n", + " width, height = handlebox.width, handlebox.height\n", + " patch = mpatches.Rectangle(\n", + " # create a rectangle that is filled with color\n", + " [x0, y0], width, height, facecolor=self.facecolor,\n", + " # and whose edges are the faded color\n", + " edgecolor=self.edgecolor, lw=3)\n", + " handlebox.add_artist(patch)\n", + " \n", + " # if we're creating the legend for a dashed line,\n", + " # manually add the dash in to our rectangle\n", + " if self.dashed:\n", + " patch1 = mpatches.Rectangle(\n", + " [x0 + 2*width/5, y0], width/5, height, facecolor=self.edgecolor,\n", + " transform=handlebox.get_transform())\n", + " handlebox.add_artist(patch1)\n", + " \n", + " return patch\n", + " \n", + "bg = np.array([1, 1, 1]) # background of the legend is white\n", + "colors = ['g', 'r', 'b']\n", + "# with alpha = .5, the faded color is the average of the background and color\n", + "colors_faded = [(np.array(cc.to_rgb(color)) + bg) / 2.0 for color in colors]\n", + " \n", + "plt.legend([0, 1, 2], ['Up-Up', 'Down-Down', 'T0'],\n", + " handler_map={\n", + " 0: LegendObject(colors[0], colors_faded[0]),\n", + " 1: LegendObject(colors[1], colors_faded[1]),\n", + " 2: LegendObject(colors[2], colors_faded[2], dashed=True),\n", + " })\n", + " \n", + "plt.title('Mean risk preferences by second')\n", + "plt.tight_layout()\n", + "plt.ylim(3,6)\n", + "ax = plt.gca()\n", + "#ax.axes.xaxis.set_visible(False)\n", + "ax.xaxis.set_ticks(np.arange(0, 1800, 120))\n", + "#ax.set_xticks(ax.get_xticks()[::120])\n", + "#plt.xlim(0,1800)\n", + "\n", + "#plt.grid()\n", + "\n", + "l3 = list(range(120,1800,120))\n", + "plt.vlines(x=l3, ymin=0, ymax=10, colors='purple', ls='--', lw=1)\n", + "\n", + "\n", + "# les deux lignes verticales pour choc1 et choc2\n", + "l1 = [(600,0 ), (600, 10)]\n", + "l2 = [(1200,0), (1200, 10)]\n", + "lc = LineCollection([l1, l2], color=[\"k\",\"k\"], lw=2)\n", + "plt.gca().add_collection(lc)\n", + "\n", + "#\n", + "\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [], + "source": [ + "l3 = list(range(120,1800,120))" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[120, 240, 360, 480, 600, 720, 840, 960, 1080, 1200, 1320, 1440, 1560, 1680]" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "l3" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[120, 240, 360, 480, 600, 720, 840, 960, 1080, 1200, 1320, 1440, 1560, 1680]" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib.collections import LineCollection\n", + "\n", + "np.random.seed(5)\n", + "x = np.arange(1, 101)\n", + "y = 20 + 3 * x + np.random.normal(0, 60, 100)\n", + "plt.plot(x, y, \"o\")\n", + "\n", + "# Takes list of lines, where each line is a sequence of coordinates\n", + "l1 = [(70, 100), (70, 250)]\n", + "l2 = [(70, 90), (90, 200)]\n", + "lc = LineCollection([l1, l2], color=[\"k\",\"blue\"], lw=2)\n", + "\n", + "plt.gca().add_collection(lc)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "fig = plt.figure()\n", + "ax = fig.add_subplot(111)\n", + "\n", + "# you can change each line separately, like:\n", + "#ax.spines['right'].set_linewidth(0.5)\n", + "# to change all, just write:\n", + "\n", + "for axis in ['top','bottom','left','right']:\n", + " ax.spines[axis].set_linewidth(2)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [], + "source": [ + "#df13.to_csv(r'/Users/waelbousselmi/Desktop/df13.csv', index = False, header=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "metadata": {}, + "outputs": [], + "source": [ + "df14_1 = df14[(df14[\"nmarket\"] == 1)]" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "fig, ax = plt.subplots(figsize=(15,6))\n", + "for name, group in df14_1.groupby('Subject'):\n", + " group.plot(x='secnd2',y='risk_test2', ax=ax, label=name,title='Plot by Month')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 202, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "fig, ax = plt.subplots(figsize=(15,6))\n", + "for name, group in df14.groupby('nmarket'):\n", + " group.plot(x='secnd2',y='risk_test2', ax=ax, label=name,title='Plot by Month')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 208, + "metadata": {}, + "outputs": [], + "source": [ + "#import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": {}, + "outputs": [], + "source": [ + "#sns.lineplot(data=df14_1, x=\"secnd2\", y=\"risk_test2\", hue=\"Subject\")" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1" + ] + }, + "execution_count": 224, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df14_1.at[2, \"Subject\"]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 237, + "metadata": {}, + "outputs": [], + "source": [ + "may_flights = df14_1.query(\"Subject == '5'\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 238, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
ref_datenmarkettraitementtreamentPeriodSubjectUpperBound1MedianP1LowerBound1StartWealth...CompteEpargneEURcountsecndsecnd2risk_testrisk_test2choc1choc2newidchoc1_nn
7204170703_08501HH015350.0300.0250.06750.0...1.2748400550050
7205170703_08501HH015350.0300.0250.06750.0...1.274851150050
7206170703_08501HH015350.0300.0250.06750.0...1.274862250050
7207170703_08501HH015350.0300.0250.06750.0...1.274873350050
7208170703_08501HH015350.0300.0250.06750.0...1.274884450050
..................................................................
9000170703_08501HH01550.00.00.010369.9...-1.8914152116179651151
9001170703_08501HH01550.00.00.010369.9...-1.8914153117179751151
9002170703_08501HH01550.00.00.010369.9...-1.8914154118179851151
9003170703_08501HH01550.00.00.010369.9...-1.8914155119179951151
9004170703_08501HH01550.00.00.010369.9...-1.8914156120180051151
\n", + "

1801 rows × 45 columns

\n", + "
" + ], + "text/plain": [ + " ref_date nmarket traitement treament Period Subject UpperBound1 \\\n", + "7204 170703_0850 1 HH 0 1 5 350.0 \n", + "7205 170703_0850 1 HH 0 1 5 350.0 \n", + "7206 170703_0850 1 HH 0 1 5 350.0 \n", + "7207 170703_0850 1 HH 0 1 5 350.0 \n", + "7208 170703_0850 1 HH 0 1 5 350.0 \n", + "... ... ... ... ... ... ... ... \n", + "9000 170703_0850 1 HH 0 15 5 0.0 \n", + "9001 170703_0850 1 HH 0 15 5 0.0 \n", + "9002 170703_0850 1 HH 0 15 5 0.0 \n", + "9003 170703_0850 1 HH 0 15 5 0.0 \n", + "9004 170703_0850 1 HH 0 15 5 0.0 \n", + "\n", + " MedianP1 LowerBound1 StartWealth ... CompteEpargneEUR count secnd \\\n", + "7204 300.0 250.0 6750.0 ... 1.27 484 0 \n", + "7205 300.0 250.0 6750.0 ... 1.27 485 1 \n", + "7206 300.0 250.0 6750.0 ... 1.27 486 2 \n", + "7207 300.0 250.0 6750.0 ... 1.27 487 3 \n", + "7208 300.0 250.0 6750.0 ... 1.27 488 4 \n", + "... ... ... ... ... ... ... ... \n", + "9000 0.0 0.0 10369.9 ... -1.89 14152 116 \n", + "9001 0.0 0.0 10369.9 ... -1.89 14153 117 \n", + "9002 0.0 0.0 10369.9 ... -1.89 14154 118 \n", + "9003 0.0 0.0 10369.9 ... -1.89 14155 119 \n", + "9004 0.0 0.0 10369.9 ... -1.89 14156 120 \n", + "\n", + " secnd2 risk_test risk_test2 choc1 choc2 newid choc1_nn \n", + "7204 0 5 5 0 0 5 0 \n", + "7205 1 5 0 0 5 0 \n", + "7206 2 5 0 0 5 0 \n", + "7207 3 5 0 0 5 0 \n", + "7208 4 5 0 0 5 0 \n", + "... ... ... ... ... ... ... ... \n", + "9000 1796 5 1 1 5 1 \n", + "9001 1797 5 1 1 5 1 \n", + "9002 1798 5 1 1 5 1 \n", + "9003 1799 5 1 1 5 1 \n", + "9004 1800 5 1 1 5 1 \n", + "\n", + "[1801 rows x 45 columns]" + ] + }, + "execution_count": 238, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "may_flights" + ] + }, + { + "cell_type": "code", + "execution_count": 244, + "metadata": {}, + "outputs": [], + "source": [ + "import statistics as st\n", + "v11 = st.mean(may_flights.risk_test2)" + ] + }, + { + "cell_type": "code", + "execution_count": 245, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "5.021654636313159" + ] + }, + "execution_count": 245, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "v11" + ] + }, + { + "cell_type": "code", + "execution_count": 243, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 243, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "sns.lineplot(data=may_flights, x=\"secnd2\", y=\"secnd\")" + ] + }, + { + "cell_type": "code", + "execution_count": 211, + "metadata": {}, + "outputs": [], + "source": [ + "flights_wide = df14_1.pivot(\"secnd2\", \"Subject\", \"risk_test2\")" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Subject12345678
secnd2
0102.2125552.5
1102.2125552.5
2102.2125552.5
3102.2125552.5
4102.2125552.5
...........................
1796107.1212581010
1797107.1212581010
1798107.1212581010
1799107.1212581010
1800107.1212581010
\n", + "

1801 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + "Subject 1 2 3 4 5 6 7 8\n", + "secnd2 \n", + "0 10 2.2 1 2 5 5 5 2.5\n", + "1 10 2.2 1 2 5 5 5 2.5\n", + "2 10 2.2 1 2 5 5 5 2.5\n", + "3 10 2.2 1 2 5 5 5 2.5\n", + "4 10 2.2 1 2 5 5 5 2.5\n", + "... .. ... .. .. .. .. .. ...\n", + "1796 10 7.12 1 2 5 8 10 10\n", + "1797 10 7.12 1 2 5 8 10 10\n", + "1798 10 7.12 1 2 5 8 10 10\n", + "1799 10 7.12 1 2 5 8 10 10\n", + "1800 10 7.12 1 2 5 8 10 10\n", + "\n", + "[1801 rows x 8 columns]" + ] + }, + "execution_count": 217, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "flights_wide" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# https://seaborn.pydata.org/generated/seaborn.lineplot.html" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "#sns.lineplot(data=flights_wide[\"Subject\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "fig, ax = plt.subplots(figsize=(15,6))\n", + "for name, group in df14_1.groupby('Subject'):\n", + " group.plot(x='secnd2',y='risk_test2', ax=ax, label=name,title='Plot by Month')\n", + "\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/.ipynb_checkpoints/requirements-checkpoint.txt b/.ipynb_checkpoints/requirements-checkpoint.txt new file mode 100644 index 0000000..ce16730 --- /dev/null +++ b/.ipynb_checkpoints/requirements-checkpoint.txt @@ -0,0 +1,6 @@ +# oTree-may-overwrite-this-file +# IF YOU MODIFY THIS FILE, remove these comments. +# otherwise, oTree will automatically overwrite it. +otree[mturk]>=3.3.11,<5 +psycopg2>=2.8.4 +sentry-sdk==0.7.9 diff --git a/.ipynb_checkpoints/requirements_base-checkpoint.txt b/.ipynb_checkpoints/requirements_base-checkpoint.txt new file mode 100644 index 0000000..ac998e5 --- /dev/null +++ b/.ipynb_checkpoints/requirements_base-checkpoint.txt @@ -0,0 +1,2 @@ +# You should put your requirements in requirements.txt instead. +# You can delete this file. diff --git a/.ipynb_checkpoints/settings-checkpoint.py b/.ipynb_checkpoints/settings-checkpoint.py new file mode 100644 index 0000000..e87a65a --- /dev/null +++ b/.ipynb_checkpoints/settings-checkpoint.py @@ -0,0 +1,339 @@ +from os import environ + +# if you set a property in SESSION_CONFIG_DEFAULTS, it will be inherited by all configs +# in SESSION_CONFIGS, except those that explicitly override it. +# the session config can be accessed from methods in your apps as self.session.config, +# e.g. self.session.config['participation_fee'] + +#### WB MTURK / session config MTurk ######################### + +mturk_hit_settings = { + 'keywords': ['Survey', 'Game', 'Demographics'], # Questionnaire démographique #'Questionnaire', 'Français' + 'title': 'Survey (gain $3.0, duration 7 min)',# Questionnaire démographique + 'description': 'You can earn up to $3.0 in approximately 7 minutes.', # Questionnaire démographique: Gain de $0.60 pour une durée de 1 minute. + 'frame_height': 500, + 'template': 'global/mturk_template.html', + 'minutes_allotted_per_assignment': 60, + 'expiration_hours': 7*24, # 7 days +# 'grant_qualification_id': '3O3C52ZQEUFOKIZH0662Y397HAFSHV',# Mturk reel Exp G-J ###to prevent retakes +# 'grant_qualification_id': '3ZSPHI510NGVHARBJTEPE3ECGE6IJ2', # Sandbox Exp G-J + 'grant_qualification_id': '3IMKSS0I9C91UAW9OSPZY1N2EAQW6A' , # Mturk exp Covid +# 'grant_qualification_id': '3LKGAM13UYJQHAONM1Z1QYBBX0W7ES', # Sandbox exp Covid + +# 'grant_qualification_id': '3C2W12C2LIJHOP5OLGDWR8T1PGZURB',# Mturk reel Exp Ines +# 'grant_qualification_id': '3MTUBPNNZX0I8DMRLCRIX5T88L6XMM', # Sandbox Exp Ines + + 'qualification_requirements': [ + { + 'QualificationTypeId': "00000000000000000071", # que pour expé Ines ##### workers from the US, 00000000000000000071 is the code for a location-based qualification + 'Comparator': "EqualTo", +# 'LocaleValues': [{'Country': "FR"}] + 'LocaleValues': [{'Country': "US"}] + }, + + { +# 'QualificationTypeId': "3O3C52ZQEUFOKIZH0662Y397HAFSHV", # Mturk reel Exp G-J ###To prevent a worker from participating in your study twice +# 'QualificationTypeId': "3ZSPHI510NGVHARBJTEPE3ECGE6IJ2", # Sandbox Exp G-J +# 'QualificationTypeId': '3C2W12C2LIJHOP5OLGDWR8T1PGZURB',# Mturk reel Exp Ines +# 'QualificationTypeId': '3MTUBPNNZX0I8DMRLCRIX5T88L6XMM', # Sandbox Exp Ines + 'QualificationTypeId': '3IMKSS0I9C91UAW9OSPZY1N2EAQW6A', # Mturk exp Covid +# 'QualificationTypeId':'3LKGAM13UYJQHAONM1Z1QYBBX0W7ES', # Sandbox exp Covid + + 'Comparator': "DoesNotExist", + } + +] + } +############################################################################# +SESSION_CONFIG_DEFAULTS = { + 'real_world_currency_per_point': 0.001,# 0.001 pour exp realeffort et exp covid sinon = 1 + 'participation_fee': 0,# 0.5 # 0 Expé police + 'doc': "", + 'mturk_hit_settings': mturk_hit_settings, +} +############################################################################# +SESSION_CONFIGS = [ + +# dict( +# name='part1_trust', +# display_name='part1_trust', +# num_demo_participants=2, +# app_sequence=['exp_police_part1_trust_v4'], +# ), + +# dict( +# name='part2_dictator', +# display_name='part2_dictator', +## num_demo_participants=2, +# app_sequence=['exp_police_part2_dictator_v2'], +# ), + +# dict( +# name='part3_TAI', +# display_name='part3_TAI', +# num_demo_participants=2, +# app_sequence=['exp_police_part3_tai'], +# ), + +# dict( +# name='part4_trust', +# display_name='part4_trust', +# num_demo_participants=2, +# app_sequence=['exp_police_part4_trust_v3'], +# ), + +# dict( +# name='part4bis_trust', +# display_name='part4bis_trust', +# num_demo_participants=2, +# app_sequence=['exp_police_part4bis_trust3'], +# ), + +# dict( +# name='part5_6_7_questionnaire', +# display_name='part5_6_7_questionnaire', +# num_demo_participants=2, +# app_sequence=['exp_police_part5_6_7_questionnaire_v2'], +# ), + + dict( + name='exp_police_all', + display_name='exp_police_all', + num_demo_participants=2, + app_sequence=['exp_police_part1_trust_v4', 'exp_police_part2_dictator_v2', 'exp_police_part3_tai', 'exp_police_part4_trust_v3', 'exp_police_part4bis_trust3', 'exp_police_part5_6_7_questionnaire_v2', 'payment_info'], + ), + + + +# dict( +# name='exp_covid_trust_v3', +# display_name='exp_covid_trust_v3', +# num_demo_participants=1, +# app_sequence=['exp_covid_trust_v3', 'payment_info_mturk'], +# ), + +# dict( +# name='exp_e4c_questionnaire', +# display_name='exp_e4c_questionnaire', +# num_demo_participants=1, +# app_sequence=['exp_e4c_questionnaire'], +# ), + + + +# dict( +# name='exp_e4c_risk_binswanger_FR', +# display_name='exp_e4c_risk_binswanger_FR', +# num_demo_participants=1, +# app_sequence=['exp_e4c_risk_binswanger_FR'], +# ), + +# dict( +# name='exp_e4c_risk_binswanger', +# display_name='exp_e4c_risk_binswanger', +# num_demo_participants=1, +# app_sequence=['exp_e4c_risk_binswanger'], +# ), + +# dict( +# name='exp_e4c_risk_gneezy', +# display_name='exp_e4c_risk_gneezy', +# num_demo_participants=1, +# app_sequence=['exp_e4c_risk_gneezy'], +# ), + +# dict( +# name='exp_e4c_questionnaire_final', +# display_name='exp_e4c_questionnaire_final', +# num_demo_participants=1, +# app_sequence=['exp_e4c_questionnaire_final'], +# ), + +# dict( +# name='exp_e4c_final_FR', +# display_name='exp_e4c_final_FR', +# num_demo_participants=2, +# app_sequence=['exp_e4c_questionnaire_FR_v2', +# 'exp_e4c_risk_gneezy_FR_v2', +# 'exp_e4c_risk_binswanger_FR_v2', +# 'exp_e4c_risk_gneezy_FR_v2_end', +# 'exp_e4c_questionnaire_final_FR_v2'], +# ), + + + + dict( + name='exp_contact_ih_all', + display_name='exp_contact_ih_all', + num_demo_participants=2, + app_sequence=['exp_contact_ih_part1_v3', 'exp_contact_ih_part2_v3', 'exp_contact_ih_part3_v3', 'exp_contact_ih_part4_v3'], + ), + +# dict( +# name='exp_contact_ih_part1_test', +# display_name='exp_contact_ih_part1_test', +# num_demo_participants=1, +# app_sequence=['exp_contact_ih_part1_test'], +# ), + +# dict( +# name='exp_e4c_final_FR_test', +# display_name='exp_e4c_final_FR_test', +# num_demo_participants=2, +# app_sequence=['exp_e4c_risk_gneezy_FR_v2', +# 'exp_e4c_risk_binswanger_FR_v2', +# 'exp_e4c_risk_gneezy_FR_v2_end', +# 'exp_e4c_questionnaire_final_FR_v2'], +# ), + +# dict( +# name='exp_e4c_final_FR_bot', +# display_name='exp_e4c_final_FR_bot', +# num_demo_participants=2, +# app_sequence=['exp_e4c_questionnaire_FR_v2', +# 'exp_e4c_risk_gneezy_FR_v2', +# 'exp_e4c_risk_binswanger_FR_v2', +# 'exp_e4c_risk_gneezy_FR_v2_end', +# 'exp_e4c_questionnaire_final_FR_v2'], +# use_browser_bots=True +# ), + +# dict( +# name='exp_e4c_final_EN_bot', +# display_name='exp_e4c_final_EN_bot', +# num_demo_participants=2, +# app_sequence=['exp_e4c_en_p1_quest', +# 'exp_e4c_en_p2_risk_gneezy', +# 'exp_e4c_en_risk_binswanger_v2', +# 'exp_e4c_en_p2bis_risk_gneezy_end', +# 'exp_e4c_en_p5_questfin'], +# use_browser_bots=True +# ), + +# dict( +# name='exp_e4c_final_EN', +# display_name='exp_e4c_final_EN', +# num_demo_participants=2, +# app_sequence=['exp_e4c_en_p1_quest', +# 'exp_e4c_en_p2_risk_gneezy', +# 'exp_e4c_en_risk_binswanger_v2', +# 'exp_e4c_en_p2bis_risk_gneezy_end', +# 'exp_e4c_en_p5_questfin'], +# ), + +# dict( +# name='exp_e4c_final_test_EN_test', +# display_name='exp_e4c_final_EN_test', +# num_demo_participants=2, +# app_sequence=['exp_e4c_en_p2_risk_gneezy', +# 'exp_e4c_en_risk_binswanger_v2', +# 'exp_e4c_en_p2bis_risk_gneezy_end', +# 'exp_e4c_en_p5_questfin'], +# ), + +# dict( +# name='exp_covid_trust_cadrage_v3', +# display_name='exp_covid_trust_cadrage_v3', +# num_demo_participants=1, +# app_sequence=['exp_covid_trust_cadrage_v3', 'payment_info_mturk'], +# ), + +# dict( +# name='exp_covid_trust_v3_bot', +# display_name='exp_covid_trust_v3_bot', +# num_demo_participants=1, +# app_sequence=['exp_covid_trust_v3'], +# use_browser_bots=True +# ), + +# dict( +# name='exp_covid_trust_cadrage_v3_bot', +# display_name='exp_covid_trust_cadrage_v3_bot', +# num_demo_participants=1, +# app_sequence=['exp_covid_trust_cadrage_v3'], +# use_browser_bots=True +# ), + + + +# dict( +# name='exp_police_all_bot', +# display_name='exp_police_all_bot', +# num_demo_participants=2, +# app_sequence=['exp_police_part1_trust_v4', 'exp_police_part2_dictator_v2', 'exp_police_part3_tai', +# 'exp_police_part4_trust_v3', 'exp_police_part4bis_trust3', +# 'exp_police_part5_6_7_questionnaire_v2', 'payment_info'], +# use_browser_bots=True +# ), + + +# dict( +# name='exp_etienne_test4', +# display_name='exp_etienne Off_the_record (test)', +# num_demo_participants=1, +# app_sequence=['exp_etienne_test4'], +# ), +# dict( +# name='trust', +# display_name='trust', +# num_demo_participants=2, +# app_sequence=['trust'], +# ), + + dict( + name='expines_test17', + display_name='expines_test17', + num_demo_participants=2, + app_sequence=['expines_test17'], + ), + + + + +] + +# ISO-639 code +# for example: de, fr, ja, ko, zh-hans +LANGUAGE_CODE = 'en' #en # 'fr' pour Exp Mindfullness et exp police + +# e.g. EUR, GBP, CNY, JPY +REAL_WORLD_CURRENCY_CODE = 'USD' # EUR pour Exp Mindfullness +USE_POINTS = True # False + +ROOMS = [ + dict( + name="labeds", + display_name="labeds", + participant_label_file="_rooms/labeds.txt" + ), +] + +#ADMIN_USERNAME = 'admin' +ADMIN_USERNAME = 'wael bousselmi' +# for security, best to set admin password in an environment variable +ADMIN_PASSWORD = environ.get('OTREE_ADMIN_PASSWORD') + + +DEMO_PAGE_INTRO_HTML = """ +Here are some oTree games. +""" + +# don't share this with anybody. +SECRET_KEY = 'nm5eaornndp(_0bt_64k+03(-f-n%4bir_+==$8i7&-o$th2@)' + +INSTALLED_APPS = ['otree'] + + +AWS_ACCESS_KEY_ID = environ.get('AWS_ACCESS_KEY_ID') +AWS_SECRET_ACCESS_KEY = environ.get('AWS_SECRET_ACCESS_KEY') + + + + + + + + + + + diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..11e1b7d --- /dev/null +++ b/Procfile @@ -0,0 +1,2 @@ +web: otree prodserver1of2 +worker: otree prodserver2of2 diff --git a/_rooms/labeds.txt b/_rooms/labeds.txt new file mode 100644 index 0000000..4789336 --- /dev/null +++ b/_rooms/labeds.txt @@ -0,0 +1,40 @@ +labeds1 +labeds2 +labeds3 +labeds4 +labeds5 +labeds6 +labeds7 +labeds8 +labeds9 +labeds10 +labeds11 +labeds12 +labeds13 +labeds14 +labeds15 +labeds16 +labeds17 +labeds18 +labeds19 +labeds20 +labeds21 +labeds22 +labeds23 +labeds24 +labeds25 +labeds26 +labeds27 +labeds28 +labeds29 +labeds30 +labeds31 +labeds32 +labeds33 +labeds34 +labeds35 +labeds36 +labeds37 +labeds38 +labeds39 +labeds40 \ No newline at end of file diff --git a/_static/Police_car.jpg b/_static/Police_car.jpg new file mode 100644 index 0000000..7e97867 Binary files /dev/null and b/_static/Police_car.jpg differ diff --git a/_static/asso1.png b/_static/asso1.png new file mode 100644 index 0000000..f64cb1f Binary files /dev/null and b/_static/asso1.png differ diff --git a/_static/asso2.png b/_static/asso2.png new file mode 100644 index 0000000..f8ee7cd Binary files /dev/null and b/_static/asso2.png differ diff --git a/_static/asso3.png b/_static/asso3.png new file mode 100644 index 0000000..dcfbe97 Binary files /dev/null and b/_static/asso3.png differ diff --git a/_static/contact/image1.png b/_static/contact/image1.png new file mode 100644 index 0000000..8035163 Binary files /dev/null and b/_static/contact/image1.png differ diff --git a/_static/contact/image2.png b/_static/contact/image2.png new file mode 100644 index 0000000..92ab5e4 Binary files /dev/null and b/_static/contact/image2.png differ diff --git a/_static/dictator_game.png b/_static/dictator_game.png new file mode 100644 index 0000000..9eeceb9 Binary files /dev/null and b/_static/dictator_game.png differ diff --git a/_static/e4c/gneezy_potters.png b/_static/e4c/gneezy_potters.png new file mode 100644 index 0000000..6f0eac8 Binary files /dev/null and b/_static/e4c/gneezy_potters.png differ diff --git a/_static/e4c/gneezy_potters_en.png b/_static/e4c/gneezy_potters_en.png new file mode 100644 index 0000000..d437cb8 Binary files /dev/null and b/_static/e4c/gneezy_potters_en.png differ diff --git a/_static/expines/coin-dollar2.jpg b/_static/expines/coin-dollar2.jpg new file mode 100644 index 0000000..9418699 Binary files /dev/null and b/_static/expines/coin-dollar2.jpg differ diff --git a/_static/expines/coin.png b/_static/expines/coin.png new file mode 100644 index 0000000..55e2411 Binary files /dev/null and b/_static/expines/coin.png differ diff --git a/_static/expines/radio_button.png b/_static/expines/radio_button.png new file mode 100644 index 0000000..ddb90ea Binary files /dev/null and b/_static/expines/radio_button.png differ diff --git a/_static/figurea_precaution.png b/_static/figurea_precaution.png new file mode 100644 index 0000000..c8d497f Binary files /dev/null and b/_static/figurea_precaution.png differ diff --git a/_static/global/empty.css b/_static/global/empty.css new file mode 100644 index 0000000..e69de29 diff --git a/_static/global/matrix.css b/_static/global/matrix.css new file mode 100644 index 0000000..6384e9d --- /dev/null +++ b/_static/global/matrix.css @@ -0,0 +1,9 @@ +.rotate90 { + -webkit-transform: rotate(-90deg); + -moz-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + -o-transform: rotate(-90deg); + transform: rotate(-90deg); + float: left; + margin-top: 1em; // TODO: do not hardcode to center align +} diff --git a/_static/police1.jpg b/_static/police1.jpg new file mode 100644 index 0000000..7e97867 Binary files /dev/null and b/_static/police1.jpg differ diff --git a/_static/police10.jpg b/_static/police10.jpg new file mode 100644 index 0000000..83a2e40 Binary files /dev/null and b/_static/police10.jpg differ diff --git a/_static/police2.jpg b/_static/police2.jpg new file mode 100644 index 0000000..7ac74cd Binary files /dev/null and b/_static/police2.jpg differ diff --git a/_static/police3.jpg b/_static/police3.jpg new file mode 100644 index 0000000..aa4f408 Binary files /dev/null and b/_static/police3.jpg differ diff --git a/_static/police4.jpg b/_static/police4.jpg new file mode 100644 index 0000000..d25943f Binary files /dev/null and b/_static/police4.jpg differ diff --git a/_static/police5.jpg b/_static/police5.jpg new file mode 100644 index 0000000..83a2e40 Binary files /dev/null and b/_static/police5.jpg differ diff --git a/_static/police6.jpg b/_static/police6.jpg new file mode 100644 index 0000000..a40b8e0 Binary files /dev/null and b/_static/police6.jpg differ diff --git a/_static/police7.jpg b/_static/police7.jpg new file mode 100644 index 0000000..7e97867 Binary files /dev/null and b/_static/police7.jpg differ diff --git a/_static/police8.jpg b/_static/police8.jpg new file mode 100644 index 0000000..7ac74cd Binary files /dev/null and b/_static/police8.jpg differ diff --git a/_static/police9.jpg b/_static/police9.jpg new file mode 100644 index 0000000..aa4f408 Binary files /dev/null and b/_static/police9.jpg differ diff --git a/_static/sante1.jpg b/_static/sante1.jpg new file mode 100644 index 0000000..d80a502 Binary files /dev/null and b/_static/sante1.jpg differ diff --git a/_static/sante10.jpg b/_static/sante10.jpg new file mode 100644 index 0000000..871613d Binary files /dev/null and b/_static/sante10.jpg differ diff --git a/_static/sante2.jpg b/_static/sante2.jpg new file mode 100644 index 0000000..bcb69f6 Binary files /dev/null and b/_static/sante2.jpg differ diff --git a/_static/sante3.jpg b/_static/sante3.jpg new file mode 100644 index 0000000..f6aa637 Binary files /dev/null and b/_static/sante3.jpg differ diff --git a/_static/sante4.jpg b/_static/sante4.jpg new file mode 100644 index 0000000..a063830 Binary files /dev/null and b/_static/sante4.jpg differ diff --git a/_static/sante5.jpg b/_static/sante5.jpg new file mode 100644 index 0000000..871613d Binary files /dev/null and b/_static/sante5.jpg differ diff --git a/_static/sante6.jpg b/_static/sante6.jpg new file mode 100644 index 0000000..145ee43 Binary files /dev/null and b/_static/sante6.jpg differ diff --git a/_static/sante7.jpg b/_static/sante7.jpg new file mode 100644 index 0000000..d80a502 Binary files /dev/null and b/_static/sante7.jpg differ diff --git a/_static/sante8.jpg b/_static/sante8.jpg new file mode 100644 index 0000000..bcb69f6 Binary files /dev/null and b/_static/sante8.jpg differ diff --git a/_static/sante9.jpg b/_static/sante9.jpg new file mode 100644 index 0000000..f6aa637 Binary files /dev/null and b/_static/sante9.jpg differ diff --git a/_static/trust_game.png b/_static/trust_game.png new file mode 100644 index 0000000..c98b7b3 Binary files /dev/null and b/_static/trust_game.png differ diff --git a/_static/trust_game_covid2.png b/_static/trust_game_covid2.png new file mode 100644 index 0000000..459791d Binary files /dev/null and b/_static/trust_game_covid2.png differ diff --git a/_templates/.ipynb_checkpoints/Untitled-checkpoint.ipynb b/_templates/.ipynb_checkpoints/Untitled-checkpoint.ipynb new file mode 100644 index 0000000..7fec515 --- /dev/null +++ b/_templates/.ipynb_checkpoints/Untitled-checkpoint.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/_templates/Untitled.ipynb b/_templates/Untitled.ipynb new file mode 100644 index 0000000..7fec515 --- /dev/null +++ b/_templates/Untitled.ipynb @@ -0,0 +1,6 @@ +{ + "cells": [], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/_templates/global/Page.html b/_templates/global/Page.html new file mode 100644 index 0000000..1bf3332 --- /dev/null +++ b/_templates/global/Page.html @@ -0,0 +1,8 @@ +{% extends "otree/Page.html" %} +{% load otree static %} + +{% block global_styles %} +{% endblock %} + +{% block global_scripts %} +{% endblock %} \ No newline at end of file diff --git a/_templates/global/mturk_template.html b/_templates/global/mturk_template.html new file mode 100644 index 0000000..2aaeef8 --- /dev/null +++ b/_templates/global/mturk_template.html @@ -0,0 +1,23 @@ + + + +
+

+ Cette tâche consiste à répondre à un questionnaire d'une durée de 1 minute. + Après avoir terminé ce HIT, vous recevrez votre rémunération. +

+ +

+ L'URL de l'étude apparaît ici: link. +

+

+

Important

+
+ A la dernière page, vous recevrez un code. + Veuillez copier / coller ce code ci-dessous. +

+ + +
+
+
diff --git a/a1_en_p1_quest/__init__.py b/a1_en_p1_quest/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/a1_en_p1_quest/_builtin/__init__.py b/a1_en_p1_quest/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/a1_en_p1_quest/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/a1_en_p1_quest/models.py b/a1_en_p1_quest/models.py new file mode 100644 index 0000000..6796fb7 --- /dev/null +++ b/a1_en_p1_quest/models.py @@ -0,0 +1,797 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'a1_en_p1_quest' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + questionnaire_before = models.IntegerField() + + language = models.StringField() + + q_1 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + # q_6 = models.IntegerField( + # choices=[ + # [1, '1'], + # [2, '2'], + # [3, '3'], + # [4, '4'], + # [5, '5'], + # [6, '6'], + # ], + # widget=widgets.RadioSelectHorizontal, + # label="", + # blank=False + # ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drink coffee (or the) at school/work'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + # q_11 = models.IntegerField( + # choices=[ + # [1, '1 - Jamais'], + # [2, '2 - Rarement'], + # [3, '3 - Souvent'], + # [4, '4 - Toujours'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t use batteries'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) +################################################ page Questionnaire 1 + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + # q_16 = models.IntegerField( + # choices=[ + # [1, '1 - Never'], + # [2, '2 - Rarely'], + # [3, '3 - Often'], + # [4, '4 - Always'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + # + # q_17 = models.IntegerField( + # choices=[ + # [1, '1 - Never'], + # [2, '2 - Rarely'], + # [3, '3 - Often'], + # [4, '4 - Always'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + # + # q_18 = models.IntegerField( + # choices=[ + # [1, '1 - Never'], + # [2, '2 - Rarely'], + # [3, '3 - Often'], + # [4, '4 - Always'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_16_a = models.IntegerField( + label="", + blank=True + ) + + q_16_b = models.StringField( + label="", + blank=True + ) + + q_17 = models.IntegerField( + choices=[ + [1, 'a- Green (100% electric or hybrid) (€26 per ride)'], + [2, 'b- UberX (Economical, fast and reliable) (at €22 per ride) '], + [3, 'c- Comfort (spacious vehicles and top rated drivers) (at €30 per ride)'], + + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_19_p2 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_20 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drive'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + +################################################# Page : Questionnaire2 + + q_21 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22_n = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_24 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_24_a = models.StringField( + label="If yes which one? ", + blank=True + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_26_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + +# ------------- à modifier ici !!!!!! + + q_27_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_27_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_27_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_27_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_28_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_a = models.IntegerField( + label="", + blank=False + ) + + q_29_b = models.IntegerField( + label="", + blank=False + ) + + q_29_c = models.IntegerField( + label="", + blank=False + ) + + q_29_d = models.IntegerField( + label="", + blank=False + ) + + + + q_30 = models.IntegerField( + choices=[ + [0, 'Yes'], + [1, 'No'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_31 = models.StringField( + label="31) What does this mean for you?", + ) + + + + + + diff --git a/a1_en_p1_quest/pages.py b/a1_en_p1_quest/pages.py new file mode 100644 index 0000000..4dead47 --- /dev/null +++ b/a1_en_p1_quest/pages.py @@ -0,0 +1,68 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 1 + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', + 'q_22', 'q_2_e_a', 'q_2_e_b', 'q_2_e_c', 'q_2_h', + 'q_3', 'q_4', 'q_5', 'q_6', + 'q_7', 'q_8', 'q_9', 'q_10', 'q_11', + ] + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 1 + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_12', 'q_13', 'q_14', 'q_15', + 'q_16', + 'q_16_a','q_16_b', 'q_17', + 'q_18', + 'q_19_p2', 'q_20', + ] + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 1 + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_21', 'q_22_n', 'q_23', 'q_24', + 'q_24_a', 'q_25', + 'q_26_a', 'q_26_b', + 'q_26_c', 'q_26_d', + 'q_27_a', 'q_27_b', 'q_27_c', + 'q_27_d', + 'q_28_a', 'q_28_b', 'q_28_c', + 'q_28_d', 'q_28_e', 'q_28_f', + 'q_29_a', 'q_29_b','q_29_c', 'q_29_d', + 'q_30', 'q_31' + ] + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 1 + + +page_sequence = [ + Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + + +] diff --git a/a1_en_p1_quest/templates/a1_en_p1_quest/Bienvenue.html b/a1_en_p1_quest/templates/a1_en_p1_quest/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/a1_en_p1_quest/templates/a1_en_p1_quest/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire0.html b/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire0.html new file mode 100644 index 0000000..d6eec34 --- /dev/null +++ b/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire0.html @@ -0,0 +1,228 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (1/3) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

+
+
+ +

+ 1) + Do you buy organic and / or ecological products? + + + {% formfield player.q_1 %} +

+ +
+

+ 2) For each of the following criteria, please indicate if it can influence your choice to buy a product: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a. The price can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_a %} Strongly agree
b. The origin can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_b %} Strongly agree
c. The quality can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_c %} Strongly agree
d. The taste (if it is a food product) can influence your choices of products to buy
Strongly disagree {% formfield player.q_22 %} Strongly agree
e. Label influence:
+           * The organic label can influence your choices of products to buy +
* Organic label: + An organic product is a product from organic farming (it is an agricultural production + method that excludes the use of most synthetic chemicals, toxic products, etc.). + There is a label (AB) in France that authenticates products from this method of + agriculture. +
        Strongly disagree {% formfield player.q_2_e_a %} Strongly agree
+           * The ecological label can influence your choices of products to buy +
* Ecological label: + An ecological product is a product that will be thought out, designed, + packaged, distributed, recycled in such a way as to minimize the impact on the environment. + It must comply with many rules related to these steps during specifications drawn up by + an organization such as ECOLABEL or ECOCERT. +An ecological product must be designed with maximum respect for the environment + (respect linked to the use of raw materials and machines during manufacture). + The life cycle of the product as well as its recycling are also important points + to consider. +
        Strongly disagree {% formfield player.q_2_e_b %} Strongly agree
+           * The equitable trade label can influence your choices of products to buy +
* Equitable trade label: + Equitable trade is a commercial and international partnership, based on concrete principles and launched + almost 20 years ago. Its objective is to be able to guarantee a better balance between + producers and resellers, by ensuring better working conditions and better remuneration + for small producers. +
        Strongly disagree {% formfield player.q_2_e_c %} Strongly agree
+

+           * + Other label can influence your choices of + products to buy (if yes, to indicate) + {% formfield player.q_2_h %} + +

+ +

+ 3) Do you shop online ? + {% formfield player.q_3 %} +

+ + +

+ 4) Do you shop clothes online? + {% formfield player.q_4 %} +

+ + + +

+ 5) + Do you agree that it is less + environmentally friendly to shop online rather than in-store? + + + + + + + + + +
Strongly disagree {% formfield player.q_5 %} Strongly agree
+

+ +

+ 6) Do you bring your own cup of coffee (tea) to school/work (instead of using the + cups from the coffee machine)? + {% formfield player.q_6 %} +

+ + +

+ 7) Do you sort your household waste? + {% formfield player.q_7 %} +

+ +

+ 8) Do you use a compost bin? + {% formfield player.q_8 %} +

+

+ 9) Do you collect and recycle used paper? + {% formfield player.q_9 %} +

+ +

+ 10) Do you reuse your shopping bags? + {% formfield player.q_10 %} +

+ +

+ 11) Do you return used batteries to appropriate recycling points? + {% formfield player.q_11 %} +

+ + + + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire1.html b/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire1.html new file mode 100644 index 0000000..c31ac76 --- /dev/null +++ b/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire1.html @@ -0,0 +1,150 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (2/3) +{% endblock %} + +{% block content %} + + +
+
+

+The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. +

+ The questions in this section relate to your habits as a student, i.e. they do not refer to the facilities in your accommodation prior to building 103. On the other hand, the "you" refers to yourself, and not to all the residents of your flat if it is a shared flat. +

+

+
+
+ +

+ 12) When buying new electronic devices, do you make sure to buy the ones that use the least amount of energy? + {% formfield player.q_12 %} +

+ +

+ 13) Do you switch off or completely disconnect electrical devices when not in use (without using the + standby mode)? + {% formfield player.q_13 %} +

+ +

+ 14) Do you use a dryer for your clothes? + {% formfield player.q_14 %} +

+ +

+ 15) Do you wait until you have a full charge before doing your laundry? + {% formfield player.q_15 %} +

+ + +

16) Do you regularly defrost the fridge?

+ + 1 - Never
+
+

        a - Because I bought a frost free fridge on purpose
+         b - I share the refrigerator with other people and someone else is responsible for it
+         c - Other reason
+         (If other reason please specify) :
+ +

+

+ 2 - Rarely
+ 3 - Often
+ 4 - Always
+ +

+ + +

+ 17) Suppose you are about to book a taxi (e.g. UBER) to Orly airport. +
Which option would you choose? +
+ {% formfield player.q_17 %} +

+ +

+ 18) Electric cars are less polluting than petrol or diesel cars. +
(Indicate your degree of agreement) + + + + + + +
Strongly disagree {% formfield player.q_18 %} Strongly agree
+

+ +

+ 19) Would you be interested in buying an alternative fuel car? + + + + + + + +
Strongly disagree {% formfield player.q_19_p2 %} Strongly agree
+

+ +

+ 20) Do you adopt eco-responsible driving? +
+ + Eco-responsible driving consists of: Checking the tire pressure. + Make sure the vehicle is in good condition. Adopt a smooth driving + (Start smoothly and change without waiting for a higher gear to + avoid over-revs). Stop the engine during a prolonged stop. Do not + abuse the air conditioning. + + {% formfield player.q_20 %} +

+ + + + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire2.html b/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire2.html new file mode 100644 index 0000000..d7f82d7 --- /dev/null +++ b/a1_en_p1_quest/templates/a1_en_p1_quest/Questionnaire2.html @@ -0,0 +1,338 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (3/3) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + + +

+
+
+ +

+ 21) + Support higher taxes for environmentally damaging behavior. +
(Indicate your degree of agreement) +
+ + + + + + +
Strongly disagree {% formfield player.q_21 %} Strongly agree
+

+ +

+ 22) +In a political program, the place given to environmental issues influences my vote. +
(Indicate your degree of agreement) +
+ + + + + + +
Strongly disagree {% formfield player.q_22_n %} Strongly agree
+ +

+ + +

+ 23) Do you often discuss environmental issues with friends? + + {% formfield player.q_23 %} +

+ +

24) Are you a member of an environmental organisation? If so, which one? ?

+No
+Yes
+
+

{% formfield player.q_24_a %} +

+
+ +

+ + +

+ 25) Do you support financial incentives for environmentally beneficial technology? +
(Indicate your degree of agreement) + + + + + + + +
Strongly disagree {% formfield player.q_25 %} Strongly agree
+

+ +

+ 26) For each of the following actions, please indicate whether it can reduce the + individual carbon footprint to a small or very large extent: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a. Avoid air travel. Reduced way:
Not very important {% formfield player.q_26_a %} Very important
b. Have fewer children. Reduced way:
Not very important {% formfield player.q_26_b %} Very important
c. Not having a car. Reduced way:
Not very important {% formfield player.q_26_c %} Very important
d. a Vegetarian diet. Reduced way:
Not very important {% formfield player.q_26_d %} Very important
+

+ +

+

+ +

+ 27) For each of these actions, please indicate whether you would be prepared to adopt it: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a- Avoid air travel:
Not prepared at all {% formfield player.q_27_a %} Very prepared
b- Have fewer children:
Not prepared at all {% formfield player.q_27_b %} Very prepared
c- Not owning a car:
Not prepared at all {% formfield player.q_27_c %} Very prepared
d- Adopt a vegetarian diet:
Not prepared at all {% formfield player.q_27_d %} Very prepared
+

+ +

+ 28) For each of the following questions, please indicate whether it concerns you: + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a- Global warming:
Not concerned at all {% formfield player.q_28_a %} Very concerned
b- Air pollution:
Not concerned at all {% formfield player.q_28_b %} Very concerned
c- The disappearance of animal and plant species:
Not concerned at all {% formfield player.q_28_c %} Very concerned
d- The abundance of non-recyclable waste:
Not concerned at all {% formfield player.q_28_d %} Very concerned
e- The use of pesticides:
Not concerned at all {% formfield player.q_28_e %} Very concerned
f- Depletion of resources (drinking water, fossil fuels):
Not concerned at all {% formfield player.q_28_f %} Very concerned
+

+ + +

+ 29) Rank the consumption items (for a household) from the highest CO2 emissions to the lowest. +
(1: highest CO2 emissions; ...; 4: lowest CO2 emissions) +
+ + + + + + + + + + + + + + + + + + + + + + +
a- Transport: +
+ +
b- Food: +
+ +
c- Energy consumption in the home (heating, lighting): +
+ +
d- Energy consumption of various equipment + (appliances installed and used in the home or elsewhere): +
+ +
+

+ + +

+ + 30) Did you know that you currently live in a green building (with low energy consumption)? + + {% formfield player.q_30 %} + +

+ {% formfield player.q_31 %} + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a1_en_p1_quest/templates/a1_en_p1_quest/QuestionnaireEnd.html b/a1_en_p1_quest/templates/a1_en_p1_quest/QuestionnaireEnd.html new file mode 100644 index 0000000..26368c6 --- /dev/null +++ b/a1_en_p1_quest/templates/a1_en_p1_quest/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + First part : End + +{% endblock %} + +{% block content %} +
+
+ + +

+ You have completed the first part. + +
You will now begin the second part. + +

+ + +
+
+ +

{% next_button %}

+ + +{% endblock %} diff --git a/a1_en_p1_quest/tests.py b/a1_en_p1_quest/tests.py new file mode 100644 index 0000000..b6d95a6 --- /dev/null +++ b/a1_en_p1_quest/tests.py @@ -0,0 +1,83 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['questionnaire_before'] == 1: + yield (pages.Bienvenue) + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_22': 1, + 'q_2_e_a': 1, + 'q_2_e_b': 1, + 'q_2_e_c': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_5': 1, + 'q_6': 1, + 'q_7': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + }) + yield (pages.Questionnaire1, { + 'q_12': 1, + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + # 'q_16': 1, + # 'q_17': 1, + # 'q_18': 1, + 'q_16': 1, + 'q_16_a': 1, + 'q_16_b': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19_p2': 1, + 'q_20': 1, + }) + yield (pages.Questionnaire2, { + 'q_21':1, + 'q_22_n':1, + 'q_23':1, + 'q_24':1, + 'q_24_a':1, + 'q_25':1, + 'q_26_a':1, + 'q_26_b':1, + 'q_26_c':1, + 'q_26_d':1, + 'q_27_a':1, + 'q_27_b':1, + 'q_27_c':1, + 'q_27_d':1, + 'q_28_a':1, + 'q_28_b':1, + 'q_28_c':1, + 'q_28_d':1, + 'q_28_e':1, + 'q_28_f':1, + 'q_29_a':1, + 'q_29_b':1, + 'q_29_c':1, + 'q_29_d':1, + 'q_30':1, + 'q_31':"blabla", + + }) + + + diff --git a/a1_en_p1_quest_v2/__init__.py b/a1_en_p1_quest_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/a1_en_p1_quest_v2/_builtin/__init__.py b/a1_en_p1_quest_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/a1_en_p1_quest_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/a1_en_p1_quest_v2/models.py b/a1_en_p1_quest_v2/models.py new file mode 100644 index 0000000..6a05543 --- /dev/null +++ b/a1_en_p1_quest_v2/models.py @@ -0,0 +1,797 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'a1_en_p1_quest_v2' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + questionnaire_before = models.IntegerField() + + language = models.StringField() + + q_1 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + # q_6 = models.IntegerField( + # choices=[ + # [1, '1'], + # [2, '2'], + # [3, '3'], + # [4, '4'], + # [5, '5'], + # [6, '6'], + # ], + # widget=widgets.RadioSelectHorizontal, + # label="", + # blank=False + # ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drink coffee (or the) at school/work'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + # q_11 = models.IntegerField( + # choices=[ + # [1, '1 - Jamais'], + # [2, '2 - Rarement'], + # [3, '3 - Souvent'], + # [4, '4 - Toujours'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t use batteries'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) +################################################ page Questionnaire 1 + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + # q_16 = models.IntegerField( + # choices=[ + # [1, '1 - Never'], + # [2, '2 - Rarely'], + # [3, '3 - Often'], + # [4, '4 - Always'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + # + # q_17 = models.IntegerField( + # choices=[ + # [1, '1 - Never'], + # [2, '2 - Rarely'], + # [3, '3 - Often'], + # [4, '4 - Always'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + # + # q_18 = models.IntegerField( + # choices=[ + # [1, '1 - Never'], + # [2, '2 - Rarely'], + # [3, '3 - Often'], + # [4, '4 - Always'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_16_a = models.IntegerField( + label="", + blank=True + ) + + q_16_b = models.StringField( + label="", + blank=True + ) + + q_17 = models.IntegerField( + choices=[ + [1, 'a- Green (100% electric or hybrid) (€26 per ride)'], + [2, 'b- UberX (Economical, fast and reliable) (at €22 per ride) '], + [3, 'c- Comfort (spacious vehicles and top rated drivers) (at €30 per ride)'], + + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_19_p2 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_20 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drive'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + +################################################# Page : Questionnaire2 + + q_21 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22_n = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_24 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_24_a = models.StringField( + label="If yes which one? ", + blank=True + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_26_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + +# ------------- à modifier ici !!!!!! + + q_27_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_27_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_27_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_27_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_28_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_28_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_a = models.IntegerField( + label="", + blank=False + ) + + q_29_b = models.IntegerField( + label="", + blank=False + ) + + q_29_c = models.IntegerField( + label="", + blank=False + ) + + q_29_d = models.IntegerField( + label="", + blank=False + ) + + + + q_30 = models.IntegerField( + choices=[ + [0, 'Yes'], + [1, 'No'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_31 = models.StringField( + label="31) What does this mean for you?", + ) + + + + + + diff --git a/a1_en_p1_quest_v2/pages.py b/a1_en_p1_quest_v2/pages.py new file mode 100644 index 0000000..47f3a94 --- /dev/null +++ b/a1_en_p1_quest_v2/pages.py @@ -0,0 +1,73 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 0 + + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', + 'q_22', 'q_2_e_a', 'q_2_e_b', 'q_2_e_c', 'q_2_h', + 'q_3', 'q_4', 'q_5', 'q_6', + 'q_7', 'q_8', 'q_9', 'q_10', 'q_11', + ] + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 0 + + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_12', 'q_13', 'q_14', 'q_15', + 'q_16', + 'q_16_a','q_16_b', 'q_17', + 'q_18', + 'q_19_p2', 'q_20', + ] + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 0 + + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_21', 'q_22_n', 'q_23', 'q_24', + 'q_24_a', 'q_25', + 'q_26_a', 'q_26_b', + 'q_26_c', 'q_26_d', + 'q_27_a', 'q_27_b', 'q_27_c', + 'q_27_d', + 'q_28_a', 'q_28_b', 'q_28_c', + 'q_28_d', 'q_28_e', 'q_28_f', + 'q_29_a', 'q_29_b','q_29_c', 'q_29_d', + 'q_30', 'q_31' + ] + def is_displayed(self): + return self.player.participant.vars['questionnaire_before'] == 0 + + + + +page_sequence = [ + Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + + +] diff --git a/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Bienvenue.html b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire0.html b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire0.html new file mode 100644 index 0000000..d6eec34 --- /dev/null +++ b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire0.html @@ -0,0 +1,228 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (1/3) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

+
+
+ +

+ 1) + Do you buy organic and / or ecological products? + + + {% formfield player.q_1 %} +

+ +
+

+ 2) For each of the following criteria, please indicate if it can influence your choice to buy a product: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a. The price can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_a %} Strongly agree
b. The origin can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_b %} Strongly agree
c. The quality can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_c %} Strongly agree
d. The taste (if it is a food product) can influence your choices of products to buy
Strongly disagree {% formfield player.q_22 %} Strongly agree
e. Label influence:
+           * The organic label can influence your choices of products to buy +
* Organic label: + An organic product is a product from organic farming (it is an agricultural production + method that excludes the use of most synthetic chemicals, toxic products, etc.). + There is a label (AB) in France that authenticates products from this method of + agriculture. +
        Strongly disagree {% formfield player.q_2_e_a %} Strongly agree
+           * The ecological label can influence your choices of products to buy +
* Ecological label: + An ecological product is a product that will be thought out, designed, + packaged, distributed, recycled in such a way as to minimize the impact on the environment. + It must comply with many rules related to these steps during specifications drawn up by + an organization such as ECOLABEL or ECOCERT. +An ecological product must be designed with maximum respect for the environment + (respect linked to the use of raw materials and machines during manufacture). + The life cycle of the product as well as its recycling are also important points + to consider. +
        Strongly disagree {% formfield player.q_2_e_b %} Strongly agree
+           * The equitable trade label can influence your choices of products to buy +
* Equitable trade label: + Equitable trade is a commercial and international partnership, based on concrete principles and launched + almost 20 years ago. Its objective is to be able to guarantee a better balance between + producers and resellers, by ensuring better working conditions and better remuneration + for small producers. +
        Strongly disagree {% formfield player.q_2_e_c %} Strongly agree
+

+           * + Other label can influence your choices of + products to buy (if yes, to indicate) + {% formfield player.q_2_h %} + +

+ +

+ 3) Do you shop online ? + {% formfield player.q_3 %} +

+ + +

+ 4) Do you shop clothes online? + {% formfield player.q_4 %} +

+ + + +

+ 5) + Do you agree that it is less + environmentally friendly to shop online rather than in-store? + + + + + + + + + +
Strongly disagree {% formfield player.q_5 %} Strongly agree
+

+ +

+ 6) Do you bring your own cup of coffee (tea) to school/work (instead of using the + cups from the coffee machine)? + {% formfield player.q_6 %} +

+ + +

+ 7) Do you sort your household waste? + {% formfield player.q_7 %} +

+ +

+ 8) Do you use a compost bin? + {% formfield player.q_8 %} +

+

+ 9) Do you collect and recycle used paper? + {% formfield player.q_9 %} +

+ +

+ 10) Do you reuse your shopping bags? + {% formfield player.q_10 %} +

+ +

+ 11) Do you return used batteries to appropriate recycling points? + {% formfield player.q_11 %} +

+ + + + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire1.html b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire1.html new file mode 100644 index 0000000..c31ac76 --- /dev/null +++ b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire1.html @@ -0,0 +1,150 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (2/3) +{% endblock %} + +{% block content %} + + +
+
+

+The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. +

+ The questions in this section relate to your habits as a student, i.e. they do not refer to the facilities in your accommodation prior to building 103. On the other hand, the "you" refers to yourself, and not to all the residents of your flat if it is a shared flat. +

+

+
+
+ +

+ 12) When buying new electronic devices, do you make sure to buy the ones that use the least amount of energy? + {% formfield player.q_12 %} +

+ +

+ 13) Do you switch off or completely disconnect electrical devices when not in use (without using the + standby mode)? + {% formfield player.q_13 %} +

+ +

+ 14) Do you use a dryer for your clothes? + {% formfield player.q_14 %} +

+ +

+ 15) Do you wait until you have a full charge before doing your laundry? + {% formfield player.q_15 %} +

+ + +

16) Do you regularly defrost the fridge?

+ + 1 - Never
+
+

        a - Because I bought a frost free fridge on purpose
+         b - I share the refrigerator with other people and someone else is responsible for it
+         c - Other reason
+         (If other reason please specify) :
+ +

+

+ 2 - Rarely
+ 3 - Often
+ 4 - Always
+ +

+ + +

+ 17) Suppose you are about to book a taxi (e.g. UBER) to Orly airport. +
Which option would you choose? +
+ {% formfield player.q_17 %} +

+ +

+ 18) Electric cars are less polluting than petrol or diesel cars. +
(Indicate your degree of agreement) + + + + + + +
Strongly disagree {% formfield player.q_18 %} Strongly agree
+

+ +

+ 19) Would you be interested in buying an alternative fuel car? + + + + + + + +
Strongly disagree {% formfield player.q_19_p2 %} Strongly agree
+

+ +

+ 20) Do you adopt eco-responsible driving? +
+ + Eco-responsible driving consists of: Checking the tire pressure. + Make sure the vehicle is in good condition. Adopt a smooth driving + (Start smoothly and change without waiting for a higher gear to + avoid over-revs). Stop the engine during a prolonged stop. Do not + abuse the air conditioning. + + {% formfield player.q_20 %} +

+ + + + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire2.html b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire2.html new file mode 100644 index 0000000..ab41b22 --- /dev/null +++ b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/Questionnaire2.html @@ -0,0 +1,338 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (3/3) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + + +

+
+
+ +

+ 21) + Support higher taxes for environmentally damaging behavior. +
(Indicate your degree of agreement) +
+ + + + + + +
Strongly disagree {% formfield player.q_21 %} Strongly agree
+

+ +

+ 22) +In a political program, the place given to environmental issues influences my vote. +
(Indicate your degree of agreement) +
+ + + + + + + +
Strongly disagree {% formfield player.q_22_n %} Strongly agree
+

+ + +

+ 23) Do you often discuss environmental issues with friends? + + {% formfield player.q_23 %} +

+ +

24) Are you a member of an environmental organisation? If so, which one? ?

+No
+Yes
+
+

{% formfield player.q_24_a %} +

+
+ +

+ + +

+ 25) Do you support financial incentives for environmentally beneficial technology? +
(Indicate your degree of agreement) + + + + + + + +
Strongly disagree {% formfield player.q_25 %} Strongly agree
+

+ +

+ 26) For each of the following actions, please indicate whether it can reduce the + individual carbon footprint to a small or very large extent: + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a. Avoid air travel. Reduced way:
Not very important {% formfield player.q_26_a %} Very important
b. Have fewer children. Reduced way:
Not very important {% formfield player.q_26_b %} Very important
c. Not having a car. Reduced way:
Not very important {% formfield player.q_26_c %} Very important
d. a Vegetarian diet. Reduced way:
Not very important {% formfield player.q_26_d %} Very important
+

+ +

+

+ +

+ 27) For each of these actions, please indicate whether you would be prepared to adopt it: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a- Avoid air travel:
Not prepared at all {% formfield player.q_27_a %} Very prepared
b- Have fewer children:
Not prepared at all {% formfield player.q_27_b %} Very prepared
c- Not owning a car:
Not prepared at all {% formfield player.q_27_c %} Very prepared
d- Adopt a vegetarian diet:
Not prepared at all {% formfield player.q_27_d %} Very prepared
+

+ +

+ 28) For each of the following questions, please indicate whether it concerns you: + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a- Global warming:
Not concerned at all {% formfield player.q_28_a %} Very concerned
b- Air pollution:
Not concerned at all {% formfield player.q_28_b %} Very concerned
c- The disappearance of animal and plant species:
Not concerned at all {% formfield player.q_28_c %} Very concerned
d- The abundance of non-recyclable waste:
Not concerned at all {% formfield player.q_28_d %} Very concerned
e- The use of pesticides:
Not concerned at all {% formfield player.q_28_e %} Very concerned
f- Depletion of resources (drinking water, fossil fuels):
Not concerned at all {% formfield player.q_28_f %} Very concerned
+

+ + +

+ 29) Rank the consumption items (for a household) from the highest CO2 emissions to the lowest. +
(1: highest CO2 emissions; ...; 4: lowest CO2 emissions) +
+ + + + + + + + + + + + + + + + + + + + + + +
a- Transport: +
+ +
b- Food: +
+ +
c- Energy consumption in the home (heating, lighting): +
+ +
d- Energy consumption of various equipment + (appliances installed and used in the home or elsewhere): +
+ +
+

+ + +

+ + 30) Did you know that you currently live in a green building (with low energy consumption)? + + {% formfield player.q_30 %} + +

+ {% formfield player.q_31 %} + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/QuestionnaireEnd.html b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/QuestionnaireEnd.html new file mode 100644 index 0000000..26368c6 --- /dev/null +++ b/a1_en_p1_quest_v2/templates/a1_en_p1_quest_v2/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + First part : End + +{% endblock %} + +{% block content %} +
+
+ + +

+ You have completed the first part. + +
You will now begin the second part. + +

+ + +
+
+ +

{% next_button %}

+ + +{% endblock %} diff --git a/a1_en_p1_quest_v2/tests.py b/a1_en_p1_quest_v2/tests.py new file mode 100644 index 0000000..b52bb34 --- /dev/null +++ b/a1_en_p1_quest_v2/tests.py @@ -0,0 +1,83 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['questionnaire_before'] == 0: + yield (pages.Bienvenue) + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_22': 1, + 'q_2_e_a': 1, + 'q_2_e_b': 1, + 'q_2_e_c': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_5': 1, + 'q_6': 1, + 'q_7': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + }) + yield (pages.Questionnaire1, { + 'q_12': 1, + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + # 'q_16': 1, + # 'q_17': 1, + # 'q_18': 1, + 'q_16': 1, + 'q_16_a': 1, + 'q_16_b': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19_p2': 1, + 'q_20': 1, + }) + yield (pages.Questionnaire2, { + 'q_21':1, + 'q_22_n':1, + 'q_23':1, + 'q_24':1, + 'q_24_a':1, + 'q_25':1, + 'q_26_a':1, + 'q_26_b':1, + 'q_26_c':1, + 'q_26_d':1, + 'q_27_a':1, + 'q_27_b':1, + 'q_27_c':1, + 'q_27_d':1, + 'q_28_a':1, + 'q_28_b':1, + 'q_28_c':1, + 'q_28_d':1, + 'q_28_e':1, + 'q_28_f':1, + 'q_29_a':1, + 'q_29_b':1, + 'q_29_c':1, + 'q_29_d':1, + 'q_30':1, + 'q_31':"blabla", + + }) + + + diff --git a/a3_gp/__init__.py b/a3_gp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/a3_gp/_builtin/__init__.py b/a3_gp/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/a3_gp/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/a3_gp/models.py b/a3_gp/models.py new file mode 100644 index 0000000..69fd173 --- /dev/null +++ b/a3_gp/models.py @@ -0,0 +1,116 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'a3_gp' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'a3_gp/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + + + + treatment = models.IntegerField() + + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/a3_gp/pages.py b/a3_gp/pages.py new file mode 100644 index 0000000..229384a --- /dev/null +++ b/a3_gp/pages.py @@ -0,0 +1,100 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + # def is_displayed(self): + # return self.participant.vars['versionexp'] == 2 + + def is_displayed(self): + return self.round_number == 1 + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + 1 + self.player.participant.vars['game_num'] = self.player.game_num + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n =self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + # def is_displayed(self): + # return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + # + + def vars_for_template(self): + self.player.task_start_19 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Please correct your answer 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Please correct your answer 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Please correct your answer 3 !!' + + def before_next_page(self): + self.player.task_time_19 = round(time.time() - self.player.task_start_19,2) ######### count_time + #self.player.treatment = self.player.participant.vars['treatment'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + # def is_displayed(self): + # return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_20 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'The sum must be equal to 10 !!' + + def before_next_page(self): + self.player.task_time_20 = round(time.time() - self.player.task_start_20,2) ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +page_sequence = [ + Bienvenue, + L_risk11_qc, + M_risk11, + +] diff --git a/a3_gp/templates/a3_gp/Bienvenue.html b/a3_gp/templates/a3_gp/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/a3_gp/templates/a3_gp/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a3_gp/templates/a3_gp/Jeu1End.html b/a3_gp/templates/a3_gp/Jeu1End.html new file mode 100644 index 0000000..817680e --- /dev/null +++ b/a3_gp/templates/a3_gp/Jeu1End.html @@ -0,0 +1,28 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Second part: End + +{% endblock %} + +{% block content %} +
+
+ +

+ You have completed the second part. + +
You will now begin the third part. + +

+ + +
+
+ +

{% next_button %}

+ + +{% endblock %} diff --git a/a3_gp/templates/a3_gp/L_risk11_qc.html b/a3_gp/templates/a3_gp/L_risk11_qc.html new file mode 100644 index 0000000..b6597d8 --- /dev/null +++ b/a3_gp/templates/a3_gp/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{player.game_num}} +{% endblock %} + +{% block content %} + +

+ This game can be taken into account when calculating your winnings. +

+ {% include Constants.instructions_GP_template %} + + +
+
+ +

+ +

Comprehension test:

+ + +

If you have invested 6 ECUs in the risky project:

+ +

1) How many ECUs have you kept?

+ +

{% formfield player.risk11_qc_a label = ""%} +

+

2) If the investment is successful, how many ECUs in your possession at the end of this game?

+

{% formfield player.risk11_qc_b label = ""%} +

+

3) If the investment is unsuccessful, how many ECUs in your possession at the end of this game?

+

{% formfield player.risk11_qc_c label = ""%} +

+ + + +

+ + +{% next_button %} + + + +
+
+ + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/a3_gp/templates/a3_gp/M_risk11.html b/a3_gp/templates/a3_gp/M_risk11.html new file mode 100644 index 0000000..9e0be4e --- /dev/null +++ b/a3_gp/templates/a3_gp/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{player.game_num}} +{% endblock %} + +{% block content %} + + +
+
+ +

+

+ Votre choix : +

+ +
+
+ +
+

Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

+

{% formfield player.risk11_a label = ""%} +

+ +

So, how many ECUs did you keep (an amount between 0 and 10)?

+

{% formfield player.risk11_b label = ""%} +

+ +

+ Note: the sum of the two amounts must be equal to 10. +

+ +

+ + + {% next_button %} + +
+
+ + + +

+
+
+ + {% include Constants.instructions_GP_template %} + +
+ + + +{% endblock %} \ No newline at end of file diff --git a/a3_gp/templates/a3_gp/M_risk11_result.html b/a3_gp/templates/a3_gp/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/a3_gp/templates/a3_gp/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
+
+ + +

Jeu 1 : RESULTAT

+ + + +

Le tirage au sort est : {{player.tirageriskresult}} +

+

Votre investissement dans l’actif risqué : {{player.risk11_a}}

+

Vous avez gardé : {{player.risk11_b}}

+ +
+ +

Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

+ + +

+ +
+
+ +

+

+ Rappel des instructions : +

+
+
+ + {% include Constants.instructions_GP_template %} + +
+ +{% endblock %} diff --git a/a3_gp/templates/a3_gp/instructions.html b/a3_gp/templates/a3_gp/instructions.html new file mode 100644 index 0000000..b790c7c --- /dev/null +++ b/a3_gp/templates/a3_gp/instructions.html @@ -0,0 +1,45 @@ +{% load otree %} + + + +
+
+

+ Rules of the game : +

+ +

You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

+ +
Project description:
+ +

This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

+
+

Your gain from this task = amount retained + gain from your investment in the project.

+
+

Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

+ +

Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

+

The exchange rate for this game is (1 ECU = 0.8 EUROS)

+
+ +
+ +
+
+ +

+

Summary of the game:

+ +
+
+

+ + +
+
\ No newline at end of file diff --git a/a3_gp/tests.py b/a3_gp/tests.py new file mode 100644 index 0000000..3840f82 --- /dev/null +++ b/a3_gp/tests.py @@ -0,0 +1,33 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Bienvenue) + + + # if self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + + + + + + diff --git a/a3_welcome/__init__.py b/a3_welcome/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/a3_welcome/_builtin/__init__.py b/a3_welcome/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/a3_welcome/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/a3_welcome/models.py b/a3_welcome/models.py new file mode 100644 index 0000000..dfce51e --- /dev/null +++ b/a3_welcome/models.py @@ -0,0 +1,42 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'a3_welcome' + players_per_group = None + num_rounds = 1 + + +class Subsession(BaseSubsession): + pass + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + game_num = models.IntegerField(initial=0) + app_sequence_select = models.IntegerField(initial=1) + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField(initial=0) + + + + + + + + diff --git a/a3_welcome/pages.py b/a3_welcome/pages.py new file mode 100644 index 0000000..3ad9dc7 --- /dev/null +++ b/a3_welcome/pages.py @@ -0,0 +1,31 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class BienvenueBis(Page): # version anglaise + form_model = 'player' + form_fields = [] + + def before_next_page(self): + self.player.game_num = 0 + self.player.app_sequence_select = random.randint(1,4) + self.player.questionnaire_before = random.randint(0,1) + self.player.participant.vars['game_num'] = self.player.game_num + self.player.participant.vars['app_sequence_select'] = self.player.app_sequence_select + self.player.participant.vars['questionnaire_before'] = self.player.questionnaire_before + if self.player.app_sequence_select == 1: + self.player.app_sequence_select_n = "gp;bw;MDG_asso;MDG_class" + elif self.player.app_sequence_select == 2: + self.player.app_sequence_select_n = "gp;bw;MDG_class;MDG_asso" + elif self.player.app_sequence_select == 3: + self.player.app_sequence_select_n = "bw;gp;MDG_asso;MDG_class" + elif self.player.app_sequence_select == 4: + self.player.app_sequence_select_n = "bw;gp;MDG_class;MDG_asso" + self.player.participant.vars['app_sequence_select_n'] = self.player.app_sequence_select_n +page_sequence = [ + BienvenueBis, + +] diff --git a/a3_welcome/templates/a3_welcome/Bienvenue.html b/a3_welcome/templates/a3_welcome/Bienvenue.html new file mode 100644 index 0000000..d345c6a --- /dev/null +++ b/a3_welcome/templates/a3_welcome/Bienvenue.html @@ -0,0 +1,68 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie +{% endblock %} + +{% block content %} + + +
+
+ +

Bienvenue

+ +

+ Merci d’avoir accepté de participer à cette expérience. + Une rémunération fixe (de 5 €) vous sera versée + pour votre participation, et ce, quelles que soient vos réponses durant + cette expérience. À cela s’ajoutera une rémunération variable liée + à vos réponses au cours + de l’expérience. +

+ +

+ L’expérience dure environ 30 min. Elle se compose de deux types de tâches : + les questionnaires et les jeux. + La rémunération variable que vous percevrez à la fin de l’expérience + ne dépendra pas de vos réponses + aux questionnaires. + En effet, dans ces questionnaires, il n’y a ni bonne, ni mauvaise réponse. + En revanche, votre rémunération + variable dépendra + de la qualité de vos réponses aux jeux. Plus précisément, à la fin de l’expérience, + un seul des jeux + sera sélectionné + aléatoirement pour être payé pour de bon. +

+
La monnaie utilisée dans cette expérience est l'ECU. +
Taux de change 1 ECU = {{ Constants.tauxchange}} €.
+ +
+ Important : Toutes vos réponses seront traitées anonymement. + Personne n’aura la possibilité d’identifier directement vos décisions. + + + + + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a3_welcome/templates/a3_welcome/Bienvenue0.html b/a3_welcome/templates/a3_welcome/Bienvenue0.html new file mode 100644 index 0000000..122e029 --- /dev/null +++ b/a3_welcome/templates/a3_welcome/Bienvenue0.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie / Experiment in economics +{% endblock %} + +{% block content %} + + +
+
+ + + +

+

Choix de la langue / Choice of language

+ {% formfield player.versionexp %} + +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a3_welcome/templates/a3_welcome/BienvenueBis.html b/a3_welcome/templates/a3_welcome/BienvenueBis.html new file mode 100644 index 0000000..349a4c1 --- /dev/null +++ b/a3_welcome/templates/a3_welcome/BienvenueBis.html @@ -0,0 +1,55 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Experiment in economics +{% endblock %} + +{% block content %} + + +
+
+ +

Welcome

+ +

Thank you for agreeing to participate in this experiment. +You will receive a fixed payment (of 5 €) for your participation, +regardless of your responses during this experiment. In addition, there will be a variable payment based on your responses during the experiment. +The experiment consists of two types of tasks: questionnaires and games. +

+

+These two tasks are independent of each other, and you will receive instructions at the beginning of each task. +The variable payment you will receive at the end of the experiment will not depend on your responses to the questionnaires. In fact, in these questionnaires, there are no right or wrong answers. However, your variable payment will depend on the quality of your responses to the games. +Specifically, at the end of the experiment, only one of the games will be randomly selected to be paid for real. +The currency used in this experiment is the ECU. +

+

+In case of non-integer winnings, the amount will be rounded (winnings of 1.4 → final winnings of 1€, winnings of 2.8 → final winnings of 3€). +

+

+The experiment lasts about 45 minutes, probably less. You are free to leave the experiment at any time, but if you decide to leave the experiment before completing it, you will not be paid. +

+
+Important: All your answers will be treated anonymously. No one will be able to directly identify your decisions. + + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a3_welcome/tests.py b/a3_welcome/tests.py new file mode 100644 index 0000000..8f3736d --- /dev/null +++ b/a3_welcome/tests.py @@ -0,0 +1,23 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + # yield (pages.Bienvenue0, { + # 'versionexp': random.randint(1,2), + # }) + # + # if self.participant.vars['versionexp'] == 1: + # yield (pages.Bienvenue) + # elif self.participant.vars['versionexp'] == 2: + yield (pages.BienvenueBis) + + + diff --git a/a5_questfin/__init__.py b/a5_questfin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/a5_questfin/_builtin/__init__.py b/a5_questfin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/a5_questfin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/a5_questfin/models.py b/a5_questfin/models.py new file mode 100644 index 0000000..2208b04 --- /dev/null +++ b/a5_questfin/models.py @@ -0,0 +1,646 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'a5_questfin' + players_per_group = None + num_rounds = 1 + + app_seq1 = ["gp", "bw", "MDG_asso", "MDG_class"] + app_seq2 = ["gp", "bw", "MDG_class", "MDG_asso"] + app_seq3 = ["bw", "gp", "MDG_asso", "MDG_class"] + app_seq4 = ["bw", "gp", "MDG_class", "MDG_asso"] + + exchangerate_gp_bw = 0.8 + exchangerate_DGM = 0.1 + + showupfee = 5 + + + + +class Subsession(BaseSubsession): + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id = p.participant.id_in_session, + label = p.participant.label, + game_select_n = p.game_select_n, + gainrisk_eur = p.gainrisk_eur, + gain_bw_eur = p.gain_bw_eur, + mdgasso_gain_dgm_eur = p.mdgasso_gain_dgm_eur, + mdgasso_gain_asso_eur = p.mdgasso_gain_asso_eur, + mdgclass_gain_dgm_eur = p.mdgclass_gain_dgm_eur, + mdgclass_dgm_selected = p.mdgclass_dgm_selected, + mdgclass_round_selected = p.mdgclass_round_selected, + mdgclass_dot1_select = p.mdgclass_dot1_select, + mdgclass_s1_select = p.mdgclass_s1_select, + mdgclass_g1_select = p.mdgclass_g1_select, + mdgclass_keep_select = p.mdgclass_keep_select, + mdgclass_sent_select = p.mdgclass_sent_select, + mdgclass_gain_joueur2 = p.mdgclass_gain_joueur2, + mdgclass_gain_joueur2_eur = p.mdgclass_gain_joueur2_eur, + dictatorYES = p.dictatorYES, + app_sequence_select_n = p.app_sequence_select_n, + game_num_select = p.game_num_select, + firstname = p.firstname, + lastname = p.lastname, + email = p.email, + room = p.room, + gainfinal_eur_f = p.gainfinal_eur_f, + gainfinal_eur_showupfee_f = p.gainfinal_eur_showupfee_f, + gainfinal_asso_eur_f = p.gainfinal_asso_eur_f + )) + return dict(report=report) + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + game_num_select = models.IntegerField() + game_select_n = models.StringField() + game_select = models.IntegerField() + + # result of GP + tirageriskresult = models.StringField() + tirageriskresult_en = models.StringField() + risk11_a = models.FloatField() + risk11_b = models.FloatField() + gainrisk = models.FloatField() + gainrisk_eur = models.FloatField() + + # result of BW + tirage_color_n = models.StringField() + gain_bw = models.FloatField() + gain_bw_eur = models.FloatField() + + # result of MDG_asso + mdgasso_dgm_selected = models.IntegerField() + mdgasso_round_selected = models.IntegerField() + mdgasso_dot1_select = models.IntegerField() + mdgasso_s1_select = models.IntegerField() + mdgasso_g1_select = models.IntegerField() + mdgasso_keep_select = models.FloatField() + mdgasso_sent_select = models.FloatField() + mdgasso_gain_dgm = models.FloatField() + mdgasso_gain_asso = models.FloatField() + mdgasso_gain_dgm_eur = models.FloatField() + mdgasso_gain_asso_eur = models.FloatField() + + # result of MDG_classique + mdgclass_dgm_selected = models.IntegerField() + mdgclass_round_selected = models.IntegerField() + mdgclass_dot1_select = models.IntegerField() + mdgclass_s1_select = models.IntegerField() + mdgclass_g1_select = models.IntegerField() + mdgclass_keep_select = models.FloatField() + mdgclass_sent_select = models.FloatField() + mdgclass_gain_dgm = models.FloatField() + mdgclass_gain_joueur2 = models.FloatField() + mdgclass_gain_dgm_eur = models.FloatField() + mdgclass_gain_joueur2_eur = models.FloatField() + dictatorYES = models.IntegerField() + dictatorYES_n = models.StringField() + + +# demographic quetsionnaire + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts and / or literature'], + [2, '2- Economy and / or management'], + [3, '3- Scientific / engineering'], + [4, '4- Other'], + ], + widget=widgets.RadioSelect, + label="a. Your field of study ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Woman'], + [2, '2- Male'], + [3, '3- Non-binary'], + [4, '4- Do not wish to answer'], + ], + widget=widgets.RadioSelect, + label="b. You are ", + blank=False + ) + + q_42_age = models.IntegerField( + label="c. How old are you?", + blank=False, + min=15, + max=100, + ) + + q_43_nationalite = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + blank=False, + label="d. Country of citizenship", + + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Less than 5,000 Euros'], + [2, '2- Between 5,000 and 10,000 Euros'], + [3, '3- Between 10,000 and 15,000 Euros'], + [4, '4- Between 15,000 and 20,000 Euros'], + [5, '5- Between 20,000 and 25,000 Euros'], + [6, '6- Greater than 25,000 Euros'], + ], + widget=widgets.RadioSelect, + label="e. Please estimate your gross annual income (including your scholarships and student loan) in Euros. (Note: Your own income, not that of your parents)", + blank=False + ) + + + q3_countries = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + label="f. Country - previous accommodation", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="g. City - previous accommodation", + blank=False + ) + + q_31 = models.IntegerField() # nbre d'enfant + + q_47_residence = models.IntegerField( + label="i. You currently live in:", + choices=[ + [1, 'Bâtiment 103'], + [2, 'Another residence '], + ], + widget=widgets.RadioSelect, + blank=False + ) + + q_48_satisfaction = models.IntegerField( + choices=[ + [1, '1 - Very satisfied'], + [2, '2 - Satisfied '], + [3, '3 - Unsatisfied '], + [4, '4 - Very unsatisfied'], + ], + widget=widgets.RadioSelect, + label="j. How satisfied are you with your place of residence? ", + blank=True + ) + + + q_49_propositions = models.StringField( + label="k. Do you have any ideas or suggestions for improvements concerning your place of residence?", + blank=True + ) + + + lastname = models.StringField( + label="Last Name", + blank=False + ) + + firstname = models.StringField( + label="First Name", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Room number (for example: 103.3.09)", + blank=False + ) + id_in_group_nn = models.IntegerField() + + gainfinal_eur = models.FloatField() + gainfinal_eur_showupfee = models.FloatField() + gainfinal_asso_eur = models.FloatField() + + gainfinal_eur_f = models.FloatField() + gainfinal_eur_showupfee_f = models.FloatField() + gainfinal_asso_eur_f = models.FloatField() + + + + + + + diff --git a/a5_questfin/pages.py b/a5_questfin/pages.py new file mode 100644 index 0000000..7055237 --- /dev/null +++ b/a5_questfin/pages.py @@ -0,0 +1,150 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def before_next_page(self): + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n =self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + self.player.game_num_select = random.randint(1,4) + + self.player.game_select_n = getattr(Constants, f'app_seq{self.player.app_sequence_select}')[self.player.game_num_select-1] + + + + + # result of GP + self.player.tirageriskresult = self.participant.vars['tirageriskresult_j1'] + if self.player.tirageriskresult == "Succès": + self.player.tirageriskresult_en = "Success" + elif self.player.tirageriskresult == "Echec": + self.player.tirageriskresult_en = "Failure" + + self.player.risk11_a = self.participant.vars['risk11_a_j1'] + self.player.risk11_b = self.participant.vars['risk11_b_j1'] + self.player.gainrisk = self.participant.vars['gainrisk_j1'] + self.player.gainrisk_eur = self.player.gainrisk * Constants.exchangerate_gp_bw + + # result of BW + self.player.tirage_color_n = self.participant.vars['tirage_color_n'] + self.player.gain_bw = self.participant.vars['gain_bw'] + self.player.gain_bw_eur = self.participant.vars['gain_bw_eur'] + + # result of MDG_asso + self.player.mdgasso_dgm_selected = self.player.participant.vars['mdgasso_dgm_selected'] + self.player.mdgasso_round_selected = self.player.participant.vars['mdgasso_round_selected'] + self.player.mdgasso_dot1_select = self.player.participant.vars['mdgasso_dot1_select'] + self.player.mdgasso_s1_select = self.player.participant.vars['mdgasso_s1_select'] + self.player.mdgasso_g1_select = self.player.participant.vars['mdgasso_g1_select'] + self.player.mdgasso_keep_select = self.player.participant.vars['mdgasso_keep_select'] + self.player.mdgasso_sent_select = self.player.participant.vars['mdgasso_sent_select'] + self.player.mdgasso_gain_dgm = self.player.participant.vars['mdgasso_gain_dgm'] + self.player.mdgasso_gain_asso = self.player.participant.vars['mdgasso_gain_asso'] + self.player.mdgasso_gain_dgm_eur = self.player.participant.vars['mdgasso_gain_dgm_eur'] + self.player.mdgasso_gain_asso_eur = self.player.participant.vars['mdgasso_gain_asso_eur'] + + # result of MDG_classique + self.player.mdgclass_dgm_selected = self.player.participant.vars['mdgclass_dgm_selected'] + self.player.mdgclass_round_selected = self.player.participant.vars['mdgclass_round_selected'] + self.player.mdgclass_dot1_select = self.player.participant.vars['mdgclass_dot1_select'] + self.player.mdgclass_s1_select = self.player.participant.vars['mdgclass_s1_select'] + self.player.mdgclass_g1_select = self.player.participant.vars['mdgclass_g1_select'] + self.player.mdgclass_keep_select = self.player.participant.vars['mdgclass_keep_select'] + self.player.mdgclass_sent_select = self.player.participant.vars['mdgclass_sent_select'] + self.player.mdgclass_gain_dgm = self.player.participant.vars['mdgclass_gain_dgm'] + self.player.mdgclass_gain_joueur2 = self.player.participant.vars['mdgclass_gain_joueur2'] + self.player.mdgclass_gain_dgm_eur = self.player.participant.vars['mdgclass_gain_dgm_eur'] + self.player.mdgclass_gain_joueur2_eur = self.player.participant.vars['mdgclass_gain_joueur2_eur'] + self.player.dictatorYES = random.randint(0, 1) + if self.player.dictatorYES == 1: + self.player.dictatorYES_n = "player_1" + elif self.player.dictatorYES == 0: + self.player.dictatorYES_n = "player_2" + + + if self.player.game_select_n == "gp": + self.player.game_select = 1 + self.player.gainfinal_eur = self.player.gainrisk_eur + self.player.gainfinal_eur_showupfee = self.player.gainfinal_eur + Constants.showupfee + elif self.player.game_select_n == "bw": + self.player.game_select = 2 + self.player.gainfinal_eur = self.player.gain_bw_eur + self.player.gainfinal_eur_showupfee = self.player.gainfinal_eur + Constants.showupfee + elif self.player.game_select_n == "MDG_asso": + self.player.game_select = 3 + self.player.gainfinal_eur = self.player.mdgasso_gain_dgm_eur + self.player.gainfinal_eur_showupfee = self.player.gainfinal_eur + Constants.showupfee + self.player.gainfinal_asso_eur = self.player.mdgasso_gain_asso_eur + self.player.gainfinal_asso_eur_f = round(self.player.gainfinal_asso_eur, 0) + elif self.player.game_select_n == "MDG_class" and self.player.dictatorYES == 1: + self.player.game_select = 4 + self.player.gainfinal_eur = self.player.mdgclass_gain_dgm_eur + self.player.gainfinal_eur_showupfee = self.player.gainfinal_eur + Constants.showupfee + elif self.player.game_select_n == "MDG_class" and self.player.dictatorYES == 0: + self.player.game_select = 4 + self.player.gainfinal_eur = -999 + self.player.gainfinal_eur_showupfee = -999 + + self.player.gainfinal_eur_f = round(self.player.gainfinal_eur,0) + self.player.gainfinal_eur_showupfee_f = round(self.player.gainfinal_eur_showupfee,0) + + + # if self.player.game_select_n != "MDG_class" : + # self.player.payoff = self.player.gainfinal_eur_showupfee + # elif self.player.game_select_n == "MDG_class" and self.player.dictatorYES == 1: + # self.player.payoff = self.player.gainfinal_eur_showupfee + # elif self.player.game_select_n == "MDG_class" and self.player.dictatorYES == 0: + # self.player.payoff = -999 + + + + + + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_age', + 'q_43_nationalite', 'q_44_revenu', + 'q3_countries', 'q_46_logement_ville', 'q_31', + 'q_47_residence', 'q_48_satisfaction', 'q_49_propositions' + ] + +class Result(Page): + form_model = 'player' + form_fields = [ + 'lastname', + 'firstname', + 'email', + 'room', + ] + +class FinalPage(Page): + pass + +class FinalPage2(Page): + + def vars_for_template(self): + + return dict( + game_select=self.player.game_select, + + ) + + + + +page_sequence = [ + Bienvenue, + Questionnaire4, + Result, + #FinalPage, # page test à désactiver + FinalPage2, +] diff --git a/a5_questfin/templates/a5_questfin/AdminReport.html b/a5_questfin/templates/a5_questfin/AdminReport.html new file mode 100644 index 0000000..bfbc454 --- /dev/null +++ b/a5_questfin/templates/a5_questfin/AdminReport.html @@ -0,0 +1,79 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {% endfor %} + +
Participant ID Participant Label gainrisk_eur gain_bw_eur mdgasso_gain_dgm_eur mdgasso_gain_asso_eur mdgclass_gain_dgm_eur dgm_select round_select dotation s1 g1 keep_byj1 sent_toj2 mdgclass_gain_j2_points mdgclass_gain_j2_eur app_seq game_num_select firstname lastname email room dictatorYES game_select_n gainfinal_eur gainfinalshowupfee_eur gainfinal_asso_eur
{{ row.id }}{{ row.label }} {{row.gainrisk_eur}} {{row.gain_bw_eur }} {{row.mdgasso_gain_dgm_eur}} {{row.mdgasso_gain_asso_eur}} {{row.mdgclass_gain_dgm_eur}} {{row.mdgclass_dgm_selected }} {{row.mdgclass_round_selected}} {{row.mdgclass_dot1_select }} {{row.mdgclass_s1_select}} {{row.mdgclass_g1_select}} {{row.mdgclass_keep_select}} {{row.mdgclass_sent_select}} {{row.mdgclass_gain_joueur2}} {{row.mdgclass_gain_joueur2_eur}} {{row.app_sequence_select_n }} {{row.game_num_select}} {{row.firstname}} {{row.lastname}} {{row.email}} {{row.room}} {{row.dictatorYES}} {{row.game_select_n}} {{row.gainfinal_eur_f}} {{row.gainfinal_eur_showupfee_f}} {{row.gainfinal_asso_eur_f}}
diff --git a/a5_questfin/templates/a5_questfin/Bienvenue.html b/a5_questfin/templates/a5_questfin/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/a5_questfin/templates/a5_questfin/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/a5_questfin/templates/a5_questfin/FinalPage.html b/a5_questfin/templates/a5_questfin/FinalPage.html new file mode 100644 index 0000000..3b71dca --- /dev/null +++ b/a5_questfin/templates/a5_questfin/FinalPage.html @@ -0,0 +1,97 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + YOUR GAIN (test page to disable) + +{% endblock %} + +{% block content %} +
+
+ + + +
+ +
+
+ +

+ The game is over. + The randomly selected game is game number: {{ player.game_num_select}} // {{player.game_select_n}} +

+ +
GP ---------------------
+ +

+ The random draw is: {{player.tirageriskresult}} +
Your investment in the risky asset: {{player.risk11_a}} +
You kept: {{player.risk11_b}} +
Your gain for this game is: {{player.gainrisk}} ECU(s) - (exchange rate: 1ECU = 0.8 EUROs) +
Your gain in euros is: {{player.gainrisk_eur}} EUROS(s) +

+ +
BW ---------------------
+ +

The selected color is: {{player.tirage_color_n}} +
Your winnings for this game are: {{player.gain_bw}} ECU(s) - (exchange rate: 1ECU = 0.8 EUROs) +
Your gain in euros is: {{player.gain_bw_eur }} EUROS(s) +

+ +
MDG-asso ---------------------
+

+ The randomly selected round is: {{player.mdgasso_round_selected}} +
Your endowment during this round was {{player.mdgasso_dot1_select}} ECUs. +
The value of S was {{player.mdgasso_s1_select}}. +
The value of G was {{player.mdgasso_g1_select}}. +

You chose to keep {{player.mdgasso_keep_select}} POINTs and give {{player.mdgasso_sent_select}} POINTs to the organization. +

Your gain is {{player.mdgasso_gain_dgm}} POINTs ({{player.mdgasso_gain_dgm_eur}} EUROs). +
The organization's gain is {{player.mdgasso_gain_asso}} POINTs ({{player.mdgasso_gain_asso_eur}} EUROs). +
Recall: - (exchange rate: 1 POINT = 0.1 EUROs) +

+ + +
MDG-class ---------------------
+

+ + Your role in this game is: {{player.dictatorYES_n}} + +
if player.dictatorYES == 1 : + +
+ + The randomly selected round is: {{player.mdgclass_round_selected}} +
Your endowment during this round was {{player.mdgclass_dot1_select}} ECUs. +
The value of S was {{player.mdgclass_s1_select}}. +
The value of G was {{player.mdgclass_g1_select}}. +

You chose to keep {{player.mdgclass_keep_select}} POINTs and give {{player.mdgclass_sent_select}} POINTs to player 2. +

Your gain is {{player.mdgclass_gain_dgm}} POINTs ({{player.mdgclass_gain_dgm_eur}} EUROs). +
Player 2's gain is {{player.mdgclass_gain_joueur2}} POINTs ({{player.mdgclass_gain_joueur2_eur}} EUROs). +
Recall: - (exchange rate: 1 POINT = 0.1 EUROs) +

+ + +
if player.dictatorYES == 0 : + +
We must wait for the response of the second player before communicating your gain to you. + An email will be sent to you shortly to announce your gain and the procedures for retrieving your gain. + +

+ +

+ + + + + + +
+
+ +

{% next_button %}

+ + + +{% endblock %} \ No newline at end of file diff --git a/a5_questfin/templates/a5_questfin/FinalPage2.html b/a5_questfin/templates/a5_questfin/FinalPage2.html new file mode 100644 index 0000000..65023b9 --- /dev/null +++ b/a5_questfin/templates/a5_questfin/FinalPage2.html @@ -0,0 +1,112 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + YOUR GAIN + +{% endblock %} + +{% block content %} +
+
+ + {% if player.game_select_n != "MDG_class" %} +
+

You have completed the experiment and earned a total of {{ player.gainfinal_eur_showupfee_f|to2}} EUROS (= Gain + showup-fee).

+
+ {% elif player.game_select_n == "MDG_class" and player.dictatorYES == 1 %} +
+

You have completed the experiment and earned a total of {{ player.gainfinal_eur_showupfee_f|to2}} EUROS (= Gain + showup-fee).

+
+ {% endif %} + +
+ +
+ +
+
+ +

+

+ The game is over. + The randomly selected game is game number: {{ player.game_num_select}} // {{player.game_select_n}} +

+

+ + {% if player.game_select_n == "gp" %} + +

+ The random draw is: {{player.tirageriskresult_en}} +
Your investment in the risky asset: {{player.risk11_a}} +
You kept: {{player.risk11_b}} +
Your gain for this game is: {{player.gainrisk}} ECU(s) - (exchange rate: 1ECU = 0.8 EUROs) +
Your gain in euros is: {{player.gainrisk_eur}} EUROS(s) +

+ + {% elif player.game_select_n == "bw" %} + +

The selected color is: {{player.tirage_color_n}} +
Your winnings for this game are: {{player.gain_bw}} ECU(s) - (exchange rate: 1 ECU = 0.8 EUROs) +
Your gain in euros is: {{player.gain_bw_eur}} EUROS(s) +

+ + {% elif player.game_select_n == "MDG_asso" %} + +

+ The randomly selected round is: {{player.mdgasso_round_selected}} +
Your endowment during this round was {{player.mdgasso_dot1_select}} ECUs. +
The value of S was {{player.mdgasso_s1_select}}. +
The value of G was {{player.mdgasso_g1_select}}. +

You chose to keep {{player.mdgasso_keep_select}} POINTs and give {{player.mdgasso_sent_select}} POINTs to the organization. +

Your gain is {{player.mdgasso_gain_dgm}} POINTs ({{player.mdgasso_gain_dgm_eur}} EUROs). +
The organization's gain is {{player.mdgasso_gain_asso}} POINTs ({{player.mdgasso_gain_asso_eur}} EUROs). +
Recall: - (exchange rate: 1 POINT = 0.1 EUROs) +

+ + {% elif player.game_select_n == "MDG_class" %} + + + Your role in this game is : {{player.dictatorYES_n}} + + {% if player.dictatorYES == 1 %} +

+ +
+ + The randomly selected round is: {{player.mdgclass_round_selected}} +
Your endowment during this round was {{player.mdgclass_dot1_select}} ECUs. +
The value of S was {{player.mdgclass_s1_select}}. +
The value of G was {{player.mdgclass_g1_select}}. +

You chose to keep {{player.mdgclass_keep_select}} POINTs and give {{player.mdgclass_sent_select}} POINTs to player 2. +

Your gain is {{player.mdgclass_gain_dgm}} POINTs ({{player.mdgclass_gain_dgm_eur}} EUROs). +
Player 2's gain is {{player.mdgclass_gain_joueur2}} POINTs ({{player.mdgclass_gain_joueur2_eur}} EUROs). +
Recall: - (exchange rate: 1 POINT = 0.1 EUROs) +

+ + {% elif player.dictatorYES == 0 %} + +

+ +
We must wait for the response of the second player before communicating your gain to you. + An email will be sent to you shortly to announce your gain and the procedures for retrieving your gain. +

+ + {% endif %} + + + {% endif %} + + + + + +
+
+ +

{% next_button %}

+ + + +{% endblock %} \ No newline at end of file diff --git a/a5_questfin/templates/a5_questfin/Questionnaire4.html b/a5_questfin/templates/a5_questfin/Questionnaire4.html new file mode 100644 index 0000000..f460097 --- /dev/null +++ b/a5_questfin/templates/a5_questfin/Questionnaire4.html @@ -0,0 +1,98 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +Final Questionnaire +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account in the calculation of + your earnings. We nevertheless ask you to respond as sincerely as possible. + As a reminder, all your responses will be treated anonymously, and no one + will not have access to your answers. + +

+
+
+ + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_age%} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
+

+ +Indicate the City and Country where your previous accommodation was: +

+ {% formfield player.q3_countries %} + + + {% formfield player.q_46_logement_ville %} + + + +
+
+ + +

+
+ + + {% formfield player.q_47_residence %} + + {% formfield player.q_48_satisfaction %} + + {% formfield player.q_49_propositions %} + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/a5_questfin/templates/a5_questfin/Result.html b/a5_questfin/templates/a5_questfin/Result.html new file mode 100644 index 0000000..d629a96 --- /dev/null +++ b/a5_questfin/templates/a5_questfin/Result.html @@ -0,0 +1,59 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + FINAL QUESTIONNAIRE + +{% endblock %} + +{% block content %} +
+
+ +
+
+ NB : Useful information to receive your gain: +
+
+ +
+ +
+
+ +

+ Please fill in the following fields in order to be able to take the + amount you won during this experience. + {% formfield player.lastname %} + {% formfield player.firstname %} + {% formfield player.email %} + {% formfield player.room %} + +

+ +

+ + Reminder for those who have not yet registered + + : to receive your gain you must subscribe to the list of voluntary participants via the link : + + +

https://ipel.crest.fr/public/participant_create.php

+ +
Note : Your personal data are strictly confidential. + All your responses will be treated anonymously. +
+ +

+ + +
+
+ +

{% next_button %}

+ + + +{% endblock %} + diff --git a/a5_questfin/tests.py b/a5_questfin/tests.py new file mode 100644 index 0000000..1f48454 --- /dev/null +++ b/a5_questfin/tests.py @@ -0,0 +1,38 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Bienvenue) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_age': random.randint(18, 40), + 'q_43_nationalite': 5, + 'q_44_revenu': 1, + 'q3_countries': 1, + 'q_46_logement_ville': 'fr', + 'q_31': 3, + 'q_47_residence': 1, + 'q_48_satisfaction': 2, + 'q_49_propositions': 'sasasadad' + }) + + yield (pages.Result, { + 'lastname': 'a', + 'firstname': 'b', + 'email': '@', + 'room': 'a', + }) + + yield (pages.FinalPage2) + + diff --git a/b3_bw/__init__.py b/b3_bw/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/b3_bw/_builtin/__init__.py b/b3_bw/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/b3_bw/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/b3_bw/models.py b/b3_bw/models.py new file mode 100644 index 0000000..eb6f0e0 --- /dev/null +++ b/b3_bw/models.py @@ -0,0 +1,153 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'b3_bw' + players_per_group = None + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'b3_bw/Risk_BinsWanger_qc.html' + + gainrisk_red = [8, 7, 6, 5, 4, 3, 2, 1, 0] + gainrisk_green = [8, 10, 12, 14, 16, 18, 20, 22, 24] + + + + tauxchange = 0.8 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + + + + id_in_group_nn = models.IntegerField() + treatment = models.IntegerField() + riskqc_a = models.IntegerField( + choices=[ + [1, '10 ECUs'], + [2, '0 ECUs'], + [3, '4 ECUs'], + [4, '7 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '20 ECUs'], + [2, '0 ECUs'], + [3, '5 ECUs'], + [4, '14 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '2 ECUs'], + [3, '24 ECUs'], + [4, '8 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + + tirage_color = models.IntegerField() + tirage_color_n = models.StringField() + + gain_bw = models.FloatField() + gain_bw_eur = models.FloatField() + + ##### + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/b3_bw/pages.py b/b3_bw/pages.py new file mode 100644 index 0000000..13c687a --- /dev/null +++ b/b3_bw/pages.py @@ -0,0 +1,107 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.round_number == 1 and self.player.participant.vars['app_sequence_select'] < 3 + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + 1 + self.player.participant.vars['game_num'] = self.player.game_num + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n = self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + + +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] < 3 # 1 ou 2 + + def before_next_page(self): + self.player.tirage_color = random.randint(0, 1) + if self.player.tirage_color == 0: + self.player.tirage_color_n = 'red' + else: + self.player.tirage_color_n = 'green' + + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] < 3 # 1 ou 2 + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] < 3 # 1 ou 2 + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + elif self.player.choicerisk == 5: + self.player.choicerisknn = "E" + elif self.player.choicerisk == 6: + self.player.choicerisknn = "F" + elif self.player.choicerisk == 7: + self.player.choicerisknn = "G" + elif self.player.choicerisk == 8: + self.player.choicerisknn = "H" + elif self.player.choicerisk == 9: + self.player.choicerisknn = "I" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + + if self.player.tirage_color == 0: + self.player.gain_bw = Constants.gainrisk_red[self.player.choicerisk-1] + else: + self.player.gain_bw = Constants.gainrisk_green[self.player.choicerisk-1] + self.player.gain_bw_eur = round(self.player.gain_bw * Constants.tauxchange,1) + + self.participant.vars['tirage_color_n'] = self.player.tirage_color_n + self.participant.vars['gain_bw'] = self.player.gain_bw + self.participant.vars['gain_bw_eur'] = self.player.gain_bw_eur + + +page_sequence = [ + Bienvenue, + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, +] diff --git a/b3_bw/templates/b3_bw/Bienvenue.html b/b3_bw/templates/b3_bw/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/b3_bw/templates/b3_bw/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/b3_bw/templates/b3_bw/Jeu2End.html b/b3_bw/templates/b3_bw/Jeu2End.html new file mode 100644 index 0000000..cc12151 --- /dev/null +++ b/b3_bw/templates/b3_bw/Jeu2End.html @@ -0,0 +1,34 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + + + First Part : End + + +{% endblock %} + +{% block content %} +
+
+ + + +

+ You have completed the first part. + +
You will now begin the second part. + +

+ + + +
+
+ +

{% next_button %}

+ + +{% endblock %} diff --git a/b3_bw/templates/b3_bw/Risk_BinsWanger.html b/b3_bw/templates/b3_bw/Risk_BinsWanger.html new file mode 100644 index 0000000..cd40b7f --- /dev/null +++ b/b3_bw/templates/b3_bw/Risk_BinsWanger.html @@ -0,0 +1,559 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + + Game {{player.game_num}}: Your choice + +{% endblock %} + +{% block content %} + + + +
+
+ + + + +

+You will now play the game for real. The winning of this game will count towards the final gain.

+ + + +

Now please choose the situation you prefer the most from the following choices (A, B, C, D, E, F, G, H or I). +

+ +

+ +

Please make a choice

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
A +

+ + + + +
+ + + + +

+
+

+ + + + +
+ + + + +

+
A
(8 ECUs) (8 ECUs)
B + +

+ + + + +
+ + + + + +

+ +
+ +

+ + + + + + +
+ + + + + +

+ +
B
(7 ECUs) (10 ECUs)
C + +

+ + + +
+ + + + + +

+ +
+ +

+ + + + + + + +
+ + + + + + +

+ +
C
(6 ECUs) (12 ECUs)
D + +

+ + + +
+ + + +

+ +
+ +

+ + + + + + + +
+ + + + + + + +

+ +
D
(5 ECUs) (14 ECUs)
E + +

+ + +
+ + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +

+ +
E
(4 ECUs) (16 ECUs)
F + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + +

+ +
F
(3 ECUs) (18 ECUs)
G + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + +

+ + +
G
(2 ECU) (20 ECUs)
H + +

+ +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + +

+ + +
H
(1 ECU) (22 ECUs)
I + + +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +

+ +
I
(0 ECUs) (24 ECUs)
+ +




+ + + + + +
+ + + +
+ + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/b3_bw/templates/b3_bw/Risk_BinsWanger_color.html b/b3_bw/templates/b3_bw/Risk_BinsWanger_color.html new file mode 100644 index 0000000..b3f9dd0 --- /dev/null +++ b/b3_bw/templates/b3_bw/Risk_BinsWanger_color.html @@ -0,0 +1,161 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Jeu 2 : Choix de votre couleur + + + +{% endblock %} + +{% block content %} + + +
+
+ + + + + +

Veuillez choisir entre les deux boutons suivants :

+ +

Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

+

+ +
+ + + +
+ +

+

+ +

+ +

+

+

+ + + +
+ + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/b3_bw/templates/b3_bw/Risk_BinsWanger_qc.html b/b3_bw/templates/b3_bw/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..fdbd9b9 --- /dev/null +++ b/b3_bw/templates/b3_bw/Risk_BinsWanger_qc.html @@ -0,0 +1,566 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Game {{player.game_num}} + + +{% endblock %} + +{% block content %} + +

+This game can be taken into account when calculating your gains.

+ +
+
+ + + + + +

+ Rules of the game: + +

+ +

+ Look at the table below. It presents 9 different situations. Look at them carefully. + Situations A, B, C, D, E, F, G, H or I contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

+ +

+At the end of the game, the ECU you have won will be converted into € using the following rule:

+ +

The exchange rate for this game is (1 ECU = 0.8 EUROS)

+
+ +

+So you will first have to choose the situation you prefer the most: A, B, C, D, E, F, G, H or I.

+ + +

+ At the end of the experiment, a random draw will be made by the programme to determine your colour (50% chance of red and 50% chance of green). +

+ +

+ +

Warning! The image below is an example, your choice will be saved later.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
A +

+ + + + +
+ + + + +

+
+

+ + + + +
+ + + + +

+
(8 ECUs) (8 ECUs)
B + +

+ + + + +
+ + + + + +

+ +
+ +

+ + + + + + +
+ + + + + +

+ +
(7 ECUs) (10 ECUs)
C + +

+ + + +
+ + + + + +

+ +
+ +

+ + + + + + + +
+ + + + + + +

+ +
(6 ECUs) (12 ECUs)
D + +

+ + + +
+ + + +

+ +
+ +

+ + + + + + + +
+ + + + + + + +

+ +
(5 ECUs) (14 ECUs)
E + +

+ + +
+ + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +

+ +
(4 ECUs) (16 ECUs)
F + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + +

+ +
(3 ECUs) (18 ECUs)
G + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + +

+ + +
(2 ECU) (20 ECUs)
H + +

+ +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + +

+ + +
(1 ECU) (22 ECUs)
I + + +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +

+ + + +
(0 ECUs) (24 ECUs)
+ + + +

+ + + + + +
+ + + +
+ + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/b3_bw/templates/b3_bw/Risk_BinsWanger_qc2.html b/b3_bw/templates/b3_bw/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..ee90eb4 --- /dev/null +++ b/b3_bw/templates/b3_bw/Risk_BinsWanger_qc2.html @@ -0,0 +1,326 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Comprehension Questionnaire +{% endblock %} + +{% block content %} + + +
+
+ + + + + +

Now we want to test if you have understood the in-game instructions.

+ + +
+ +

+ Example 1: + +

+ + +

If you have chosen situation B, then the color Green appears. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
B + + +

+ + + + +
+ + + +

+ +
+ +

+ + + + + +
+ + + + + +

+ +
+ + B + +
(7 ECUs) (10 ECUs)
+ +
+ +

+What would your earnings be?

+ {% formfield player.riskqc_a label="" %} + +

+ + +

+ Example 2: +

+ + +

If you have chosen situation D, then the color Red appears. + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
D + +

+ + + +
+ + + +

+ +
+ +

+ + + + + + + +
+ + + + + + + + + +

+ + D + +
(5 ECU) (14 ECUs)
+ +
+

+ Question 2: What would your earnings be?

+ + {% formfield player.riskqc_b label = ""%} + +

+ + + +

+ + Example 3: +

+ + +

If you have chosen situation I, then the color Red + appears. + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
I + + +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +

+ + +
+ + E + +
(0 ECUs) (24 ECUs)
+ +

+ Question 3: What would your earnings be?

+ + {% formfield player.riskqc_c label = ""%} + +

+ + + + + +




+ + + + + + +
+ + + +
+ + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/b3_bw/templates/b3_bw/Risk_BinsWanger_result.html b/b3_bw/templates/b3_bw/Risk_BinsWanger_result.html new file mode 100644 index 0000000..ee231fc --- /dev/null +++ b/b3_bw/templates/b3_bw/Risk_BinsWanger_result.html @@ -0,0 +1,51 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + Gain of game 1 : Details + + +{% endblock %} + +{% block content %} + + +
+
+ + + +

Your choice was: {{player.choicerisknn}}

+ +

The selected color is: {{player.colorselectnn}}

+ + +

Your winnings for this game are: {{player.gainrisk}} ECU (s)

+ + +

Your winnings for this game are: {{player.gainriskeur}} ECU (s)

+

-----------------------------------------

+ +
+ + + +
+
+ +

+

+Reminder of the instructions: +

+
+
+ + {% include Constants.instructions_BW_template %} + +
+ +{% endblock %} + + diff --git a/b3_bw/tests.py b/b3_bw/tests.py new file mode 100644 index 0000000..946ec60 --- /dev/null +++ b/b3_bw/tests.py @@ -0,0 +1,33 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.round_number == 1 and self.participant.vars['app_sequence_select'] < 3: + if self.round_number == 1: + yield (pages.Bienvenue) + + + if self.player.participant.vars['app_sequence_select'] < 3: + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 9), + }) + + + + diff --git a/b3_bw_v2/__init__.py b/b3_bw_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/b3_bw_v2/_builtin/__init__.py b/b3_bw_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/b3_bw_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/b3_bw_v2/models.py b/b3_bw_v2/models.py new file mode 100644 index 0000000..8dc0065 --- /dev/null +++ b/b3_bw_v2/models.py @@ -0,0 +1,153 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'b3_bw_v2' + players_per_group = None + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'b3_bw_v2/Risk_BinsWanger_qc.html' + + gainrisk_red = [8, 7, 6, 5, 4, 3, 2, 1, 0] + gainrisk_green = [8, 10, 12, 14, 16, 18, 20, 22, 24] + + + + tauxchange = 0.8 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + + + + id_in_group_nn = models.IntegerField() + treatment = models.IntegerField() + riskqc_a = models.IntegerField( + choices=[ + [1, '10 ECUs'], + [2, '0 ECUs'], + [3, '4 ECUs'], + [4, '7 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '20 ECUs'], + [2, '0 ECUs'], + [3, '5 ECUs'], + [4, '14 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '2 ECUs'], + [3, '24 ECUs'], + [4, '8 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + + tirage_color = models.IntegerField() + tirage_color_n = models.StringField() + + gain_bw = models.FloatField() + gain_bw_eur = models.FloatField() + + ##### + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/b3_bw_v2/pages.py b/b3_bw_v2/pages.py new file mode 100644 index 0000000..e4b2bdb --- /dev/null +++ b/b3_bw_v2/pages.py @@ -0,0 +1,107 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.round_number == 1 and self.player.participant.vars['app_sequence_select'] > 2 #3 ou 4 + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + 1 + self.player.participant.vars['game_num'] = self.player.game_num + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n = self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + + +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] > 2 #3 ou 4 + + def before_next_page(self): + self.player.tirage_color = random.randint(0, 1) + if self.player.tirage_color == 0: + self.player.tirage_color_n = 'red' + else: + self.player.tirage_color_n = 'green' + + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] > 2 #3 ou 4 + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] > 2 #3 ou 4 + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + elif self.player.choicerisk == 5: + self.player.choicerisknn = "E" + elif self.player.choicerisk == 6: + self.player.choicerisknn = "F" + elif self.player.choicerisk == 7: + self.player.choicerisknn = "G" + elif self.player.choicerisk == 8: + self.player.choicerisknn = "H" + elif self.player.choicerisk == 9: + self.player.choicerisknn = "I" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + + if self.player.tirage_color == 0: + self.player.gain_bw = Constants.gainrisk_red[self.player.choicerisk-1] + else: + self.player.gain_bw = Constants.gainrisk_green[self.player.choicerisk-1] + self.player.gain_bw_eur = round(self.player.gain_bw * Constants.tauxchange,1) + + self.participant.vars['tirage_color_n'] = self.player.tirage_color_n + self.participant.vars['gain_bw'] = self.player.gain_bw + self.participant.vars['gain_bw_eur'] = self.player.gain_bw_eur + + +page_sequence = [ + Bienvenue, + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, +] diff --git a/b3_bw_v2/templates/b3_bw_v2/Bienvenue.html b/b3_bw_v2/templates/b3_bw_v2/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/b3_bw_v2/templates/b3_bw_v2/Jeu2End.html b/b3_bw_v2/templates/b3_bw_v2/Jeu2End.html new file mode 100644 index 0000000..cc12151 --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Jeu2End.html @@ -0,0 +1,34 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + + + First Part : End + + +{% endblock %} + +{% block content %} +
+
+ + + +

+ You have completed the first part. + +
You will now begin the second part. + +

+ + + +
+
+ +

{% next_button %}

+ + +{% endblock %} diff --git a/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger.html b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger.html new file mode 100644 index 0000000..cd40b7f --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger.html @@ -0,0 +1,559 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + + Game {{player.game_num}}: Your choice + +{% endblock %} + +{% block content %} + + + +
+
+ + + + +

+You will now play the game for real. The winning of this game will count towards the final gain.

+ + + +

Now please choose the situation you prefer the most from the following choices (A, B, C, D, E, F, G, H or I). +

+ +

+ +

Please make a choice

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
A +

+ + + + +
+ + + + +

+
+

+ + + + +
+ + + + +

+
A
(8 ECUs) (8 ECUs)
B + +

+ + + + +
+ + + + + +

+ +
+ +

+ + + + + + +
+ + + + + +

+ +
B
(7 ECUs) (10 ECUs)
C + +

+ + + +
+ + + + + +

+ +
+ +

+ + + + + + + +
+ + + + + + +

+ +
C
(6 ECUs) (12 ECUs)
D + +

+ + + +
+ + + +

+ +
+ +

+ + + + + + + +
+ + + + + + + +

+ +
D
(5 ECUs) (14 ECUs)
E + +

+ + +
+ + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +

+ +
E
(4 ECUs) (16 ECUs)
F + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + +

+ +
F
(3 ECUs) (18 ECUs)
G + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + +

+ + +
G
(2 ECU) (20 ECUs)
H + +

+ +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + +

+ + +
H
(1 ECU) (22 ECUs)
I + + +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +

+ +
I
(0 ECUs) (24 ECUs)
+ +




+ + + + + +
+ + + +
+ + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_color.html b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_color.html new file mode 100644 index 0000000..b3f9dd0 --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_color.html @@ -0,0 +1,161 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Jeu 2 : Choix de votre couleur + + + +{% endblock %} + +{% block content %} + + +
+
+ + + + + +

Veuillez choisir entre les deux boutons suivants :

+ +

Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

+

+ +
+ + + +
+ +

+

+ +

+ +

+

+

+ + + +
+ + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_qc.html b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..fdbd9b9 --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_qc.html @@ -0,0 +1,566 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Game {{player.game_num}} + + +{% endblock %} + +{% block content %} + +

+This game can be taken into account when calculating your gains.

+ +
+
+ + + + + +

+ Rules of the game: + +

+ +

+ Look at the table below. It presents 9 different situations. Look at them carefully. + Situations A, B, C, D, E, F, G, H or I contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

+ +

+At the end of the game, the ECU you have won will be converted into € using the following rule:

+ +

The exchange rate for this game is (1 ECU = 0.8 EUROS)

+
+ +

+So you will first have to choose the situation you prefer the most: A, B, C, D, E, F, G, H or I.

+ + +

+ At the end of the experiment, a random draw will be made by the programme to determine your colour (50% chance of red and 50% chance of green). +

+ +

+ +

Warning! The image below is an example, your choice will be saved later.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
A +

+ + + + +
+ + + + +

+
+

+ + + + +
+ + + + +

+
(8 ECUs) (8 ECUs)
B + +

+ + + + +
+ + + + + +

+ +
+ +

+ + + + + + +
+ + + + + +

+ +
(7 ECUs) (10 ECUs)
C + +

+ + + +
+ + + + + +

+ +
+ +

+ + + + + + + +
+ + + + + + +

+ +
(6 ECUs) (12 ECUs)
D + +

+ + + +
+ + + +

+ +
+ +

+ + + + + + + +
+ + + + + + + +

+ +
(5 ECUs) (14 ECUs)
E + +

+ + +
+ + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +

+ +
(4 ECUs) (16 ECUs)
F + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + +

+ +
(3 ECUs) (18 ECUs)
G + +

+ + + +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + +

+ + +
(2 ECU) (20 ECUs)
H + +

+ +

+ +
+ +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + +

+ + +
(1 ECU) (22 ECUs)
I + + +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +

+ + + +
(0 ECUs) (24 ECUs)
+ + + +

+ + + + + +
+ + + +
+ + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_qc2.html b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..ee90eb4 --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_qc2.html @@ -0,0 +1,326 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Comprehension Questionnaire +{% endblock %} + +{% block content %} + + +
+
+ + + + + +

Now we want to test if you have understood the in-game instructions.

+ + +
+ +

+ Example 1: + +

+ + +

If you have chosen situation B, then the color Green appears. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
B + + +

+ + + + +
+ + + +

+ +
+ +

+ + + + + +
+ + + + + +

+ +
+ + B + +
(7 ECUs) (10 ECUs)
+ +
+ +

+What would your earnings be?

+ {% formfield player.riskqc_a label="" %} + +

+ + +

+ Example 2: +

+ + +

If you have chosen situation D, then the color Red appears. + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
D + +

+ + + +
+ + + +

+ +
+ +

+ + + + + + + +
+ + + + + + + + + +

+ + D + +
(5 ECU) (14 ECUs)
+ +
+

+ Question 2: What would your earnings be?

+ + {% formfield player.riskqc_b label = ""%} + +

+ + + +

+ + Example 3: +

+ + +

If you have chosen situation I, then the color Red + appears. + +

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Options Red Green
I + + +

+ + + + + + + + +
+ + + + + + + + +
+ + + + + + + + +

+ + +
+ + E + +
(0 ECUs) (24 ECUs)
+ +

+ Question 3: What would your earnings be?

+ + {% formfield player.riskqc_c label = ""%} + +

+ + + + + +




+ + + + + + +
+ + + +
+ + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_result.html b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_result.html new file mode 100644 index 0000000..ee231fc --- /dev/null +++ b/b3_bw_v2/templates/b3_bw_v2/Risk_BinsWanger_result.html @@ -0,0 +1,51 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + Gain of game 1 : Details + + +{% endblock %} + +{% block content %} + + +
+
+ + + +

Your choice was: {{player.choicerisknn}}

+ +

The selected color is: {{player.colorselectnn}}

+ + +

Your winnings for this game are: {{player.gainrisk}} ECU (s)

+ + +

Your winnings for this game are: {{player.gainriskeur}} ECU (s)

+

-----------------------------------------

+ +
+ + + +
+
+ +

+

+Reminder of the instructions: +

+
+
+ + {% include Constants.instructions_BW_template %} + +
+ +{% endblock %} + + diff --git a/b3_bw_v2/tests.py b/b3_bw_v2/tests.py new file mode 100644 index 0000000..b38ed4f --- /dev/null +++ b/b3_bw_v2/tests.py @@ -0,0 +1,34 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['app_sequence_select'] > 2: + + if self.round_number == 1: + yield (pages.Bienvenue) + + + if self.player.participant.vars['app_sequence_select'] > 2: #3 ou 4 + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 9), + }) + + + diff --git a/dictator/Final.html b/dictator/Final.html new file mode 100644 index 0000000..0c21a84 --- /dev/null +++ b/dictator/Final.html @@ -0,0 +1,15 @@ +{{ block title }}Results{{ endblock }} +{{ block content }} +

+ + {{ if player.id_in_group == 1 }} + You decided to keep {{ group.kept }} for yourself. + {{ else }} + Participant 1 decided to keep {{ group.kept }}, so + you got {{ offer }}. + {{ endif }} + + {{ next_button }} +

+ {{ include C.INSTRUCTIONS_TEMPLATE }} + diff --git a/dictator/Introduction.html b/dictator/Introduction.html new file mode 100644 index 0000000..6eea97b --- /dev/null +++ b/dictator/Introduction.html @@ -0,0 +1,5 @@ +{{ block title }}Introduction{{ endblock }} +{{ block content }} + {{ include_sibling 'instructions.html' }} + {{ next_button }} +{{ endblock }} diff --git a/dictator/Offer.html b/dictator/Offer.html new file mode 100644 index 0000000..6052d8b --- /dev/null +++ b/dictator/Offer.html @@ -0,0 +1,19 @@ +{{ block title }} +Your Decision +{{ endblock }} + + +{{ block content }} +

+ You are Participant 1. + Please decide how much of the {{ C.ENDOWMENT }} + you will keep for yourself. +

+ + {{ formfields }} + + {{ next_button }} + + {{ include_sibling 'instructions.html' }} + +{{ endblock }} diff --git a/dictator/Results.html b/dictator/Results.html new file mode 100644 index 0000000..7aed13c --- /dev/null +++ b/dictator/Results.html @@ -0,0 +1,15 @@ +{{ block title }}Results{{ endblock }} +{{ block content }} +

+ + {{ if player.id_in_group == 1 }} + You decided to keep {{ group.kept }} for yourself. + {{ else }} + Participant 1 decided to keep {{ group.kept }}, so + you got {{ offer }}. + {{ endif }} + + {{ next_button }} +

+ {{ include_sibling 'instructions.html' }} +{{ endblock }} diff --git a/dictator/__init__.py b/dictator/__init__.py new file mode 100644 index 0000000..4baa3b4 --- /dev/null +++ b/dictator/__init__.py @@ -0,0 +1,116 @@ +from otree.api import * + + + +doc = """ +One player decides how to divide a certain amount between himself and the other +player. +See: Kahneman, Daniel, Jack L. Knetsch, and Richard H. Thaler. "Fairness +and the assumptions of economics." Journal of business (1986): +S285-S300. +""" + + +class C(BaseConstants): + NAME_IN_URL = 'dictator' + PLAYERS_PER_GROUP = 2 + NUM_ROUNDS = 10 + # Initial amount allocated to the dictator + ENDOWMENT = cu(100) + + +class Subsession(BaseSubsession): + pass + + +class Group(BaseGroup): + kept = models.CurrencyField( + doc="""Amount dictator decided to keep for himself""", + min=0, + max=C.ENDOWMENT, + label="I will keep", + ) + + +class Player(BasePlayer): + pass + + +# FUNCTIONS +def set_payoffs(group: Group): + p1 = group.get_player_by_id(1) + p2 = group.get_player_by_id(2) + p1.payoff = group.kept + p2.payoff = C.ENDOWMENT - group.kept + p1.participant.vars['earning_1'] = p1.payoff + p2.participant.vars['earning_1'] = p2.payoff + +def get_players(player: Player): + participant_name = player.participant + return dict(participant_name=participant_name) + + +def vars_for_admin_report(subsession): + all_offers = [] + for subsession in subsession.in_all_rounds(): + for group in subsession.get_groups(): + # Safely retrieve the value of group.kept + kept_value = group.field_maybe_none('kept') or 0 + offer = C.ENDOWMENT - kept_value + all_offers.append(offer) + payoffs = sorted([p.payoff for p in subsession.get_players()]) + return dict(payoffs=payoffs, all_offers=all_offers) + + + +def js_vars(player: Player): + group = player.group + return dict( + taken=group.kept, + ) + + +# PAGES +class Introduction(Page): + pass + + +class Offer(Page): + form_model = 'group' + form_fields = ['kept'] + + @staticmethod + def is_displayed(player: Player): + return player.id_in_group == 1 + + +class ResultsWaitPage(WaitPage): + after_all_players_arrive = set_payoffs + + +class Results(Page): + @staticmethod + def vars_for_template(player: Player): + group = player.group + + return dict(offer=C.ENDOWMENT - group.kept) + + @staticmethod + def js_vars(player: Player): + group = player.group + return dict( + taken=group.kept, + ) + + @staticmethod + def vars_for_admin_report(subsession): + payoffs = sorted([p.payoff for p in subsession.get_players()]) + return dict(payoffs=payoffs) + + +page_sequence = [ + Introduction, + Offer, + ResultsWaitPage, + Results +] diff --git a/dictator/admin_report.html b/dictator/admin_report.html new file mode 100644 index 0000000..157cd01 --- /dev/null +++ b/dictator/admin_report.html @@ -0,0 +1,344 @@ +

Here is the sorted list of payoffs in round {{ subsession.round_number }}

+ +
    + {{ for payoff in payoffs }} +
  • {{ payoff }}
  • + {{ endfor }} +
+ + + + + + + +
+
+
+

+ Chart showing players' offers. +

+
+ + diff --git a/dictator/chart.html b/dictator/chart.html new file mode 100644 index 0000000..8f9d015 --- /dev/null +++ b/dictator/chart.html @@ -0,0 +1,211 @@ + + + + + +
+ + \ No newline at end of file diff --git a/dictator/instructions.html b/dictator/instructions.html new file mode 100644 index 0000000..f18ba24 --- /dev/null +++ b/dictator/instructions.html @@ -0,0 +1,20 @@ + +
+
+

+ Instructions +

+ +

+ You will be paired randomly and anonymously with another participant. + In this study, one of you will be Participant 1 and the other + Participant 2. Prior to making a decision, you will learn your role, + which will be randomly assigned. +

+

+ There is {{ C.ENDOWMENT }} to split. Participant 1 will + decide how much they will retain. Then the rest will go to + Participant 2. +

+
+
\ No newline at end of file diff --git a/dictator/tests.py b/dictator/tests.py new file mode 100644 index 0000000..01053fa --- /dev/null +++ b/dictator/tests.py @@ -0,0 +1,14 @@ +from otree.api import Currency as c, currency_range, expect, Bot +from . import * + + +class PlayerBot(Bot): + def play_round(self): + yield Introduction + + if self.player.id_in_group == 1: + yield Offer, dict(kept=cu(99)) + expect(self.player.payoff, cu(99)) + else: + expect(self.player.payoff, cu(1)) + yield Results \ No newline at end of file diff --git a/dictator_modif/__init__.py b/dictator_modif/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dictator_modif/_builtin/__init__.py b/dictator_modif/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/dictator_modif/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/dictator_modif/models.py b/dictator_modif/models.py new file mode 100644 index 0000000..d4293df --- /dev/null +++ b/dictator_modif/models.py @@ -0,0 +1,143 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) +import random + + +doc = """ +Modified dictator game +""" + + +class Constants(BaseConstants): + name_in_url = 'dictator_modif' + players_per_group = 2 + num_rounds = 8 + + instructions_template = 'dictator_modif/instructions.html' + + # Initial amount allocated to each player + endowment = c(100) + multiplier = 3 + + dgm1 = {0: [40, 3, 1], 1: [40, 1, 3], 2: [60, 2, 1], 3: [60, 1, 2], + 4: [75, 2, 1], 5: [75, 1, 2], 6: [60, 1, 1], 7: [100, 1, 1]} + + dgm2 = {7: [40, 3, 1], 6: [40, 1, 3], 5: [60, 2, 1], 4: [60, 1, 2], + 3: [75, 2, 1], 2: [75, 1, 2], 1: [60, 1, 1], 0: [100, 1, 1]} + + dgm3 = {0: [40, 3, 1], 2: [40, 1, 3], 1: [60, 2, 1], 4: [60, 1, 2], + 3: [75, 2, 1], 6: [75, 1, 2], 5: [60, 1, 1], 7: [100, 1, 1]} + + dgm4 = {5: [40, 3, 1], 6: [40, 1, 3], 7: [60, 2, 1], 0: [60, 1, 2], + 1: [75, 2, 1], 2: [75, 1, 2], 3: [60, 1, 1], 4: [100, 1, 1]} + + dgm5 = {4: [40, 3, 1], 1: [40, 1, 3], 6: [60, 2, 1], 3: [60, 1, 2], + 0: [75, 2, 1], 5: [75, 1, 2], 2: [60, 1, 1], 7: [100, 1, 1]} + + + +class Subsession(BaseSubsession): + def creating_session(subsession): + # Random Matching + subsession.group_randomly() + +class Group(BaseGroup): + dot1 = models.IntegerField() + s1 = models.IntegerField() + g1 = models.IntegerField() + send1 = models.IntegerField() + send2 = models.IntegerField() + keep1 = models.IntegerField() + keep2 = models.IntegerField() + roundselect = models.IntegerField() + def dict_dgm(self): + if self.id_in_subsession == 1 or self.id_in_subsession == 6 or self.id_in_subsession == 11: + self.dot1 = Constants.dgm1[self.round_number-1][0] + self.s1 = Constants.dgm1[self.round_number-1][1] + self.g1 = Constants.dgm1[self.round_number-1][2] + elif self.id_in_subsession == 2 or self.id_in_subsession == 7 or self.id_in_subsession == 12: + self.dot1 = Constants.dgm2[self.round_number-1][0] + self.s1 = Constants.dgm2[self.round_number-1][1] + self.g1 = Constants.dgm2[self.round_number-1][2] + elif self.id_in_subsession == 3 or self.id_in_subsession == 8 or self.id_in_subsession == 13: + self.dot1 = Constants.dgm3[self.round_number-1][0] + self.s1 = Constants.dgm3[self.round_number-1][1] + self.g1 = Constants.dgm3[self.round_number-1][2] + elif self.id_in_subsession == 4 or self.id_in_subsession == 9 or self.id_in_subsession == 14: + self.dot1 = Constants.dgm4[self.round_number-1][0] + self.s1 = Constants.dgm4[self.round_number-1][1] + self.g1 = Constants.dgm4[self.round_number-1][2] + elif self.id_in_subsession == 5 or self.id_in_subsession == 10 or self.id_in_subsession == 15: + self.dot1 = Constants.dgm5[self.round_number-1][0] + self.s1 = Constants.dgm5[self.round_number-1][1] + self.g1 = Constants.dgm5[self.round_number-1][2] + sent_amount = models.CurrencyField( + min=0, max=Constants.endowment, doc="""Amount sent by P1""" + ) + + sent_back_amount = models.CurrencyField(doc="""Amount sent back by P2""", min=c(0)) + + def sent_back_amount_max(self): + return self.sent_amount * Constants.multiplier + + def set_payoffs(self): + p1 = self.get_player_by_id(1) + p2 = self.get_player_by_id(2) + + self.send1 = p1.sent_amount + self.send2 = p2.sent_amount + self.keep1 = p1.keep_amount + self.keep2 = p2.keep_amount + + if self.round_number == 8: + self.roundselect = random.randint(1, 8) + if p1.dictator == 1: + p1.gain_dgm = 23 + p2.gain_dgm = 25 + else: + p1.gain_dgm = 233 + p2.gain_dgm = 255 + + + # p1.payoff = self.keep1 * self.s1 + # p2.payoff = self.send1 * self.g1 + # + # p1.payoff = Constants.endowment - self.sent_amount + self.sent_back_amount + # p2.payoff = self.sent_amount * Constants.multiplier - self.sent_back_amount + +class Player(BasePlayer): + def role(self): + if self.id_in_group == 1: + return 'dictator1' + if self.id_in_group == 2: + return 'dictator2' + role1 = models.StringField() + dictator = models.IntegerField() + r1 = models.IntegerField( + blank=False + ) + r2 = models.IntegerField( + blank=False + ) + r3 = models.IntegerField( + blank=False + ) + r4 = models.IntegerField( + blank=False + ) + keep_amount = models.IntegerField( + blank=False, doc="""Vous gardez""" ) + sent_amount = models.IntegerField( + blank=False, doc="""Vous donnez""") + gain_dgm = models.IntegerField() + + + diff --git a/dictator_modif/pages.py b/dictator_modif/pages.py new file mode 100644 index 0000000..9116033 --- /dev/null +++ b/dictator_modif/pages.py @@ -0,0 +1,89 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants +import random + +class Introduction(Page): + form_model = 'player' + form_fields = ['r1','r2','r3','r4'] + + def is_displayed(self): + return self.round_number == 1 + + def error_message(self, values): + print('values is', values) + if values['r1'] != 98: + return 'Merci de corriger votre réponse 1 !!' + elif values['r2'] != 2: + return 'Merci de corriger votre réponse 2 !!' + elif values['r3'] != 5: + return 'Merci de corriger votre réponse 3 !!' + elif values['r4'] != 110: + return 'Merci de corriger votre réponse 4 !!' + + def before_next_page(self): + if self.player.id_in_group == 1: + self.player.role1 = 'dictator' + self.player.dictator = 1 + else: + self.player.role1 = 'receiver' + self.player.dictator = 0 + self.player.participant.vars['role1'] = self.player.role1 + self.player.participant.vars['dictator'] = self.player.dictator + if self.round_number >1: + self.player.role1 = self.player.participant.vars['role1'] + + +class InstructionsWaitPage(WaitPage): + after_all_players_arrive = 'dict_dgm' + +class Send(Page): + """comment + """ + form_model = 'player' + form_fields = ['keep_amount', 'sent_amount'] + + # def is_displayed(self): + # return self.player.id_in_group == 1 + + def vars_for_template(player): + group = player.group + return dict( + dot1 = group.dot1, + s1 = group.s1, + g1 = group.g1, + round = group.round_number, + ) + + def before_next_page(self): + if self.round_number >1: + self.player.role1 = self.player.participant.vars['role1'] + self.player.dictator = self.player.participant.vars['dictator'] + # if self.round_number == 1: + # self.player.participant.vars['dot1'] = self.group.dot1 + # self.player.participant.vars['s1'] = self.group.s1 + # self.player.participant.vars['g1'] = self.group.g1 + # self.player.participant.vars['keep1'] = self.group.keep1 + # self.player.participant.vars['send1'] = self.group.send1 + # self.player.participant.vars['keep2'] = self.group.keep2 + # self.player.participant.vars['send2'] = self.group.send2 + + + +class ResultsWaitPage(WaitPage): + after_all_players_arrive = 'set_payoffs' + +class Results(Page): + def is_displayed(self): + return self.round_number == 1 + + +page_sequence = [ + Introduction, + InstructionsWaitPage, + Send, + ResultsWaitPage, + Results, +] + + diff --git a/dictator_modif/templates/dictator_modif/Introduction.html b/dictator_modif/templates/dictator_modif/Introduction.html new file mode 100644 index 0000000..671d5d6 --- /dev/null +++ b/dictator_modif/templates/dictator_modif/Introduction.html @@ -0,0 +1,27 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Modified Dictator Game +{% endblock %} + +{% block content %} + + {% include Constants.instructions_template %} + +
-------------------------
+ +

+

Test de compréhension

+ +
Q1. Si vous êtes nommé « dictateur », que votre montant de départ est 100 ECU, que S = 1 et G = 1, et que vous choisissez de donner 2 à votre partenaire, quel est votre gain ? Celui de votre partenaire ? + +
{% formfield player.r1 label = "Vous gagnez (ECUs) "%} + {% formfield player.r2 label = "Votre partenaire gagne (ECUs)"%} +
Q2. Si vous n’êtes pas nommé « dictateur », et que le montant de départ de votre partenaire est 60 ECU, que S = 2 et G = 1. Si votre partenaire décide de vous donner 5, quel est votre gain ? Celui de votre partenaire ? +
{% formfield player.r3 label = "Vous gagnez (ECUs) "%} + {% formfield player.r4 label = "Votre partenaire gagne (ECUs)"%} + + {% next_button %} + +{% endblock %} diff --git a/dictator_modif/templates/dictator_modif/Results.html b/dictator_modif/templates/dictator_modif/Results.html new file mode 100644 index 0000000..7b82a38 --- /dev/null +++ b/dictator_modif/templates/dictator_modif/Results.html @@ -0,0 +1,28 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Results +{% endblock %} + +{% block content %} + + {% if player.role == 'A' %} +

+ +

+

+

+ {% else %} +

+

+

+

+ . + {% endif %} + +

{% next_button %}

+ + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/dictator_modif/templates/dictator_modif/Send.html b/dictator_modif/templates/dictator_modif/Send.html new file mode 100644 index 0000000..4b33f68 --- /dev/null +++ b/dictator_modif/templates/dictator_modif/Send.html @@ -0,0 +1,32 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Votre choix - (Round: {{round}}) +{% endblock %} + +{% block content %} + + +

+ Votre montant de départ est de {{dot1}} ECUs. +
La valeur S est de {{s1}} : ce que vous gardez pour vous sera donc multiplié par {{s1}}. +
La valeur G est de {{g1}} : ce que vous donnez à votre partenaire sera donc multiplié par {{g1}}. + + +

+ +

Sur les {{dot1}} ECUs : + {% formfield group.keep_amount label="Vous gardez :" %} + + {% formfield group.sent_amount label="Vous donnez :" %} +

+ + +

+ {% next_button %} +

+ + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/dictator_modif/templates/dictator_modif/instructions.html b/dictator_modif/templates/dictator_modif/instructions.html new file mode 100644 index 0000000..b0863f1 --- /dev/null +++ b/dictator_modif/templates/dictator_modif/instructions.html @@ -0,0 +1,40 @@ +{% load otree %} + +
+
+ +

+ Instructions +

+

+Règles du jeu: +
À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante : +

1 ECU = 0.15 EUR
+
Ce jeu se déroule en 8 manches, et se joue avec l’un des autres participants à l’expérience, + que nous appellerons « votre partenaire ». + Votre partenaire est anonyme, et n’a aucun moyen de vous identifier non plus. +
Pour chacun de ces manches, vous disposez d’un montant de départ, en ECU. + Vous pouvez décider d’en remettre une partie à votre partenaire. + Vous choisirez donc deux montants : celui que vous donnez et celui que vous gardez. + La somme des montants que vous donnez et que vous gardez doit être égale au montant de départ. +
Lors de chaque round, une valeur G (« give ») sera attribuée aux ECUs que vous donnez, + et une valeur S (« self ») sera attribuée aux ECUs que vous gardez. + Ainsi, le montant que vous gardez sera multiplié par S, et celui que vous donnez sera multiplié par G. +
Votre partenaire joue au même jeu de son côté. +
A la fin du jeu, l’un des rounds sera choisi au hasard pour constituer votre gain, et l’un des deux joueurs sera aléatoirement nommé « dictateur ». +
Si vous êtes dictateur, votre gain final sera : +
Montant que vous avez choisi de garder x S
+
Et le gain final de votre partenaire sera :
+
Montant que vous avez choisi de donner x G
+ +
Si vous n’êtes pas nommé dictateur, votre gain final sera : +
Montant que votre partenaire a choisi de donner x G
+
Et le gain final de votre partenaire sera :
+
Montant que votre partenaire a choisi de garder x S
+ +

+ + +

+
+
\ No newline at end of file diff --git a/dictator_modif/tests.py b/dictator_modif/tests.py new file mode 100644 index 0000000..38e8d15 --- /dev/null +++ b/dictator_modif/tests.py @@ -0,0 +1,18 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants + + +class PlayerBot(Bot): + def play_round(self): + + yield (pages.Introduction) + + if self.player.id_in_group == 1: + yield (pages.Send, {"sent_amount": 4}) + + else: + yield (pages.SendBack, {'sent_back_amount': 8}) + + yield (pages.Results) diff --git a/dictator_modif_asso/__init__.py b/dictator_modif_asso/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dictator_modif_asso/_builtin/__init__.py b/dictator_modif_asso/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/dictator_modif_asso/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/dictator_modif_asso/models.py b/dictator_modif_asso/models.py new file mode 100644 index 0000000..6bbb490 --- /dev/null +++ b/dictator_modif_asso/models.py @@ -0,0 +1,175 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) +import random + + +doc = """ +Modified dictator game +""" + + +class Constants(BaseConstants): + name_in_url = 'dictator_modif_asso' + players_per_group = None + num_rounds = 8 + + instructions_template = 'dictator_modif_asso/instructions.html' + + exchangerate = 0.1 + + # Initial amount allocated to each player + #endowment = c(100) + #multiplier = 3 + + dgm1 = {1: [40, 3, 1], 2: [40, 1, 3], 3: [60, 2, 1], 4: [60, 1, 2], + 5: [75, 2, 1], 6: [75, 1, 2], 7: [60, 1, 1], 8: [100, 1, 1]} + + dgm2 = {8: [40, 3, 1], 7: [40, 1, 3], 6: [60, 2, 1], 5: [60, 1, 2], + 4: [75, 2, 1], 3: [75, 1, 2], 2: [60, 1, 1], 1: [100, 1, 1]} + + dgm3 = {8: [40, 3, 1], 2: [40, 1, 3], 1: [60, 2, 1], 4: [60, 1, 2], + 3: [75, 2, 1], 6: [75, 1, 2], 5: [60, 1, 1], 7: [100, 1, 1]} + + dgm4 = {5: [40, 3, 1], 6: [40, 1, 3], 7: [60, 2, 1], 8: [60, 1, 2], + 1: [75, 2, 1], 2: [75, 1, 2], 3: [60, 1, 1], 4: [100, 1, 1]} + + dgm5 = {4: [40, 3, 1], 1: [40, 1, 3], 6: [60, 2, 1], 3: [60, 1, 2], + 8: [75, 2, 1], 5: [75, 1, 2], 2: [60, 1, 1], 7: [100, 1, 1]} + + + +class Subsession(BaseSubsession): + pass + # def creating_session(subsession): + # # Random Matching + # subsession.group_randomly() + +class Group(BaseGroup): + pass + # dot1 = models.IntegerField() + # s1 = models.IntegerField() + # g1 = models.IntegerField() + # send1 = models.IntegerField() + # send2 = models.IntegerField() + # keep1 = models.IntegerField() + # keep2 = models.IntegerField() + # roundselect = models.IntegerField() + # def dict_dgm(self): + # if self.id_in_subsession == 1 or self.id_in_subsession == 6 or self.id_in_subsession == 11: + # self.dot1 = Constants.dgm1[self.round_number-1][0] + # self.s1 = Constants.dgm1[self.round_number-1][1] + # self.g1 = Constants.dgm1[self.round_number-1][2] + # elif self.id_in_subsession == 2 or self.id_in_subsession == 7 or self.id_in_subsession == 12: + # self.dot1 = Constants.dgm2[self.round_number-1][0] + # self.s1 = Constants.dgm2[self.round_number-1][1] + # self.g1 = Constants.dgm2[self.round_number-1][2] + # elif self.id_in_subsession == 3 or self.id_in_subsession == 8 or self.id_in_subsession == 13: + # self.dot1 = Constants.dgm3[self.round_number-1][0] + # self.s1 = Constants.dgm3[self.round_number-1][1] + # self.g1 = Constants.dgm3[self.round_number-1][2] + # elif self.id_in_subsession == 4 or self.id_in_subsession == 9 or self.id_in_subsession == 14: + # self.dot1 = Constants.dgm4[self.round_number-1][0] + # self.s1 = Constants.dgm4[self.round_number-1][1] + # self.g1 = Constants.dgm4[self.round_number-1][2] + # elif self.id_in_subsession == 5 or self.id_in_subsession == 10 or self.id_in_subsession == 15: + # self.dot1 = Constants.dgm5[self.round_number-1][0] + # self.s1 = Constants.dgm5[self.round_number-1][1] + # self.g1 = Constants.dgm5[self.round_number-1][2] + # sent_amount = models.CurrencyField( + # min=0, max=Constants.endowment, doc="""Amount sent by P1""" + # ) + # + # sent_back_amount = models.CurrencyField(doc="""Amount sent back by P2""", min=c(0)) + + def sent_back_amount_max(self): + return self.sent_amount * Constants.multiplier + + def set_payoffs(self): + p1 = self.get_player_by_id(1) + p2 = self.get_player_by_id(2) + + self.send1 = p1.sent_amount + self.send2 = p2.sent_amount + self.keep1 = p1.keep_amount + self.keep2 = p2.keep_amount + + if self.round_number == 8: + self.roundselect = random.randint(1, 8) + if p1.dictator == 1: + p1.gain_dgm = 23 + p2.gain_dgm = 25 + else: + p1.gain_dgm = 233 + p2.gain_dgm = 255 + + + # p1.payoff = self.keep1 * self.s1 + # p2.payoff = self.send1 * self.g1 + # + # p1.payoff = Constants.endowment - self.sent_amount + self.sent_back_amount + # p2.payoff = self.sent_amount * Constants.multiplier - self.sent_back_amount + +class Player(BasePlayer): + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + + + # def role(self): + # if self.id_in_group == 1: + # return 'dictator1' + # if self.id_in_group == 2: + # return 'dictator2' + # role1 = models.StringField() + # dictator = models.IntegerField() + dgm_selected = models.IntegerField() + round_selected = models.IntegerField() + + r1 = models.IntegerField( + blank=False + ) + r2 = models.IntegerField( + blank=False + ) + r3 = models.IntegerField( + blank=False + ) + r4 = models.IntegerField( + blank=False + ) + keep_amount = models.IntegerField( + blank=False, initial=0, doc="""Vous gardez""" ) + sent_amount = models.IntegerField( + blank=False, initial=0, doc="""Vous donnez""") + + dot1 = models.IntegerField() + s1 = models.IntegerField() + g1 = models.IntegerField() + + dot1_select = models.IntegerField() + s1_select = models.IntegerField() + g1_select = models.IntegerField() + keep_select = models.IntegerField() + sent_select = models.IntegerField() + + gain_dgm = models.IntegerField() + gain_asso = models.IntegerField() + + gain_dgm_eur = models.FloatField() + gain_asso_eur = models.FloatField() + + + + + + diff --git a/dictator_modif_asso/pages.py b/dictator_modif_asso/pages.py new file mode 100644 index 0000000..94ba7bd --- /dev/null +++ b/dictator_modif_asso/pages.py @@ -0,0 +1,153 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants +import random + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + # def is_displayed(self): + # return self.participant.vars['versionexp'] == 2 + + def is_displayed(self): + return self.round_number == 1 + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + 1 + self.player.participant.vars['game_num'] = self.player.game_num + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n = self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + +class Introduction(Page): + form_model = 'player' + form_fields = ['r1','r2','r3','r4'] + + def is_displayed(self): + return self.round_number == 1 + + def error_message(self, values): + print('values is', values) + if values['r1'] != 98: + return 'Merci de corriger votre réponse 1 !!' + elif values['r2'] != 2: + return 'Merci de corriger votre réponse 2 !!' + elif values['r3'] != 110: + return 'Merci de corriger votre réponse 3 !!' + elif values['r4'] != 5: + return 'Merci de corriger votre réponse 4 !!' + + def before_next_page(self): + # selection of random dotation/s/g and round to be paid + self.player.dgm_selected = random.randint(1, 5) + self.player.round_selected = random.randint(1, 8) + self.player.participant.vars['mdgasso_dgm_selected'] = self.player.dgm_selected + self.player.participant.vars['mdgasso_round_selected'] = self.player.round_selected + +class NextPage(Page): + form_model = 'player' + form_fields = [] + + def vars_for_template(self): + return dict( + round = self.round_number, + ) + + + def before_next_page(self): + self.player.dgm_selected = self.player.participant.vars['mdgasso_dgm_selected'] + self.player.round_selected =self.player.participant.vars['mdgasso_round_selected'] + self.player.dot1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][0] + self.player.s1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][1] + self.player.g1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][2] + +class Send(Page): + """comment + """ + form_model = 'player' + form_fields = ['keep_amount', 'sent_amount'] + + def error_message(self, values): + print('values is', values) + if values['keep_amount'] < 0: + return 'the amount must be positive ' + elif values['keep_amount'] > self.player.dot1 : + return f'please choose an amount less than {self.player.dot1}' + elif values['sent_amount'] < 0: + return 'the amount must be positive ' + elif values['sent_amount'] + values['keep_amount'] != self.player.dot1: + return f'the sum of the two amounts must be equal to {self.player.dot1}' + + + + + def vars_for_template(self): + return dict( + dot1 = self.player.dot1, + s1 = self.player.s1, + g1 = self.player.g1, + round = self.round_number, + game_num = self.player.participant.vars['game_num'] + ) + + def before_next_page(self): + self.player.participant.vars[f'dot1_r{self.round_number}'] = self.player.dot1 + self.player.participant.vars[f's1_r{self.round_number}'] = self.player.s1 + self.player.participant.vars[f'g1_r{self.round_number}'] = self.player.g1 + self.player.participant.vars[f'keep_r{self.round_number}'] = self.player.keep_amount + self.player.participant.vars[f'sent_r{self.round_number}'] = self.player.sent_amount + + if self.round_number == 8: + self.player.dot1_select = self.player.participant.vars[f'dot1_r{self.player.round_selected}'] + self.player.s1_select = self.player.participant.vars[f's1_r{self.player.round_selected}'] + self.player.g1_select = self.player.participant.vars[f'g1_r{self.player.round_selected}'] + self.player.keep_select = self.player.participant.vars[f'keep_r{self.player.round_selected}'] + self.player.sent_select = self.player.participant.vars[f'sent_r{self.player.round_selected}'] + self.player.gain_dgm = self.player.keep_select * self.player.s1_select + self.player.gain_asso = self.player.sent_select * self.player.g1_select + self.player.gain_dgm_eur = round(self.player.gain_dgm * Constants.exchangerate,1) + self.player.gain_asso_eur = round(self.player.gain_asso * Constants.exchangerate,1) + self.player.payoff = round(self.player.gain_dgm_eur,1) + + # to final page: + self.player.participant.vars['mdgasso_dot1_select'] = self.player.dot1_select + self.player.participant.vars['mdgasso_s1_select'] = self.player.s1_select + self.player.participant.vars['mdgasso_g1_select'] = self.player.g1_select + self.player.participant.vars['mdgasso_keep_select'] = self.player.keep_select + self.player.participant.vars['mdgasso_sent_select'] = self.player.sent_select + self.player.participant.vars['mdgasso_gain_dgm'] = self.player.gain_dgm + self.player.participant.vars['mdgasso_gain_asso'] = self.player.gain_asso + self.player.participant.vars['mdgasso_gain_dgm_eur'] = self.player.gain_dgm_eur + self.player.participant.vars['mdgasso_gain_asso_eur'] = self.player.gain_asso_eur + +class Results(Page): + def is_displayed(self): + return self.round_number == 8 + + def vars_for_template(self): + #group = player.group + return dict( + dot1_select = self.player.dot1_select, + s1_select = self.player.s1_select, + g1_select = self.player.g1_select, + round = self.round_number, + round_selected = self.player.round_selected, + keep_select = self.player.keep_select, + sent_select = self.player.sent_select, + gain_dgm = self.player.gain_dgm, + gain_asso = self.player.gain_asso, + gain_dgm_eur = self.player.gain_dgm_eur, + gain_asso_eur = self.player.gain_asso_eur, + + ) + +page_sequence = [ + Bienvenue, + Introduction, + NextPage, + Send, +] + + diff --git a/dictator_modif_asso/templates/dictator_modif_asso/Bienvenue.html b/dictator_modif_asso/templates/dictator_modif_asso/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/dictator_modif_asso/templates/dictator_modif_asso/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/dictator_modif_asso/templates/dictator_modif_asso/Introduction.html b/dictator_modif_asso/templates/dictator_modif_asso/Introduction.html new file mode 100644 index 0000000..a3121d0 --- /dev/null +++ b/dictator_modif_asso/templates/dictator_modif_asso/Introduction.html @@ -0,0 +1,30 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{player.game_num}} +{% endblock %} + +{% block content %} + + {% include Constants.instructions_template %} + +
-------------------------
+ +

+

Comprehension questionnaire

+ +
Q1. If your starting amount is 100 POINTs, S = 1 and G = 1, and you choose to give 2 +to the association: +
{% formfield player.r1 label = "Your gain is (in POINTs)"%} + {% formfield player.r2 label = "You donate to the association (in POINTs)"%} + +
Q2. If your starting amount is 60 POINTs, S = 2 and G = 1, and you choose to give 5 +to the association: + +
{% formfield player.r3 label = "Your gain is (in POINTs) "%} + {% formfield player.r4 label = "You donate to the association (in POINTs)"%} + + {% next_button %} + +{% endblock %} diff --git a/dictator_modif_asso/templates/dictator_modif_asso/NextPage.html b/dictator_modif_asso/templates/dictator_modif_asso/NextPage.html new file mode 100644 index 0000000..87ef5f9 --- /dev/null +++ b/dictator_modif_asso/templates/dictator_modif_asso/NextPage.html @@ -0,0 +1,23 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Round: {{round}} +{% endblock %} + +{% block content %} + + {% if round == 1 %} +

Start the first round

+ {% else %} + +

Go to the next round

+ + {% endif %} + + + +

{% next_button %}

+ + +{% endblock %} diff --git a/dictator_modif_asso/templates/dictator_modif_asso/Results.html b/dictator_modif_asso/templates/dictator_modif_asso/Results.html new file mode 100644 index 0000000..7d5154d --- /dev/null +++ b/dictator_modif_asso/templates/dictator_modif_asso/Results.html @@ -0,0 +1,30 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Results +{% endblock %} + +{% block content %} +

+ +

+ The randomly selected round is: {{round_selected}} +
Your endowment during this round was {{dot1_select}} ECUs. +
The value of S was {{s1_select}}. +
The value of G was {{g1_select}}. +

You chose to keep {{keep_select}} POINTs and give {{sent_select}} POINTs to the organization. +

Your gain is {{gain_dgm}} POINTs ({{gain_dgm_eur}} EUROs). +
The organization's gain is {{gain_asso}} POINTs ({{gain_asso_eur}} EUROs). +

+

+

+

+

+

+ +

{% next_button %}

+ + {% include Constants.instructions_template %} + +{% endblock %} \ No newline at end of file diff --git a/dictator_modif_asso/templates/dictator_modif_asso/Send.html b/dictator_modif_asso/templates/dictator_modif_asso/Send.html new file mode 100644 index 0000000..475c242 --- /dev/null +++ b/dictator_modif_asso/templates/dictator_modif_asso/Send.html @@ -0,0 +1,32 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{game_num}} - Your Choice - (Round: {{round}}) +{% endblock %} + +{% block content %} + + +

+ Your starting amount is {{dot1}} POINTs. +
The value S is {{s1}}: what you keep for yourself will therefore be multiplied by {{s1}}. +
The value G is {{g1}}: what you give to your partner will therefore be multiplied by {{g1}}. + + +

+ +

Out of the {{dot1}} POINTs: + {% formfield group.keep_amount label="You keep:" %} + + {% formfield group.sent_amount label="You give to the association:" %} +

+ + +

+ {% next_button %} +

+ + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/dictator_modif_asso/templates/dictator_modif_asso/instructions.html b/dictator_modif_asso/templates/dictator_modif_asso/instructions.html new file mode 100644 index 0000000..a8a702c --- /dev/null +++ b/dictator_modif_asso/templates/dictator_modif_asso/instructions.html @@ -0,0 +1,56 @@ +{% load otree %} + +
+
+ +

+ Instructions +

+

+Game Rule: This game consists of 8 rounds. +
At the end of the game, the POINTS you have earned will be converted to € according to the following rule: + +

The exchange rate for this game is (1 POINT = 0.1 EUROS)

+
For each of these rounds, you have a starting amount in POINTs. + You can choose to give some to a non-profit organization Agir pour l'Environnement + working for environmental protection. + So you will choose two amounts: one that you give and one that you keep. The sum of the amounts you give and the amounts you keep must be equal to the starting amount. +
During each round, a value G ("give") will be assigned to the POINTs you give, + and a value S ("self") will be assigned to the POINTs you keep. Thus, the amount you keep will be multiplied by S, and the one you give will be multiplied by G. +
Your final gain will be: +
Amount you chose to keep x S
+
And the final amount given to the organization Agir pour l'Environnement will be: +
Amount you chose to give x G
+
At the end of the game, one of the rounds will be randomly chosen to determine your gain, and the amount given to the organization "Agir pour l'Environnement". + +

+ + +

+
-------------------------
+

+ Presentation of the Agir pour l'Environnement association: +
Agir pour l'Environnement is a citizens' organisation working for a livable planet. + The association puts pressure on politicians and economic decision-makers by conducting campaigns + that bring together a wide network of associations and citizens. + In order to maintain its independence of action, the association refuses all funding from + the public authorities.
+ + + + + Link to Agir pour l'environnement + + +

You can visit the Agir pour l'Environnement website by clicking the link below:

+ Agir pour l'environnement + + + + +

+ + + +
+
\ No newline at end of file diff --git a/dictator_modif_asso/tests.py b/dictator_modif_asso/tests.py new file mode 100644 index 0000000..1561ef2 --- /dev/null +++ b/dictator_modif_asso/tests.py @@ -0,0 +1,38 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants +import random + +class PlayerBot(Bot): + def play_round(self): + + + + + if self.round_number == 1: + yield (pages.Bienvenue) + yield (pages.Introduction, { + "r1": 98, + "r2":2, + "r3":110, + "r4":5, + }) + + yield (pages.NextPage, { + }) + + keep_amount = random.randint(0, self.player.dot1) + sent_amount = self.player.dot1 - keep_amount + + yield (pages.Send, { + "keep_amount": keep_amount, + "sent_amount": sent_amount, + }) + # if self.round_number == 8: + # yield (pages.Results, { + # }) + + + #if self.player.id_in_group == 1: + diff --git a/dictator_modif_class/__init__.py b/dictator_modif_class/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dictator_modif_class/_builtin/__init__.py b/dictator_modif_class/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/dictator_modif_class/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/dictator_modif_class/models.py b/dictator_modif_class/models.py new file mode 100644 index 0000000..440ecd4 --- /dev/null +++ b/dictator_modif_class/models.py @@ -0,0 +1,175 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) +import random + + +doc = """ +Modified dictator game +""" + + +class Constants(BaseConstants): + name_in_url = 'dictator_modif_class' + players_per_group = None + num_rounds = 8 + + instructions_template = 'dictator_modif_class/instructions.html' + + exchangerate = 0.1 + + # Initial amount allocated to each player + #endowment = c(100) + #multiplier = 3 + + dgm1 = {1: [40, 3, 1], 2: [40, 1, 3], 3: [60, 2, 1], 4: [60, 1, 2], + 5: [75, 2, 1], 6: [75, 1, 2], 7: [60, 1, 1], 8: [100, 1, 1]} + + dgm2 = {8: [40, 3, 1], 7: [40, 1, 3], 6: [60, 2, 1], 5: [60, 1, 2], + 4: [75, 2, 1], 3: [75, 1, 2], 2: [60, 1, 1], 1: [100, 1, 1]} + + dgm3 = {8: [40, 3, 1], 2: [40, 1, 3], 1: [60, 2, 1], 4: [60, 1, 2], + 3: [75, 2, 1], 6: [75, 1, 2], 5: [60, 1, 1], 7: [100, 1, 1]} + + dgm4 = {5: [40, 3, 1], 6: [40, 1, 3], 7: [60, 2, 1], 8: [60, 1, 2], + 1: [75, 2, 1], 2: [75, 1, 2], 3: [60, 1, 1], 4: [100, 1, 1]} + + dgm5 = {4: [40, 3, 1], 1: [40, 1, 3], 6: [60, 2, 1], 3: [60, 1, 2], + 8: [75, 2, 1], 5: [75, 1, 2], 2: [60, 1, 1], 7: [100, 1, 1]} + + + +class Subsession(BaseSubsession): + pass + # def creating_session(subsession): + # # Random Matching + # subsession.group_randomly() + +class Group(BaseGroup): + pass + # dot1 = models.IntegerField() + # s1 = models.IntegerField() + # g1 = models.IntegerField() + # send1 = models.IntegerField() + # send2 = models.IntegerField() + # keep1 = models.IntegerField() + # keep2 = models.IntegerField() + # roundselect = models.IntegerField() + # def dict_dgm(self): + # if self.id_in_subsession == 1 or self.id_in_subsession == 6 or self.id_in_subsession == 11: + # self.dot1 = Constants.dgm1[self.round_number-1][0] + # self.s1 = Constants.dgm1[self.round_number-1][1] + # self.g1 = Constants.dgm1[self.round_number-1][2] + # elif self.id_in_subsession == 2 or self.id_in_subsession == 7 or self.id_in_subsession == 12: + # self.dot1 = Constants.dgm2[self.round_number-1][0] + # self.s1 = Constants.dgm2[self.round_number-1][1] + # self.g1 = Constants.dgm2[self.round_number-1][2] + # elif self.id_in_subsession == 3 or self.id_in_subsession == 8 or self.id_in_subsession == 13: + # self.dot1 = Constants.dgm3[self.round_number-1][0] + # self.s1 = Constants.dgm3[self.round_number-1][1] + # self.g1 = Constants.dgm3[self.round_number-1][2] + # elif self.id_in_subsession == 4 or self.id_in_subsession == 9 or self.id_in_subsession == 14: + # self.dot1 = Constants.dgm4[self.round_number-1][0] + # self.s1 = Constants.dgm4[self.round_number-1][1] + # self.g1 = Constants.dgm4[self.round_number-1][2] + # elif self.id_in_subsession == 5 or self.id_in_subsession == 10 or self.id_in_subsession == 15: + # self.dot1 = Constants.dgm5[self.round_number-1][0] + # self.s1 = Constants.dgm5[self.round_number-1][1] + # self.g1 = Constants.dgm5[self.round_number-1][2] + # sent_amount = models.CurrencyField( + # min=0, max=Constants.endowment, doc="""Amount sent by P1""" + # ) + # + # sent_back_amount = models.CurrencyField(doc="""Amount sent back by P2""", min=c(0)) + + def sent_back_amount_max(self): + return self.sent_amount * Constants.multiplier + + def set_payoffs(self): + p1 = self.get_player_by_id(1) + p2 = self.get_player_by_id(2) + + self.send1 = p1.sent_amount + self.send2 = p2.sent_amount + self.keep1 = p1.keep_amount + self.keep2 = p2.keep_amount + + if self.round_number == 8: + self.roundselect = random.randint(1, 8) + if p1.dictator == 1: + p1.gain_dgm = 23 + p2.gain_dgm = 25 + else: + p1.gain_dgm = 233 + p2.gain_dgm = 255 + + + # p1.payoff = self.keep1 * self.s1 + # p2.payoff = self.send1 * self.g1 + # + # p1.payoff = Constants.endowment - self.sent_amount + self.sent_back_amount + # p2.payoff = self.sent_amount * Constants.multiplier - self.sent_back_amount + +class Player(BasePlayer): + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + + + # def role(self): + # if self.id_in_group == 1: + # return 'dictator1' + # if self.id_in_group == 2: + # return 'dictator2' + # role1 = models.StringField() + # dictator = models.IntegerField() + dgm_selected = models.IntegerField() + round_selected = models.IntegerField() + + r1 = models.IntegerField( + blank=False + ) + r2 = models.IntegerField( + blank=False + ) + r3 = models.IntegerField( + blank=False + ) + r4 = models.IntegerField( + blank=False + ) + keep_amount = models.IntegerField( + blank=False, initial=0, doc="""Vous gardez""" ) + sent_amount = models.IntegerField( + blank=False, initial=0, doc="""Vous donnez""") + + dot1 = models.IntegerField() + s1 = models.IntegerField() + g1 = models.IntegerField() + + dot1_select = models.IntegerField() + s1_select = models.IntegerField() + g1_select = models.IntegerField() + keep_select = models.IntegerField() + sent_select = models.IntegerField() + + gain_dgm = models.IntegerField() + gain_joueur2 = models.IntegerField() + + gain_dgm_eur = models.FloatField() + gain_joueur2_eur = models.FloatField() + + + + + + diff --git a/dictator_modif_class/pages.py b/dictator_modif_class/pages.py new file mode 100644 index 0000000..b962a8a --- /dev/null +++ b/dictator_modif_class/pages.py @@ -0,0 +1,161 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants +import random + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.round_number == 1 and self.player.participant.vars['app_sequence_select'] % 2 == 1 + + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + 1 + self.player.participant.vars['game_num'] = self.player.game_num + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n = self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + +class Introduction(Page): + form_model = 'player' + form_fields = ['r1','r2','r3','r4'] + + def is_displayed(self): + return self.round_number == 1 and self.player.participant.vars['app_sequence_select'] % 2 == 1 + + + def error_message(self, values): + print('values is', values) + if values['r1'] != 98: + return 'Please correct your answer 1 !!' + elif values['r2'] != 2: + return 'Please correct your answer 2 !!' + elif values['r3'] != 5: + return 'Please correct your answer 3 !!' + elif values['r4'] != 110: + return 'Please correct your answer 4 !!' + + def before_next_page(self): + # selection of random dotation/s/g and round to be paid + self.player.dgm_selected = random.randint(1, 5) + self.player.round_selected = random.randint(1, 8) + self.player.participant.vars['mdgclass_dgm_selected'] = self.player.dgm_selected + self.player.participant.vars['mdgclass_round_selected'] = self.player.round_selected + +class NextPage(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] % 2 == 1 + + + def vars_for_template(self): + return dict( + round = self.round_number, + ) + + + def before_next_page(self): + self.player.dgm_selected = self.player.participant.vars['mdgclass_dgm_selected'] + self.player.round_selected =self.player.participant.vars['mdgclass_round_selected'] + self.player.dot1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][0] + self.player.s1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][1] + self.player.g1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][2] + +class Send(Page): + """comment + """ + form_model = 'player' + form_fields = ['keep_amount', 'sent_amount'] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] % 2 == 1 + + + def error_message(self, values): + print('values is', values) + if values['keep_amount'] < 0: + return 'the amount must be positive ' + elif values['keep_amount'] > self.player.dot1 : + return f'please choose an amount less than {self.player.dot1}' + elif values['sent_amount'] < 0: + return 'the amount must be positive ' + elif values['sent_amount'] + values['keep_amount'] != self.player.dot1: + return f'the sum of the two amounts must be equal to {self.player.dot1}' + + + + + def vars_for_template(self): + return dict( + dot1 = self.player.dot1, + s1 = self.player.s1, + g1 = self.player.g1, + round = self.round_number, + game_num=self.player.participant.vars['game_num'] + + ) + + def before_next_page(self): + self.player.participant.vars[f'dot1_r{self.round_number}'] = self.player.dot1 + self.player.participant.vars[f's1_r{self.round_number}'] = self.player.s1 + self.player.participant.vars[f'g1_r{self.round_number}'] = self.player.g1 + self.player.participant.vars[f'keep_r{self.round_number}'] = self.player.keep_amount + self.player.participant.vars[f'sent_r{self.round_number}'] = self.player.sent_amount + + if self.round_number == 8: + self.player.dot1_select = self.player.participant.vars[f'dot1_r{self.player.round_selected}'] + self.player.s1_select = self.player.participant.vars[f's1_r{self.player.round_selected}'] + self.player.g1_select = self.player.participant.vars[f'g1_r{self.player.round_selected}'] + self.player.keep_select = self.player.participant.vars[f'keep_r{self.player.round_selected}'] + self.player.sent_select = self.player.participant.vars[f'sent_r{self.player.round_selected}'] + self.player.gain_dgm = self.player.keep_select * self.player.s1_select + self.player.gain_joueur2 = self.player.sent_select * self.player.g1_select + self.player.gain_dgm_eur = round(self.player.gain_dgm * Constants.exchangerate,1) + self.player.gain_joueur2_eur = round(self.player.gain_joueur2 * Constants.exchangerate,1) + self.player.payoff = round(self.player.gain_dgm_eur,1) + + # to final page: + self.player.participant.vars['mdgclass_dot1_select'] = self.player.dot1_select + self.player.participant.vars['mdgclass_s1_select'] = self.player.s1_select + self.player.participant.vars['mdgclass_g1_select'] = self.player.g1_select + self.player.participant.vars['mdgclass_keep_select'] = self.player.keep_select + self.player.participant.vars['mdgclass_sent_select'] = self.player.sent_select + self.player.participant.vars['mdgclass_gain_dgm'] = self.player.gain_dgm + self.player.participant.vars['mdgclass_gain_joueur2'] = self.player.gain_joueur2 + self.player.participant.vars['mdgclass_gain_dgm_eur'] = self.player.gain_dgm_eur + self.player.participant.vars['mdgclass_gain_joueur2_eur'] = self.player.gain_joueur2_eur + +class Results(Page): + def is_displayed(self): + return self.round_number == 8 and self.player.participant.vars['app_sequence_select'] % 2 == 1 + + + def vars_for_template(self): + #group = player.group + return dict( + dot1_select = self.player.dot1_select, + s1_select = self.player.s1_select, + g1_select = self.player.g1_select, + round = self.round_number, + round_selected = self.player.round_selected, + keep_select = self.player.keep_select, + sent_select = self.player.sent_select, + gain_dgm = self.player.gain_dgm, + gain_joueur2 = self.player.gain_joueur2, + gain_dgm_eur = self.player.gain_dgm_eur, + gain_joueur2_eur = self.player.gain_joueur2_eur, + + ) + +page_sequence = [ + Bienvenue, + Introduction, + NextPage, + Send, +] + + diff --git a/dictator_modif_class/templates/dictator_modif_class/Bienvenue.html b/dictator_modif_class/templates/dictator_modif_class/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/dictator_modif_class/templates/dictator_modif_class/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/dictator_modif_class/templates/dictator_modif_class/Introduction.html b/dictator_modif_class/templates/dictator_modif_class/Introduction.html new file mode 100644 index 0000000..633e4c3 --- /dev/null +++ b/dictator_modif_class/templates/dictator_modif_class/Introduction.html @@ -0,0 +1,30 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{player.game_num}} +{% endblock %} + +{% block content %} + + {% include Constants.instructions_template %} + +
-------------------------
+ +

+

Comprehension Test

+ +
Q1. If you are named "dictator" (player 1), your starting amount is 100 POINTs, +S = 1, G = 1, and you choose to give 2 to your partner (player 2), what is your payoff? What about your partner's? + +
{% formfield player.r1 label = "You gain (POINTs) "%} + {% formfield player.r2 label = "Your partner gains (POINTs)"%} +
Q2. If you are not named "dictator" (player 2), and your partner's (player 1) starting +amount is 60 POINTs, S = 2, and G = 1. If your partner decides to give you 5, +what is your payoff? What about your partner's? +
{% formfield player.r3 label = "You gain (POINTs) "%} + {% formfield player.r4 label = "Your partner gains (POINTs)"%} + + {% next_button %} + +{% endblock %} diff --git a/dictator_modif_class/templates/dictator_modif_class/NextPage.html b/dictator_modif_class/templates/dictator_modif_class/NextPage.html new file mode 100644 index 0000000..87ef5f9 --- /dev/null +++ b/dictator_modif_class/templates/dictator_modif_class/NextPage.html @@ -0,0 +1,23 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Round: {{round}} +{% endblock %} + +{% block content %} + + {% if round == 1 %} +

Start the first round

+ {% else %} + +

Go to the next round

+ + {% endif %} + + + +

{% next_button %}

+ + +{% endblock %} diff --git a/dictator_modif_class/templates/dictator_modif_class/Results.html b/dictator_modif_class/templates/dictator_modif_class/Results.html new file mode 100644 index 0000000..e7d8392 --- /dev/null +++ b/dictator_modif_class/templates/dictator_modif_class/Results.html @@ -0,0 +1,30 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Results +{% endblock %} + +{% block content %} +

+ +

+ The randomly selected round is: {{round_selected}} +
Your endowment during this round was {{dot1_select}} ECUs. +
The value of S was {{s1_select}}. +
The value of G was {{g1_select}}. +

You chose to keep {{keep_select}} POINTs and give {{sent_select}} POINTs to player 2. +

Your gain is {{gain_dgm}} POINTs ({{gain_dgm_eur}} EUROs). +
The player 2 gain is {{gain_joueur2}} POINTs ({{gain_joueur2_eur}} EUROs). +

+

+

+

+

+

+ +

{% next_button %}

+ + {% include Constants.instructions_template %} + +{% endblock %} \ No newline at end of file diff --git a/dictator_modif_class/templates/dictator_modif_class/Send.html b/dictator_modif_class/templates/dictator_modif_class/Send.html new file mode 100644 index 0000000..23ffa29 --- /dev/null +++ b/dictator_modif_class/templates/dictator_modif_class/Send.html @@ -0,0 +1,32 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{game_num}} - Your Choice - (Round: {{round}}) +{% endblock %} + +{% block content %} + + +

+ Your starting amount is {{dot1}} POINTs. +
The value S is {{s1}}: what you keep for yourself will therefore be multiplied by {{s1}}. +
The value G is {{g1}}: what you give to your partner will therefore be multiplied by {{g1}}. + + +

+ +

Out of the {{dot1}} POINTs: + {% formfield group.keep_amount label="You keep:" %} + + {% formfield group.sent_amount label="You give to the other player:" %} +

+ + +

+ {% next_button %} +

+ + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/dictator_modif_class/templates/dictator_modif_class/instructions.html b/dictator_modif_class/templates/dictator_modif_class/instructions.html new file mode 100644 index 0000000..9b791ad --- /dev/null +++ b/dictator_modif_class/templates/dictator_modif_class/instructions.html @@ -0,0 +1,44 @@ +{% load otree %} + +
+
+ +

+ Instructions +

+

+Rules of the game: +
At the end of the game, the POINTs you have earned will be converted into € according to the following rule: + +

The exchange rate for this game is (1 POINT = 0.1 EUROS)

+ + +
This game consists of 8 rounds and is played with one of the other participants in the experiment, +whom we will refer to as "your partner." +Your partner is anonymous and has no means of identifying you either. +
For each of these rounds, you have a starting amount in POINT. +You can decide to give some of it to your partner. +Therefore, you will choose two amounts: one that you give and one that you keep. +The sum of the amounts you give and the amounts you keep must equal the starting amount. +
During each round, a value G ("give") will be assigned to the POINTs you give, +and a value S ("self") will be assigned to the POINTs you keep. +Thus, the amount you keep will be multiplied by S, and the amount you give will be multiplied by G. +
Your partner plays the same game on their side. +
At the end of the game, one round will be randomly chosen to determine your payoff, + and one of the two players will be randomly named the "dictator" (player1). +
-------------------------------------------
+ Case 1: +
If you are the dictator (player 1), your final payoff will be: +
Amount you chose to keep x S
+
And your partner's (player 2) final payoff will be: +
Amount you chose to give x G
+
-------------------------------------------
+ Case 2: +
If you are not named dictator (player 2), your final payoff will be: +
Amount your partner chose to give you x G
+
And your partner's (player 1) final payoff will be: +
Amount your partner chose to keep x S
+ +

+
+
\ No newline at end of file diff --git a/dictator_modif_class/tests.py b/dictator_modif_class/tests.py new file mode 100644 index 0000000..e2f947f --- /dev/null +++ b/dictator_modif_class/tests.py @@ -0,0 +1,35 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants +import random + +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['app_sequence_select'] % 2 == 1: + if self.round_number == 1: + yield (pages.Bienvenue) + yield (pages.Introduction, { + "r1": 98, + "r2":2, + "r3":5, + "r4":110, + }) + + yield (pages.NextPage, {}) + + keep_amount = random.randint(0, self.player.dot1) + sent_amount = self.player.dot1 - keep_amount + + yield (pages.Send, { + "keep_amount": keep_amount, + "sent_amount": sent_amount, + }) + # if self.round_number == 8: + # yield (pages.Results, { + # }) + + + #if self.player.id_in_group == 1: + diff --git a/dictator_modif_class_v2/__init__.py b/dictator_modif_class_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dictator_modif_class_v2/_builtin/__init__.py b/dictator_modif_class_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/dictator_modif_class_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/dictator_modif_class_v2/models.py b/dictator_modif_class_v2/models.py new file mode 100644 index 0000000..683699c --- /dev/null +++ b/dictator_modif_class_v2/models.py @@ -0,0 +1,175 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) +import random + + +doc = """ +Modified dictator game +""" + + +class Constants(BaseConstants): + name_in_url = 'dictator_modif_class_v2' + players_per_group = None + num_rounds = 8 + + instructions_template = 'dictator_modif_class_v2/instructions.html' + + exchangerate = 0.1 + + # Initial amount allocated to each player + #endowment = c(100) + #multiplier = 3 + + dgm1 = {1: [40, 3, 1], 2: [40, 1, 3], 3: [60, 2, 1], 4: [60, 1, 2], + 5: [75, 2, 1], 6: [75, 1, 2], 7: [60, 1, 1], 8: [100, 1, 1]} + + dgm2 = {8: [40, 3, 1], 7: [40, 1, 3], 6: [60, 2, 1], 5: [60, 1, 2], + 4: [75, 2, 1], 3: [75, 1, 2], 2: [60, 1, 1], 1: [100, 1, 1]} + + dgm3 = {8: [40, 3, 1], 2: [40, 1, 3], 1: [60, 2, 1], 4: [60, 1, 2], + 3: [75, 2, 1], 6: [75, 1, 2], 5: [60, 1, 1], 7: [100, 1, 1]} + + dgm4 = {5: [40, 3, 1], 6: [40, 1, 3], 7: [60, 2, 1], 8: [60, 1, 2], + 1: [75, 2, 1], 2: [75, 1, 2], 3: [60, 1, 1], 4: [100, 1, 1]} + + dgm5 = {4: [40, 3, 1], 1: [40, 1, 3], 6: [60, 2, 1], 3: [60, 1, 2], + 8: [75, 2, 1], 5: [75, 1, 2], 2: [60, 1, 1], 7: [100, 1, 1]} + + + +class Subsession(BaseSubsession): + pass + # def creating_session(subsession): + # # Random Matching + # subsession.group_randomly() + +class Group(BaseGroup): + pass + # dot1 = models.IntegerField() + # s1 = models.IntegerField() + # g1 = models.IntegerField() + # send1 = models.IntegerField() + # send2 = models.IntegerField() + # keep1 = models.IntegerField() + # keep2 = models.IntegerField() + # roundselect = models.IntegerField() + # def dict_dgm(self): + # if self.id_in_subsession == 1 or self.id_in_subsession == 6 or self.id_in_subsession == 11: + # self.dot1 = Constants.dgm1[self.round_number-1][0] + # self.s1 = Constants.dgm1[self.round_number-1][1] + # self.g1 = Constants.dgm1[self.round_number-1][2] + # elif self.id_in_subsession == 2 or self.id_in_subsession == 7 or self.id_in_subsession == 12: + # self.dot1 = Constants.dgm2[self.round_number-1][0] + # self.s1 = Constants.dgm2[self.round_number-1][1] + # self.g1 = Constants.dgm2[self.round_number-1][2] + # elif self.id_in_subsession == 3 or self.id_in_subsession == 8 or self.id_in_subsession == 13: + # self.dot1 = Constants.dgm3[self.round_number-1][0] + # self.s1 = Constants.dgm3[self.round_number-1][1] + # self.g1 = Constants.dgm3[self.round_number-1][2] + # elif self.id_in_subsession == 4 or self.id_in_subsession == 9 or self.id_in_subsession == 14: + # self.dot1 = Constants.dgm4[self.round_number-1][0] + # self.s1 = Constants.dgm4[self.round_number-1][1] + # self.g1 = Constants.dgm4[self.round_number-1][2] + # elif self.id_in_subsession == 5 or self.id_in_subsession == 10 or self.id_in_subsession == 15: + # self.dot1 = Constants.dgm5[self.round_number-1][0] + # self.s1 = Constants.dgm5[self.round_number-1][1] + # self.g1 = Constants.dgm5[self.round_number-1][2] + # sent_amount = models.CurrencyField( + # min=0, max=Constants.endowment, doc="""Amount sent by P1""" + # ) + # + # sent_back_amount = models.CurrencyField(doc="""Amount sent back by P2""", min=c(0)) + + def sent_back_amount_max(self): + return self.sent_amount * Constants.multiplier + + def set_payoffs(self): + p1 = self.get_player_by_id(1) + p2 = self.get_player_by_id(2) + + self.send1 = p1.sent_amount + self.send2 = p2.sent_amount + self.keep1 = p1.keep_amount + self.keep2 = p2.keep_amount + + if self.round_number == 8: + self.roundselect = random.randint(1, 8) + if p1.dictator == 1: + p1.gain_dgm = 23 + p2.gain_dgm = 25 + else: + p1.gain_dgm = 233 + p2.gain_dgm = 255 + + + # p1.payoff = self.keep1 * self.s1 + # p2.payoff = self.send1 * self.g1 + # + # p1.payoff = Constants.endowment - self.sent_amount + self.sent_back_amount + # p2.payoff = self.sent_amount * Constants.multiplier - self.sent_back_amount + +class Player(BasePlayer): + + game_num = models.IntegerField() + app_sequence_select = models.IntegerField() + app_sequence_select_n = models.StringField() + questionnaire_before = models.IntegerField() + + + # def role(self): + # if self.id_in_group == 1: + # return 'dictator1' + # if self.id_in_group == 2: + # return 'dictator2' + # role1 = models.StringField() + # dictator = models.IntegerField() + dgm_selected = models.IntegerField() + round_selected = models.IntegerField() + + r1 = models.IntegerField( + blank=False + ) + r2 = models.IntegerField( + blank=False + ) + r3 = models.IntegerField( + blank=False + ) + r4 = models.IntegerField( + blank=False + ) + keep_amount = models.IntegerField( + blank=False, initial=0, doc="""Vous gardez""" ) + sent_amount = models.IntegerField( + blank=False, initial=0, doc="""Vous donnez""") + + dot1 = models.IntegerField() + s1 = models.IntegerField() + g1 = models.IntegerField() + + dot1_select = models.IntegerField() + s1_select = models.IntegerField() + g1_select = models.IntegerField() + keep_select = models.IntegerField() + sent_select = models.IntegerField() + + gain_dgm = models.IntegerField() + gain_joueur2 = models.IntegerField() + + gain_dgm_eur = models.FloatField() + gain_joueur2_eur = models.FloatField() + + + + + + diff --git a/dictator_modif_class_v2/pages.py b/dictator_modif_class_v2/pages.py new file mode 100644 index 0000000..3627340 --- /dev/null +++ b/dictator_modif_class_v2/pages.py @@ -0,0 +1,156 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants +import random + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.round_number == 1 and self.player.participant.vars['app_sequence_select'] % 2 == 0 # 2 ou 4 + + def before_next_page(self): + self.player.game_num = self.player.participant.vars['game_num'] + 1 + self.player.participant.vars['game_num'] = self.player.game_num + self.player.app_sequence_select = self.player.participant.vars['app_sequence_select'] + self.player.app_sequence_select_n = self.player.participant.vars['app_sequence_select_n'] + self.player.questionnaire_before = self.player.participant.vars['questionnaire_before'] + + +class Introduction(Page): + form_model = 'player' + form_fields = ['r1','r2','r3','r4'] + + def is_displayed(self): + return self.round_number == 1 and self.player.participant.vars['app_sequence_select'] % 2 == 0 # 2 ou 4 + + def error_message(self, values): + print('values is', values) + if values['r1'] != 98: + return 'Please correct your answer 1 !!' + elif values['r2'] != 2: + return 'Please correct your answer 2 !!' + elif values['r3'] != 5: + return 'Please correct your answer 3 !!' + elif values['r4'] != 110: + return 'Please correct your answer 4 !!' + + def before_next_page(self): + # selection of random dotation/s/g and round to be paid + self.player.dgm_selected = random.randint(1, 5) + self.player.round_selected = random.randint(1, 8) + self.player.participant.vars['mdgclass_dgm_selected'] = self.player.dgm_selected + self.player.participant.vars['mdgclass_round_selected'] = self.player.round_selected + +class NextPage(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] % 2 == 0 # 2 ou 4 + + def vars_for_template(self): + return dict( + round = self.round_number, + ) + + + def before_next_page(self): + self.player.dgm_selected = self.player.participant.vars['mdgclass_dgm_selected'] + self.player.round_selected =self.player.participant.vars['mdgclass_round_selected'] + self.player.dot1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][0] + self.player.s1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][1] + self.player.g1 = getattr(Constants, f'dgm{self.player.dgm_selected}')[self.round_number][2] + +class Send(Page): + """comment + """ + form_model = 'player' + form_fields = ['keep_amount', 'sent_amount'] + + def is_displayed(self): + return self.player.participant.vars['app_sequence_select'] % 2 == 0 # 2 ou 4 + + def error_message(self, values): + print('values is', values) + if values['keep_amount'] < 0: + return 'the amount must be positive ' + elif values['keep_amount'] > self.player.dot1 : + return f'please choose an amount less than {self.player.dot1}' + elif values['sent_amount'] < 0: + return 'the amount must be positive ' + elif values['sent_amount'] + values['keep_amount'] != self.player.dot1: + return f'the sum of the two amounts must be equal to {self.player.dot1}' + + def vars_for_template(self): + return dict( + dot1 = self.player.dot1, + s1 = self.player.s1, + g1 = self.player.g1, + round = self.round_number, + game_num=self.player.participant.vars['game_num'] + + ) + + def before_next_page(self): + self.player.participant.vars[f'dot1_r{self.round_number}'] = self.player.dot1 + self.player.participant.vars[f's1_r{self.round_number}'] = self.player.s1 + self.player.participant.vars[f'g1_r{self.round_number}'] = self.player.g1 + self.player.participant.vars[f'keep_r{self.round_number}'] = self.player.keep_amount + self.player.participant.vars[f'sent_r{self.round_number}'] = self.player.sent_amount + + if self.round_number == 8: + self.player.dot1_select = self.player.participant.vars[f'dot1_r{self.player.round_selected}'] + self.player.s1_select = self.player.participant.vars[f's1_r{self.player.round_selected}'] + self.player.g1_select = self.player.participant.vars[f'g1_r{self.player.round_selected}'] + self.player.keep_select = self.player.participant.vars[f'keep_r{self.player.round_selected}'] + self.player.sent_select = self.player.participant.vars[f'sent_r{self.player.round_selected}'] + self.player.gain_dgm = self.player.keep_select * self.player.s1_select + self.player.gain_joueur2 = self.player.sent_select * self.player.g1_select + self.player.gain_dgm_eur = round(self.player.gain_dgm * Constants.exchangerate,1) + self.player.gain_joueur2_eur = round(self.player.gain_joueur2 * Constants.exchangerate,1) + self.player.payoff = round(self.player.gain_dgm_eur,1) + + # to final page: + self.player.participant.vars['mdgclass_dot1_select'] = self.player.dot1_select + self.player.participant.vars['mdgclass_s1_select'] = self.player.s1_select + self.player.participant.vars['mdgclass_g1_select'] = self.player.g1_select + self.player.participant.vars['mdgclass_keep_select'] = self.player.keep_select + self.player.participant.vars['mdgclass_sent_select'] = self.player.sent_select + self.player.participant.vars['mdgclass_gain_dgm'] = self.player.gain_dgm + self.player.participant.vars['mdgclass_gain_joueur2'] = self.player.gain_joueur2 + self.player.participant.vars['mdgclass_gain_dgm_eur'] = self.player.gain_dgm_eur + self.player.participant.vars['mdgclass_gain_joueur2_eur'] = self.player.gain_joueur2_eur + +class Results(Page): + def is_displayed(self): + return self.round_number == 8 and self.player.participant.vars['app_sequence_select'] % 2 == 0 + + def vars_for_template(self): + #group = player.group + return dict( + dot1_select = self.player.dot1_select, + s1_select = self.player.s1_select, + g1_select = self.player.g1_select, + round = self.round_number, + round_selected = self.player.round_selected, + keep_select = self.player.keep_select, + sent_select = self.player.sent_select, + gain_dgm = self.player.gain_dgm, + gain_joueur2 = self.player.gain_joueur2, + gain_dgm_eur = self.player.gain_dgm_eur, + gain_joueur2_eur = self.player.gain_joueur2_eur, + + ) + + + +page_sequence = [ + Bienvenue, + Introduction, + NextPage, + Send, +] + + diff --git a/dictator_modif_class_v2/templates/dictator_modif_class_v2/Bienvenue.html b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Bienvenue.html new file mode 100644 index 0000000..f4d112e --- /dev/null +++ b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Bienvenue.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% endblock %} + +{% block content %} + + +
+
+ + +

+

+ Please click on the "Next" button to go to the next step +

+ +

+ + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/dictator_modif_class_v2/templates/dictator_modif_class_v2/Introduction.html b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Introduction.html new file mode 100644 index 0000000..61a0d42 --- /dev/null +++ b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Introduction.html @@ -0,0 +1,30 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{player.game_num}} +{% endblock %} + +{% block content %} + + {% include Constants.instructions_template %} + +
-------------------------
+ +

+

Comprehension Test

+ +
Q1. If you are named "dictator", your starting amount is 100 POINTs, +S = 1, G = 1, and you choose to give 2 to your partner, what is your payoff? What about your partner's? + +
{% formfield player.r1 label = "You gain (POINTs) "%} + {% formfield player.r2 label = "Your partner gains (POINTs)"%} +
Q2. If you are not named "dictator", and your partner's starting +amount is 60 POINTs, S = 2, and G = 1. If your partner decides to give you 5, +what is your payoff? What about your partner's? +
{% formfield player.r3 label = "You gain (POINTs) "%} + {% formfield player.r4 label = "Your partner gains (POINTs)"%} + + {% next_button %} + +{% endblock %} diff --git a/dictator_modif_class_v2/templates/dictator_modif_class_v2/NextPage.html b/dictator_modif_class_v2/templates/dictator_modif_class_v2/NextPage.html new file mode 100644 index 0000000..87ef5f9 --- /dev/null +++ b/dictator_modif_class_v2/templates/dictator_modif_class_v2/NextPage.html @@ -0,0 +1,23 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Round: {{round}} +{% endblock %} + +{% block content %} + + {% if round == 1 %} +

Start the first round

+ {% else %} + +

Go to the next round

+ + {% endif %} + + + +

{% next_button %}

+ + +{% endblock %} diff --git a/dictator_modif_class_v2/templates/dictator_modif_class_v2/Results.html b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Results.html new file mode 100644 index 0000000..e7d8392 --- /dev/null +++ b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Results.html @@ -0,0 +1,30 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Results +{% endblock %} + +{% block content %} +

+ +

+ The randomly selected round is: {{round_selected}} +
Your endowment during this round was {{dot1_select}} ECUs. +
The value of S was {{s1_select}}. +
The value of G was {{g1_select}}. +

You chose to keep {{keep_select}} POINTs and give {{sent_select}} POINTs to player 2. +

Your gain is {{gain_dgm}} POINTs ({{gain_dgm_eur}} EUROs). +
The player 2 gain is {{gain_joueur2}} POINTs ({{gain_joueur2_eur}} EUROs). +

+

+

+

+

+

+ +

{% next_button %}

+ + {% include Constants.instructions_template %} + +{% endblock %} \ No newline at end of file diff --git a/dictator_modif_class_v2/templates/dictator_modif_class_v2/Send.html b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Send.html new file mode 100644 index 0000000..23ffa29 --- /dev/null +++ b/dictator_modif_class_v2/templates/dictator_modif_class_v2/Send.html @@ -0,0 +1,32 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game {{game_num}} - Your Choice - (Round: {{round}}) +{% endblock %} + +{% block content %} + + +

+ Your starting amount is {{dot1}} POINTs. +
The value S is {{s1}}: what you keep for yourself will therefore be multiplied by {{s1}}. +
The value G is {{g1}}: what you give to your partner will therefore be multiplied by {{g1}}. + + +

+ +

Out of the {{dot1}} POINTs: + {% formfield group.keep_amount label="You keep:" %} + + {% formfield group.sent_amount label="You give to the other player:" %} +

+ + +

+ {% next_button %} +

+ + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/dictator_modif_class_v2/templates/dictator_modif_class_v2/instructions.html b/dictator_modif_class_v2/templates/dictator_modif_class_v2/instructions.html new file mode 100644 index 0000000..9b791ad --- /dev/null +++ b/dictator_modif_class_v2/templates/dictator_modif_class_v2/instructions.html @@ -0,0 +1,44 @@ +{% load otree %} + +
+
+ +

+ Instructions +

+

+Rules of the game: +
At the end of the game, the POINTs you have earned will be converted into € according to the following rule: + +

The exchange rate for this game is (1 POINT = 0.1 EUROS)

+ + +
This game consists of 8 rounds and is played with one of the other participants in the experiment, +whom we will refer to as "your partner." +Your partner is anonymous and has no means of identifying you either. +
For each of these rounds, you have a starting amount in POINT. +You can decide to give some of it to your partner. +Therefore, you will choose two amounts: one that you give and one that you keep. +The sum of the amounts you give and the amounts you keep must equal the starting amount. +
During each round, a value G ("give") will be assigned to the POINTs you give, +and a value S ("self") will be assigned to the POINTs you keep. +Thus, the amount you keep will be multiplied by S, and the amount you give will be multiplied by G. +
Your partner plays the same game on their side. +
At the end of the game, one round will be randomly chosen to determine your payoff, + and one of the two players will be randomly named the "dictator" (player1). +
-------------------------------------------
+ Case 1: +
If you are the dictator (player 1), your final payoff will be: +
Amount you chose to keep x S
+
And your partner's (player 2) final payoff will be: +
Amount you chose to give x G
+
-------------------------------------------
+ Case 2: +
If you are not named dictator (player 2), your final payoff will be: +
Amount your partner chose to give you x G
+
And your partner's (player 1) final payoff will be: +
Amount your partner chose to keep x S
+ +

+
+
\ No newline at end of file diff --git a/dictator_modif_class_v2/tests.py b/dictator_modif_class_v2/tests.py new file mode 100644 index 0000000..c9f038a --- /dev/null +++ b/dictator_modif_class_v2/tests.py @@ -0,0 +1,35 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants +import random + +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['app_sequence_select'] % 2 == 0: + + if self.round_number == 1: + yield (pages.Bienvenue) + yield (pages.Introduction, { + "r1": 98, + "r2":2, + "r3":5, + "r4":110, + }) + + yield (pages.NextPage, {}) + + keep_amount = random.randint(0, self.player.dot1) + sent_amount = self.player.dot1 - keep_amount + yield (pages.Send, { + "keep_amount": keep_amount, + "sent_amount": sent_amount, + }) + # if self.round_number == 8: + # yield (pages.Results, { + # }) + + + #if self.player.id_in_group == 1: + diff --git a/exp_e4c_en_p1_quest/__init__.py b/exp_e4c_en_p1_quest/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_en_p1_quest/_builtin/__init__.py b/exp_e4c_en_p1_quest/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_en_p1_quest/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_en_p1_quest/models.py b/exp_e4c_en_p1_quest/models.py new file mode 100644 index 0000000..b5f0960 --- /dev/null +++ b/exp_e4c_en_p1_quest/models.py @@ -0,0 +1,789 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p1_quest' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + language = models.StringField() + + q_1 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + # q_6 = models.IntegerField( + # choices=[ + # [1, '1'], + # [2, '2'], + # [3, '3'], + # [4, '4'], + # [5, '5'], + # [6, '6'], + # ], + # widget=widgets.RadioSelectHorizontal, + # label="", + # blank=False + # ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drink coffee (or the) at school/work'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + # q_11 = models.IntegerField( + # choices=[ + # [1, '1 - Jamais'], + # [2, '2 - Rarement'], + # [3, '3 - Souvent'], + # [4, '4 - Toujours'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t use batteries'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) +################################################ page Questionnaire 1 + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_17 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_19 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_19_a = models.IntegerField( + label="", + blank=True + ) + + q_19_b = models.StringField( + label="", + blank=True + ) + + q_20 = models.IntegerField( + choices=[ + [1, 'a- Green (100% electric or hybrid) (€26 per ride)'], + [2, 'b- UberX (Economical, fast and reliable) (at €22 per ride) '], + [3, 'c- Comfort (spacious vehicles and top rated drivers) (at €30 per ride)'], + + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_21 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22_p2 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drive'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + +################################################# Page : Questionnaire2 + + q_24 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_26 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27_a = models.StringField( + label="If yes which one? ", + blank=True + ) + + q_28 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_29_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_30_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_31 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_32 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_33 = models.IntegerField( + choices=[ + [0, 'Yes'], + [1, 'No'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + +##################################### Page : Questionnaire3 + + q_34_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + + diff --git a/exp_e4c_en_p1_quest/pages.py b/exp_e4c_en_p1_quest/pages.py new file mode 100644 index 0000000..de65d7d --- /dev/null +++ b/exp_e4c_en_p1_quest/pages.py @@ -0,0 +1,92 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def before_next_page(self): + self.player.language = "EN" + self.player.participant.vars['language'] = self.player.language + + if self.player.id_in_group % 2 == 1: + self.player.treatment = 1 # gneezy - BinsWanger + else: + self.player.treatment = 2 # BinsWanger -gneezy + + self.player.participant.vars['treatment'] = self.player.treatment + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', + 'q_22', 'q_2_e_a', 'q_2_e_b', 'q_2_e_c', 'q_2_h', + 'q_3', 'q_4', 'q_5', 'q_6', + 'q_7', 'q_8', 'q_9', 'q_10', 'q_11', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_12', 'q_13', 'q_14', 'q_15', + 'q_16', 'q_17', 'q_18', + 'q_19', + 'q_19_a','q_19_b', 'q_20', + 'q_21', + 'q_22_p2', 'q_23', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_24', 'q_25', 'q_26', 'q_27', + 'q_27_a', 'q_28', + 'q_29_a', 'q_29_b', + 'q_29_c', 'q_29_d', + 'q_30_a', 'q_30_b', 'q_30_c', + 'q_30_d', 'q_30_e', 'q_30_f', + 'q_31', 'q_32', 'q_33' + + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Questionnaire3(Page): + form_model = 'player' + form_fields = [ 'q_34_a', 'q_34_b', 'q_34_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class QuestionnaireEnd(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + +page_sequence = [ + Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + Questionnaire3, + QuestionnaireEnd, + + +] diff --git a/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Bienvenue.html b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Bienvenue.html new file mode 100644 index 0000000..8a89a4d --- /dev/null +++ b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Bienvenue.html @@ -0,0 +1,60 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Experiment in economics +{% endblock %} + +{% block content %} + + +
+
+ +

Welcome

+ +

+ Thank you for agreeing to participate in this experience. A fixed remuneration (of 5 €) will be paid to you + at the end of the experience for your participation, regardless of your answers during + this experience. To this will be added variable compensation linked to your answers to the course + experience. +

+ +

+ + The experience lasts about 30 minutes. It consists of two types of tasks : questionnaires and games. + The variable remuneration that you will receive at the end of the experience will not depend on your answers to the questionnaires. + Indeed, in these questionnaires, there is neither right nor wrong answer. On the other hand, your variable remuneration will depend on the quality of your answers to the games. +Specifically, at the end of the experiment, only one of the games will be randomly selected to be paid for for real. +
The currency used in this experiment is the ECU. +

Exchange rate 1 ECU = {{ Constants.tauxchange}} €.
+ +
+ Important: All your answers will be treated anonymously. No one will be able + to directly identify your decisions. + + + + +

{% next_button %}

+ +
+ + + +{% endblock %} + diff --git a/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire0.html b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire0.html new file mode 100644 index 0000000..1217996 --- /dev/null +++ b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire0.html @@ -0,0 +1,228 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (1/4) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

+
+
+ +

+ 1) + Do you buy organic and / or ecological products? + + + {% formfield player.q_1 %} +

+ +
+

+ 2) For each of the following criteria, please indicate if it can influence your choice to buy a product: + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a. The price can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_a %} Strongly agree
b. The origin can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_b %} Strongly agree
c. The quality can influence your choices of products to buy
Strongly disagree {% formfield player.q_2_c %} Strongly agree
d. The taste (if it is a food product) can influence your choices of products to buy
Strongly disagree {% formfield player.q_22 %} Strongly agree
e. Label influence:
+           * The organic label can influence your choices of products to buy +
* Organic label: + An organic product is a product from organic farming (it is an agricultural production + method that excludes the use of most synthetic chemicals, toxic products, etc.). + There is a label (AB) in France that authenticates products from this method of + agriculture. +
        Strongly disagree {% formfield player.q_2_e_a %} Strongly agree
+           * The ecological label can influence your choices of products to buy +
* Ecological label: + An ecological product is a product that will be thought out, designed, + packaged, distributed, recycled in such a way as to minimize the impact on the environment. + It must comply with many rules related to these steps during specifications drawn up by + an organization such as ECOLABEL or ECOCERT. +An ecological product must be designed with maximum respect for the environment + (respect linked to the use of raw materials and machines during manufacture). + The life cycle of the product as well as its recycling are also important points + to consider. +
        Strongly disagree {% formfield player.q_2_e_b %} Strongly agree
+           * The equitable trade label can influence your choices of products to buy +
* Equitable trade label: + Equitable trade is a commercial and international partnership, based on concrete principles and launched + almost 20 years ago. Its objective is to be able to guarantee a better balance between + producers and resellers, by ensuring better working conditions and better remuneration + for small producers. +
        Strongly disagree {% formfield player.q_2_e_c %} Strongly agree
+

+           * + Other label can influence your choices of + products to buy (if yes, to indicate) + {% formfield player.q_2_h %} + +

+ +

+ 3) Do you shop online ? + {% formfield player.q_3 %} +

+ + +

+ 4) Do you shop clothes online? + {% formfield player.q_4 %} +

+ + + +

+ 5) + Do you agree that it is less + environmentally friendly to shop online rather than in-store? + + + + + + + + + +
Strongly disagree {% formfield player.q_5 %} Strongly agree
+

+ +

+ 6) Do you bring your own cup of coffee (tea) to school/work (instead of using the + cups from the coffee machine)? + {% formfield player.q_6 %} +

+ + +

+ 7) Do you sort your household waste? + {% formfield player.q_7 %} +

+ +

+ 8) Do you use a compost bin? + {% formfield player.q_8 %} +

+

+ 9) Do you collect and recycle used paper? + {% formfield player.q_9 %} +

+ +

+ 10) Do you reuse your shopping bags? + {% formfield player.q_10 %} +

+ +

+ 11) Do you return used batteries to appropriate recycling points? + {% formfield player.q_11 %} +

+ + + + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire1.html b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire1.html new file mode 100644 index 0000000..233f7ed --- /dev/null +++ b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire1.html @@ -0,0 +1,168 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (2/4) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

+
+
+ +

+ 12) When buying new electronic devices, do you make sure to buy the ones that use the least amount of energy? + {% formfield player.q_12 %} +

+ +

+ 13) Do you switch off or completely disconnect electrical devices when not in use (without using the + standby mode)? + {% formfield player.q_13 %} +

+ +

+ 14) Do you use a dryer for your clothes? + {% formfield player.q_14 %} +

+ +

+ 15) Do you wait until you have a full charge before doing your laundry? + {% formfield player.q_15 %} +

+ +

+ 16) Is the heating in your home turned off late at night between 1 am and 5 am (in winter)? + {% formfield player.q_16 %} +

+ +

+ 17) Do you reduce the room temperature when you are not at home for a long time (in winter)? + {% formfield player.q_17 %} +

+ +

+ 18) + You take a shower rather than a bath + + + {% formfield player.q_18 %} + +

+ + + +

19) Do you regularly defrost the fridge?

+ + 1 - Never
+
+

        a - Because I bought a frost free fridge on purpose
+         b - I share the refrigerator with other people and someone else is responsible for it
+         c - Other reason
+         (If other reason please specify) :
+ +

+

+ 2 - Rarely
+ 3 - Often
+ 4 - Always
+ +

+ + +

+ 20) Suppose you are about to book a taxi (e.g. UBER) to Orly airport. +
Which option would you choose? +
+ {% formfield player.q_20 %} +

+ +

+ 21) Electric cars are less polluting than petrol or diesel cars. +
(Indicate your degree of agreement) + + + + + + +
Strongly disagree {% formfield player.q_21 %} Strongly agree
+

+ +

+ 22) Would you be interested in buying an alternative fuel car? + + + + + + + +
Strongly disagree {% formfield player.q_22_p2 %} Strongly agree
+

+ +

+ 23) Do you adopt eco-responsible driving? +
+ + Eco-responsible driving consists of: Checking the tire pressure. + Make sure the vehicle is in good condition. Adopt a smooth driving + (Start smoothly and change without waiting for a higher gear to + avoid over-revs). Stop the engine during a prolonged stop. Do not + abuse the air conditioning. + + {% formfield player.q_23 %} +

+ + + + + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire2.html b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire2.html new file mode 100644 index 0000000..6a973ef --- /dev/null +++ b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire2.html @@ -0,0 +1,243 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (3/4) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + + +

+
+
+ +

+ 24) + Support higher taxes for environmentally damaging behavior. +
(Indicate your degree of agreement) +
+ + + + + + +
Strongly disagree {% formfield player.q_24 %} Strongly agree
+

+ +

+ 25) +In a political program, the place given to environmental issues influences my vote. +
(Indicate your degree of agreement) +
+ + {% formfield player.q_25 %} +

+ + +

+ 26) Do you often discuss environmental issues with friends? + + {% formfield player.q_26 %} +

+ +

27) Are you a member of an environmental organisation? If so, which one? ?

+No
+Yes
+
+

{% formfield player.q_27_a %} +

+
+ +

+ + +

+ 28) Do you support financial incentives for environmentally beneficial technology? + + + + + + +
Strongly disagree {% formfield player.q_28 %} Strongly agree
+

+ +

+ 29) For each of the following actions, please indicate whether it can reduce the + individual carbon footprint to a small or very large extent: + +

+ + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + +
a. Avoid air travel. Reduced way:
Not very important {% formfield player.q_29_a %} Very important
b. Have fewer children. Reduced way:
Not very important {% formfield player.q_29_b %} Very important
c. Not having a car. Reduced way:
Not very important {% formfield player.q_29_c %} Very important
d. a Vegetarian diet. Reduced way:
Not very important {% formfield player.q_29_d %} Very important
+

+ + + + +

+ 30) What do you think are the main differences between a green building and a conventional building? + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
a- Landscaping and physical activity
Strongly disagree {% formfield player.q_30_a %} Strongly agree
b- Indoor air quality
Strongly disagree {% formfield player.q_30_b %} Strongly agree
c- Indoor noise
Strongly disagree {% formfield player.q_30_c %} Strongly agree
d- Annual energy consumption
Strongly disagree {% formfield player.q_30_d %} Strongly agree
e- Annual consumption of drinking water
Strongly disagree {% formfield player.q_30_e %} Strongly agree
f- Monthly management costs
Strongly disagree {% formfield player.q_30_f %} Strongly agree
+

+ +

+ 31) If you were to move, would you be interested in living in a green building? + + + + + + +
Strongly disagree {% formfield player.q_31 %} Strongly agree
+

+ + +

+ 32) Would you be willing to pay more to live in a green building? + + + + + + +
Strongly disagree {% formfield player.q_32 %} Strongly agree
+

+ +

+ + 33) Did you know that you currently live in a green building (with low energy consumption)? + + {% formfield player.q_33 %} + +

+ + + +

{% next_button %}

+ +
+ +
+ +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire3.html b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire3.html new file mode 100644 index 0000000..a67192d --- /dev/null +++ b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/Questionnaire3.html @@ -0,0 +1,113 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (4/4) +{% endblock %} + +{% block content %} + + +
+
+ +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

+
+
+ +

SRI (Socially Responsible Investment)

+ +

+ The extra-financial performance contains information on the main axes of sustainable development: +

  • Social data : employment in the company, health, safety… Here we find the major themes of the quality of life at work. +
  • + +
  • Governance data : anti-discrimination measures, gender equality, integration of disabled workers. +
  • +
  • Environmental data : actions implemented to fight against waste, pollution, global warming, etc. +
  • +

    + +

    +

    + 34) + For each of the following data, please indicate whether it is unimportant + or very important in your choice of investment: + + + + + > + + + + + + + + > + + + + + + + + + + + + + + +
    a. Social data:
    Not very important {% formfield player.q_34_a %} Very important
    b. Governance data:
    Not very important {% formfield player.q_34_b %} Very important
    c. Environmental data:
    Not very important {% formfield player.q_34_c %} Very important
    + +

    + + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/QuestionnaireEnd.html b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/QuestionnaireEnd.html new file mode 100644 index 0000000..26368c6 --- /dev/null +++ b/exp_e4c_en_p1_quest/templates/exp_e4c_en_p1_quest/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + First part : End + +{% endblock %} + +{% block content %} +
    +
    + + +

    + You have completed the first part. + +
    You will now begin the second part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_en_p1_quest/tests.py b/exp_e4c_en_p1_quest/tests.py new file mode 100644 index 0000000..ba54c5d --- /dev/null +++ b/exp_e4c_en_p1_quest/tests.py @@ -0,0 +1,82 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['versionexp'] == 2: + yield (pages.Bienvenue) + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_22': 1, + 'q_2_e_a': 1, + 'q_2_e_b': 1, + 'q_2_e_c': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_5': 1, + 'q_6': 1, + 'q_7': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + }) + yield (pages.Questionnaire1, { + 'q_12': 1, + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + 'q_16': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19': 1, + 'q_19_a': 1, + 'q_19_b': 1, + 'q_20': 1, + 'q_21': 1, + 'q_22_p2': 1, + 'q_23': 1, + }) + yield (pages.Questionnaire2, { + 'q_24': 1, + 'q_25': 1, + 'q_26': 1, + 'q_27': 1, + 'q_27_a': 1, + 'q_28': 1, + 'q_29_a': 1, + 'q_29_b': 1, + 'q_29_c': 1, + 'q_29_d': 1, + 'q_30_a': 1, + 'q_30_b': 1, + 'q_30_c': 1, + 'q_30_d': 1, + 'q_30_e': 1, + 'q_30_f': 1, + 'q_31': 1, + 'q_32': 1, + 'q_33': 1, + + }) + yield (pages.Questionnaire3, { + 'q_34_a': 1, + 'q_34_b': 1, + 'q_34_c': 1, + }) + yield (pages.QuestionnaireEnd) + + + diff --git a/exp_e4c_en_p2_risk_gneezy/__init__.py b/exp_e4c_en_p2_risk_gneezy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_en_p2_risk_gneezy/_builtin/__init__.py b/exp_e4c_en_p2_risk_gneezy/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_en_p2_risk_gneezy/models.py b/exp_e4c_en_p2_risk_gneezy/models.py new file mode 100644 index 0000000..802d7a6 --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/models.py @@ -0,0 +1,109 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p2_risk_gneezy' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_en_p2_risk_gneezy/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() + + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/exp_e4c_en_p2_risk_gneezy/pages.py b/exp_e4c_en_p2_risk_gneezy/pages.py new file mode 100644 index 0000000..d8ede78 --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/pages.py @@ -0,0 +1,89 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + + + def vars_for_template(self): + self.player.task_start_19 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = round(time.time() - self.player.task_start_19,2) ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_20 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = round(time.time() - self.player.task_start_20,2) ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + +page_sequence = [ + L_risk11_qc, + M_risk11, + Jeu1End, + +] diff --git a/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/Jeu1End.html b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/Jeu1End.html new file mode 100644 index 0000000..817680e --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/Jeu1End.html @@ -0,0 +1,28 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Second part: End + +{% endblock %} + +{% block content %} +
    +
    + +

    + You have completed the second part. + +
    You will now begin the third part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/L_risk11_qc.html b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/L_risk11_qc.html new file mode 100644 index 0000000..87c577f --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 1 +{% endblock %} + +{% block content %} + +

    + This game can be taken into account when calculating your winnings. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Comprehension test:

    + + +

    If you have invested 6 ECUs in the risky project:

    + +

    1) How many ECUs have you kept?

    + +

    {% formfield player.risk11_qc_a label = ""%} +

    +

    2) If the investment is successful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_b label = ""%} +

    +

    3) If the investment is unsuccessful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_c label = ""%} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/M_risk11.html b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/M_risk11.html new file mode 100644 index 0000000..1e7b413 --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 1 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

    +

    {% formfield player.risk11_a label = ""%} +

    + +

    So, how many ECUs did you keep (an amount between 0 and 10)?

    +

    {% formfield player.risk11_b label = ""%} +

    + +

    + Note: the sum of the two amounts must be equal to 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/M_risk11_result.html b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 1 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/instructions.html b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/instructions.html new file mode 100644 index 0000000..f0b5bf4 --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/templates/exp_e4c_en_p2_risk_gneezy/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Rules of the game : +

    + +

    You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

    + +
    Project description:
    + +

    This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

    +

    +

    Your gain from this task = amount retained + gain from your investment in the project.

    +

    +

    Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

    + +

    Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Summary of the game:

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/exp_e4c_en_p2_risk_gneezy/tests.py b/exp_e4c_en_p2_risk_gneezy/tests.py new file mode 100644 index 0000000..04e8fff --- /dev/null +++ b/exp_e4c_en_p2_risk_gneezy/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + + diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/__init__.py b/exp_e4c_en_p2bis_risk_gneezy_end/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/_builtin/__init__.py b/exp_e4c_en_p2bis_risk_gneezy_end/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/models.py b/exp_e4c_en_p2bis_risk_gneezy_end/models.py new file mode 100644 index 0000000..af36ffd --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/models.py @@ -0,0 +1,109 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p2bis_risk_gneezy_end' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_en_p2bis_risk_gneezy_end/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + + treatment = models.IntegerField() + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/pages.py b/exp_e4c_en_p2bis_risk_gneezy_end/pages.py new file mode 100644 index 0000000..1a696a2 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/pages.py @@ -0,0 +1,90 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 ==0 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 2 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/Jeu1End.html b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/Jeu1End.html new file mode 100644 index 0000000..402dbc3 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Third Part: End + +{% endblock %} + +{% block content %} +
    +
    + + +

    + You have completed the third part. + +
    You will now begin the fourth part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/L_risk11_qc.html b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/L_risk11_qc.html new file mode 100644 index 0000000..cbb0176 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 2 +{% endblock %} + +{% block content %} + +

    + This game can be taken into account when calculating your winnings. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Comprehension test:

    + + +

    If you have invested 6 ECUs in the risky project:

    + +

    1) How many ECUs have you kept?

    + +

    {% formfield player.risk11_qc_a label = ""%} +

    +

    2) If the investment is successful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_b label = ""%} +

    +

    3) If the investment is unsuccessful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_c label = ""%} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/M_risk11.html b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/M_risk11.html new file mode 100644 index 0000000..af135a7 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 2 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

    +

    {% formfield player.risk11_a label = ""%} +

    + +

    So, how many ECUs did you keep (an amount between 0 and 10)?

    +

    {% formfield player.risk11_b label = ""%} +

    + +

    + Note: the sum of the two amounts must be equal to 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/M_risk11_result.html b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/M_risk11_result.html new file mode 100644 index 0000000..70bdd92 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 2 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/instructions.html b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/instructions.html new file mode 100644 index 0000000..569116a --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/templates/exp_e4c_en_p2bis_risk_gneezy_end/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Rules of the game : +

    + +

    You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

    + +
    Project description:
    + +

    This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

    +

    +

    Your gain from this task = amount retained + gain from your investment in the project.

    +

    +

    Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

    + +

    Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Summary of the game:

    + +
    +
    +

    + + +
    +
    diff --git a/exp_e4c_en_p2bis_risk_gneezy_end/tests.py b/exp_e4c_en_p2bis_risk_gneezy_end/tests.py new file mode 100644 index 0000000..2253a12 --- /dev/null +++ b/exp_e4c_en_p2bis_risk_gneezy_end/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + + if self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + diff --git a/exp_e4c_en_p3_risk_binswanger/__init__.py b/exp_e4c_en_p3_risk_binswanger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_en_p3_risk_binswanger/_builtin/__init__.py b/exp_e4c_en_p3_risk_binswanger/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_en_p3_risk_binswanger/models.py b/exp_e4c_en_p3_risk_binswanger/models.py new file mode 100644 index 0000000..ffdd140 --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/models.py @@ -0,0 +1,153 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p3_risk_binswanger' + players_per_group = None + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'exp_e4c_en_risk_p3_binswanger/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + + treatment = models.IntegerField() + + + riskqc_a = models.IntegerField( + choices=[ + [1, '12 ECUs'], + [2, '0 ECUs'], + [3, '4 ECUs'], + [4, '6 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '20 ECUs'], + [2, '0 ECUs'], + [3, '2 ECUs'], + [4, '12 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '2 ECUs'], + [3, '24 ECUs'], + [4, '8 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/exp_e4c_en_p3_risk_binswanger/pages.py b/exp_e4c_en_p3_risk_binswanger/pages.py new file mode 100644 index 0000000..0219d1b --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/pages.py @@ -0,0 +1,167 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +###### traitement 1 risk au début +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + else: + self.player.choicerisknn = "E" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + + + +####################################################### elle n'est pas active !!! c'est le programme (exp_e4c_en_p5_questfin) +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def before_next_page(self): + + ########################### + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur +####################################################### + + +class Risk_BinsWanger_result(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Jeu2End(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +page_sequence = [ + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, + Jeu2End, +###### Risk_BinsWanger_color, +###### Risk_BinsWanger_result, + + +] diff --git a/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Jeu2End.html b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Jeu2End.html new file mode 100644 index 0000000..87c1e73 --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Jeu2End.html @@ -0,0 +1,44 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Third Part : End + {% endif %} + {% if player.id_in_group == 2 %} + Second Part : End + {% endif %} + +{% endblock %} + +{% block content %} +
    +
    + + +{% if player.id_in_group == 1%} +

    + You have completed the third part. + +
    You will now begin the fourth part. + +

    + {% endif%} + {% if player.id_in_group == 2%} +

    + You have completed the second part. + +
    You will now begin the third part. + +

    + {% endif%} + + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger.html b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger.html new file mode 100644 index 0000000..25c40f6 --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger.html @@ -0,0 +1,392 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Game 2 : Your choice + {% endif %} + {% if player.id_in_group == 2 %} + Game 1 : Your choice + {% endif %} +{% endblock %} + +{% block content %} + + + +
    +
    + + + + +

    +You will now play the game for real. The winning of this game will count towards the final gain.

    + + + +

    Now please choose the situation you prefer the most from the following choices (A, B, C, D or E). +

    + +

    + +

    Please make a choice

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    A
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    B
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    C
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    D
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    E
    (0 ECUs) (24 ECUs)
    + + + + + +




    + + + + +
    + + + +
    + + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_color.html b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_color.html new file mode 100644 index 0000000..042c55e --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 : Choix de votre couleur + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 : Choix de votre couleur + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + + +
    + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc.html b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..556ab43 --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc.html @@ -0,0 +1,455 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Game 2 + {% endif %} + {% if player.id_in_group == 2 %} + Game 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    +This game can be taken into account when calculating your gains.

    + +
    +
    + + + + + +

    + Rules of the game: + +

    + +

    + Look at the table below. It presents 5 different situations. Look at them carefully. + Situations A, B, C, D and E contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

    + +

    +At the end of the game, the ECU you have won will be converted into € using the following rule:

    +

    +

    1 ECU =… €
    +

    + +

    +So you will first have to choose the situation you prefer the most: A, B, C, D or E.

    + +

    + +

    Warning! The image below is an example, your choice will be saved later.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + + + + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + + +
    (0 ECUs) (24 ECUs)
    + + + +

    + +

    + +Second, your color will be revealed to you, at the end of the experiment , with the following process: + +
    You will choose between two buttons that look like this: + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    After clicking one of the buttons, a red or green color will appear. This color will determine your winnings.

    +

    There is a 50% chance that the color red will be behind the left or right button. The same probability applies + for the color green.

    +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc2.html b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..2ff856b --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc2.html @@ -0,0 +1,1134 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Comprehension Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Now we want to test if you have understood the in-game instructions.

    + + +
    + +

    + Example 1: + +

    + + +

    If you have chosen situation B, then the color Green appears. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + A + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    + + C + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + D + +
    (0 ECUs) (24 ECUs)
    + + +

    +What would your earnings be?

    + {% formfield player.riskqc_a label="" %} + +

    + + +

    + Example 2: +

    + + +

    If you have chosen situation D, then the color Red appears. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + +

    + Question 2: What would your earnings be?

    + + {% formfield player.riskqc_b label = ""%} + +

    + + + +

    + + Example 3: +

    + + +

    If you have chosen situation E, then the color Red + appears. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + +

    + Question 3: What would your earnings be?

    + + {% formfield player.riskqc_c label = ""%} + +

    + + + + + +




    + + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_result.html b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_result.html new file mode 100644 index 0000000..ea6e1de --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/templates/exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_result.html @@ -0,0 +1,57 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + + {% if player.id_in_group == 1 %} + Gain of game 2 : Details + {% endif %} + {% if player.id_in_group == 2 %} + Gain of game 1 : Details + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    Your choice was: {{player.choicerisknn}}

    + +

    The selected color is: {{player.colorselectnn}}

    + + +

    Your winnings for this game are: {{player.gainrisk}} ECU (s)

    + + +

    Your winnings for this game are: {{player.gainriskeur}} ECU (s)

    +

    -----------------------------------------

    + +
    + + + +
    +
    + +

    +

    +Reminder of the instructions: +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + +{% endblock %} + + diff --git a/exp_e4c_en_p3_risk_binswanger/tests.py b/exp_e4c_en_p3_risk_binswanger/tests.py new file mode 100644 index 0000000..f5bc831 --- /dev/null +++ b/exp_e4c_en_p3_risk_binswanger/tests.py @@ -0,0 +1,30 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['versionexp'] == 2: + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 5), + }) + + yield (pages.Jeu2End) + + + diff --git a/exp_e4c_en_p5_questfin/__init__.py b/exp_e4c_en_p5_questfin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_en_p5_questfin/_builtin/__init__.py b/exp_e4c_en_p5_questfin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_en_p5_questfin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_en_p5_questfin/models.py b/exp_e4c_en_p5_questfin/models.py new file mode 100644 index 0000000..6a5ea2f --- /dev/null +++ b/exp_e4c_en_p5_questfin/models.py @@ -0,0 +1,626 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C + +version: EN +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p5_questfin' + players_per_group = None + num_rounds = 1 + + showupfee = 5 + + instructions_GP_template = 'exp_e4c_en_p5_questfin/instructions.html' + instructions_BW_template = 'exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + treatmentname = p.treatmentname, + jeu_tire=p.jeu_tire, + jeuname = p.jeuname, + gainfinal=p.gainfinal, + gaineur=p.gaineur, + gainfinaleur=p.gainfinaleur, + )) + return dict(report=report) + + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + + treatment = models.IntegerField() + treatmentname = models.StringField() + + + + langue = models.StringField() + langue_nn = models.IntegerField() + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + +######### var jeu Binswanger + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts and / or literature'], + [2, '2- Economy and / or management'], + [3, '3- Scientific / engineering'], + [4, '4- Other'], + ], + widget=widgets.RadioSelect, + label="a. Your field of study ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Woman'], + [2, '2- Male'], + [3, '3- Non-binary'], + [4, '4- Do not wish to answer'], + ], + widget=widgets.RadioSelect, + label="b. You are ", + blank=False + ) + + q_42_age = models.IntegerField( + label="c. How old are you?", + blank=False, + min=15, + max=100, + ) + + q_43_nationalite = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + blank=False, + label="d. Country of citizenship", + + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Less than 5,000 Euros'], + [2, '2- Between 5,000 and 10,000 Euros'], + [3, '3- Between 10,000 and 15,000 Euros'], + [4, '4- Between 15,000 and 20,000 Euros'], + [5, '5- Between 20,000 and 25,000 Euros'], + [6, '6- Greater than 25,000 Euros'], + ], + widget=widgets.RadioSelect, + label="e. Please estimate your gross annual income (including your scholarships and student loan) in Euros.", + blank=False + ) + + + q3_countries = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + label="f. Country - previous accommodation", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="g. City - previous accommodation", + blank=False + ) + + q_31 = models.IntegerField() # nbre d'enfant + + q_47_residence = models.IntegerField( + label="i. You currently live in:", + choices=[ + [1, 'Bâtiment 103'], + [2, 'Another residence '], + ], + widget=widgets.RadioSelect, + blank=False + ) + + q_48_satisfaction = models.IntegerField( + choices=[ + [1, '1 - Very satisfied'], + [2, '2 - Satisfied '], + [3, '3 - Unsatisfied '], + [4, '4 - Very unsatisfied'], + ], + widget=widgets.RadioSelect, + label="j. How satisfied are you with your place of residence? ", + blank=True + ) + + + q_49_propositions = models.StringField( + label="k. Do you have any ideas or suggestions for improvements concerning your place of residence?", + blank=True + ) + + + +### jeu 2 : Gneezy&Potters + tirageriskresult_j1 = models.StringField() + risk11_a_j1 = models.FloatField() + risk11_b_j1 = models.FloatField() + gainrisk_j1 = models.FloatField() + + + tirageausort = models.FloatField() + + jeu_tire = models.IntegerField() + gainfinal = models.FloatField() + + + #gainfinalecu = models.FloatField() + #gainfinalplushowup = models.FloatField() + gaineur = models.FloatField() + gainfinaleur = models.FloatField() + + gainfinaleur_v1 = models.FloatField() + + jeuname = models.StringField() + + lastname = models.StringField( + label="Last Name", + blank=False + ) + + firstname = models.StringField( + label="First Name", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Room number", + blank=False + ) + + + + + diff --git a/exp_e4c_en_p5_questfin/pages.py b/exp_e4c_en_p5_questfin/pages.py new file mode 100644 index 0000000..668e3bf --- /dev/null +++ b/exp_e4c_en_p5_questfin/pages.py @@ -0,0 +1,193 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def before_next_page(self): + self.player.treatment = self.player.participant.vars['treatment'] + if self.player.treatment == 1: + self.player.treatmentname ='GP - BW' + elif self.player.treatment == 2: + self.player.treatmentname ='BW - GP' + + + ########################### + + self.player.choicerisk = self.participant.vars['choicerisk'] + self.player.choicerisknn = self.participant.vars['choicerisknn'] + + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_age', + 'q_43_nationalite', 'q_44_revenu', + 'q3_countries', 'q_46_logement_ville', 'q_31', + 'q_47_residence', 'q_48_satisfaction', 'q_49_propositions' + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + + + def before_next_page(self): + ### jeu 2 : risk Binswanger + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.player.colorselectnn = self.participant.vars['colorselectnn'] + self.player.gainrisk = self.participant.vars['gainrisk'] + self.player.gainriskeur = self.participant.vars['gainriskeur'] + + ### jeu 1 : Gneezy_Potters + + self.player.tirageriskresult_j1 = self.participant.vars['tirageriskresult_j1'] + self.player.risk11_a_j1 = self.participant.vars['risk11_a_j1'] + self.player.risk11_b_j1 = self.participant.vars['risk11_b_j1'] + self.player.gainrisk_j1 = self.participant.vars['gainrisk_j1'] + + + self.player.tirageausort = round(random.random(), 2) + + if self.player.treatment == 1 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 1 + self.player.jeuname = "GP" + else: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 2 + self.player.jeuname = "BW" + + if self.player.treatment == 2 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 1 + self.player.jeuname = "BW" + else: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 2 + self.player.jeuname = "GP" + + + #self.player.gainfinalplushowup = self.player.gainfinal + Constants.showupfee + + self.player.gaineur = round(self.player.gainfinal * Constants.tauxchange,1) + + self.player.gainfinaleur = round(self.player.gaineur + Constants.showupfee,1) + + if (self.player.gainfinaleur * 100) % 100 <= 50 and (self.player.gainfinaleur * 100) % 100 > 0 : + self.player.gainfinaleur_v1 = ((round(((self.player.gainfinaleur * 100) - ((self.player.gainfinaleur * 100) % 100)), 0) + 50) / 100) * 1000 + else: + self.player.gainfinaleur_v1 = (round((self.player.gainfinaleur), 0))*1000 + + self.player.payoff = self.player.gainfinaleur_v1 + + +class Result(Page): + form_model = 'player' + form_fields = [ + 'lastname', + 'firstname', + 'email', + 'room', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + def before_next_page(self): + self.player.participant.vars['treatmentname'] = self.player.treatmentname + self.player.participant.vars['jeu_tire'] = self.player.jeu_tire + self.player.participant.vars['jeuname'] = self.player.jeuname + self.player.participant.vars['gainfinal'] = self.player.gainfinal + self.player.participant.vars['gaineur'] = self.player.gaineur + self.player.participant.vars['gainfinaleur'] = self.player.gainfinaleur + self.player.participant.vars['lastname'] = self.player.lastname + self.player.participant.vars['firstname'] = self.player.firstname + self.player.participant.vars['email'] = self.player.email + self.player.participant.vars['room'] = self.player.room + + + + + + +page_sequence = [ + Risk_BinsWanger_color, + Questionnaire4, + Result, + + +] diff --git a/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/AdminReport.html b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/AdminReport.html new file mode 100644 index 0000000..ac7e0a5 --- /dev/null +++ b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/AdminReport.html @@ -0,0 +1,35 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label Treatment name Jeu tire Jeu name Gain (Ecus) Gain (€) gain final (gain+bonus) (€)
    {{ row.id }}{{ row.label }} {{row.treatmentname}}{{ row.jeu_tire }} {{row.jeuname}}{{ row.gainfinal }}{{ row.gaineur }}{{ row.gainfinaleur }}
    + diff --git a/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Questionnaire4.html b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Questionnaire4.html new file mode 100644 index 0000000..efd5055 --- /dev/null +++ b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Questionnaire4.html @@ -0,0 +1,104 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +Final Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account in the calculation of + your earnings. We nevertheless ask you to respond as sincerely as possible. + As a reminder, all your responses will be treated anonymously, and no one + will not have access to your answers. + +

    +
    +
    + + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_age%} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
    +

    + +Indicate the City and Country where your previous accommodation was: +

    + {% formfield player.q3_countries %} + + + {% formfield player.q_46_logement_ville %} + + + +
    +
    + + +

    +
    + + + {% formfield player.q_47_residence %} + + {% formfield player.q_48_satisfaction %} + + {% formfield player.q_49_propositions %} + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Result.html b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Result.html new file mode 100644 index 0000000..3557420 --- /dev/null +++ b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Result.html @@ -0,0 +1,59 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + FINAL QUESTIONNAIRE + +{% endblock %} + +{% block content %} +
    +
    + +
    +
    + NB : Useful information to receive your gain: +
    +
    + +
    + +
    +
    + +

    + Please fill in the following fields in order to be able to take the + amount you won during this experience. + {% formfield player.lastname %} + {% formfield player.firstname %} + {% formfield player.email %} + {% formfield player.room %} + +

    + +

    + + Reminder for those who have not yet registered + + : to receive your gain you must subscribe to the list of voluntary participants via the link : + + +

    http://orsee.labeds.fr/public/

    + +
    Note : Your personal data are strictly confidential. + All your responses will be treated anonymously. +
    + +

    + + +
    +
    + +

    {% next_button %}

    + + + +{% endblock %} + diff --git a/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Risk_BinsWanger_color.html b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Risk_BinsWanger_color.html new file mode 100644 index 0000000..1ef4b55 --- /dev/null +++ b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Risk_BinsWanger_color.html @@ -0,0 +1,168 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + {% if player.id_in_group == 1 %} + Choice of your color (game 2) + {% endif %} + {% if player.id_in_group == 2 %} + Choice of your color (game 1) + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + +

    Please choose between the following two buttons:

    + +

    A color (red or green) is hidden behind each button. + When you click on one of the buttons, its color appears. + If the color that appears is green, you will receive the green wins + from the selection you made at the start. + If it is red, you will receive the red winnings.

    +

    + +
    + + + +
    + + + +
    + +

    + + + + + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..c6be2d0 --- /dev/null +++ b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Game 2 + {% endif %} + {% if player.id_in_group == 2 %} + Game 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    +This game can be taken into account when calculating your gains.

    + +
    +
    + + + + + +

    + Rules of the game: + +

    + +

    + Look at the table below. It presents 5 different situations. Look at them carefully. + Situations A, B, C, D and E contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

    + +

    +At the end of the game, the ECU you have won will be converted into € using the following rule:

    +

    +

    1 ECU =… €
    +

    + +

    +So you will first have to choose the situation you prefer the most: A, B, C, D or E.

    + +

    + +

    Warning! The image below is an example, your choice will be saved later.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + +Second, your color will be revealed to you, at the end of the experiment , with the following process: + +
    You will choose between two buttons that look like this: + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    After clicking one of the buttons, a red or green color will appear. This color will determine your winnings.

    +

    There is a 50% chance that the color red will be behind the left or right button. The same probability applies + for the color green.

    +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/instructions.html b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/exp_e4c_en_p5_questfin/templates/exp_e4c_en_p5_questfin/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/exp_e4c_en_p5_questfin/tests.py b/exp_e4c_en_p5_questfin/tests.py new file mode 100644 index 0000000..af8593e --- /dev/null +++ b/exp_e4c_en_p5_questfin/tests.py @@ -0,0 +1,39 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.participant.vars['versionexp'] == 2: + yield (pages.Risk_BinsWanger_color, { + 'tc3': '1;;0.3', + }) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_age': random.randint(18, 40), + 'q_43_nationalite': 5, + 'q_44_revenu': 1, + 'q3_countries': 1, + 'q_46_logement_ville': 'fr', + 'q_31': 3, + 'q_47_residence': 1, + 'q_48_satisfaction': 2, + 'q_49_propositions': 'sasasadad' + }) + + yield (pages.Result, { + 'lastname': 'a', + 'firstname': 'b', + 'email': '@', + 'room': 'a', + }) + + diff --git a/exp_e4c_fr_p1_quest/__init__.py b/exp_e4c_fr_p1_quest/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_fr_p1_quest/_builtin/__init__.py b/exp_e4c_fr_p1_quest/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_fr_p1_quest/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_fr_p1_quest/models.py b/exp_e4c_fr_p1_quest/models.py new file mode 100644 index 0000000..7236903 --- /dev/null +++ b/exp_e4c_fr_p1_quest/models.py @@ -0,0 +1,798 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_p1_quest' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + versionexp = models.IntegerField( + choices=[ + [1, '1 - Je veux participer en "Français" '], + [2, '2 - I want to participate in "English" '], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + language = models.StringField() + + q_1 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + # q_6 = models.IntegerField( + # choices=[ + # [1, '1'], + # [2, '2'], + # [3, '3'], + # [4, '4'], + # [5, '5'], + # [6, '6'], + # ], + # widget=widgets.RadioSelectHorizontal, + # label="", + # blank=False + # ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je ne bois pas de café (thé) à l’école / au travail'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + # q_11 = models.IntegerField( + # choices=[ + # [1, '1 - Jamais'], + # [2, '2 - Rarement'], + # [3, '3 - Souvent'], + # [4, '4 - Toujours'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je n’utilise pas de piles'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) +################################################ page Questionnaire 1 + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_17 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_19 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_19_a = models.IntegerField( + label="", + blank=True + ) + + q_19_b = models.StringField( + label="", + blank=True + ) + + q_20 = models.IntegerField( + choices=[ + [1, 'a- Green (100% électrique ou hybride) (à 26 € la course)'], + [2, 'b- UberX (Économique, rapide et fiable) (à 22€ la course)'], + [3, 'c- Comfort (Véhicules spacieux et chauffeurs les mieux notés) (à 30€ la course)'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_21 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22_p2 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je ne conduis pas'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + +################################################# Page : Questionnaire2 + + q_24 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_26 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27_a = models.StringField( + label="Si oui, laquelle ? ", + blank=True + ) + + q_28 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_29_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_30_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_31 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_32 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_33 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + +##################################### Page : Questionnaire3 + + q_34_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + + diff --git a/exp_e4c_fr_p1_quest/pages.py b/exp_e4c_fr_p1_quest/pages.py new file mode 100644 index 0000000..163fd4d --- /dev/null +++ b/exp_e4c_fr_p1_quest/pages.py @@ -0,0 +1,105 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Bienvenue0(Page): + form_model = 'player' + form_fields = ['versionexp'] + + def before_next_page(self): + self.participant.vars['versionexp'] = self.player.versionexp + + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.language = "FR" + self.player.participant.vars['language'] = self.player.language + + + + if self.player.id_in_group % 2 == 1: + self.player.treatment = 1 # gneezy - BinsWanger + else: + self.player.treatment = 2 # BinsWanger -gneezy + + self.player.participant.vars['treatment'] = self.player.treatment + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', + 'q_22', 'q_2_e_a', 'q_2_e_b', 'q_2_e_c', 'q_2_h', + 'q_3', 'q_4', 'q_5', 'q_6', + 'q_7', 'q_8', 'q_9', 'q_10', 'q_11', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_12', 'q_13', 'q_14', + 'q_15', 'q_16', 'q_17', 'q_18', + 'q_19', + 'q_19_a','q_19_b', 'q_20', + 'q_21', + 'q_22_p2', 'q_23', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_24', 'q_25', 'q_26', 'q_27', + 'q_27_a', 'q_28', 'q_29_a', + 'q_29_b', + 'q_29_c', 'q_29_d', + 'q_30_a', 'q_30_b', 'q_30_c', + 'q_30_d', 'q_30_e', 'q_30_f', + 'q_31', 'q_32', 'q_33' + + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +class Questionnaire3(Page): + form_model = 'player' + form_fields = [ 'q_34_a', 'q_34_b', 'q_34_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +class QuestionnaireEnd(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + +page_sequence = [ + Bienvenue0, + Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + Questionnaire3, + QuestionnaireEnd, + + +] diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Bienvenue.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Bienvenue.html new file mode 100644 index 0000000..d345c6a --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Bienvenue.html @@ -0,0 +1,68 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie +{% endblock %} + +{% block content %} + + +
    +
    + +

    Bienvenue

    + +

    + Merci d’avoir accepté de participer à cette expérience. + Une rémunération fixe (de 5 €) vous sera versée + pour votre participation, et ce, quelles que soient vos réponses durant + cette expérience. À cela s’ajoutera une rémunération variable liée + à vos réponses au cours + de l’expérience. +

    + +

    + L’expérience dure environ 30 min. Elle se compose de deux types de tâches : + les questionnaires et les jeux. + La rémunération variable que vous percevrez à la fin de l’expérience + ne dépendra pas de vos réponses + aux questionnaires. + En effet, dans ces questionnaires, il n’y a ni bonne, ni mauvaise réponse. + En revanche, votre rémunération + variable dépendra + de la qualité de vos réponses aux jeux. Plus précisément, à la fin de l’expérience, + un seul des jeux + sera sélectionné + aléatoirement pour être payé pour de bon. +

    +
    La monnaie utilisée dans cette expérience est l'ECU. +
    Taux de change 1 ECU = {{ Constants.tauxchange}} €.
    + +
    + Important : Toutes vos réponses seront traitées anonymement. + Personne n’aura la possibilité d’identifier directement vos décisions. + + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Bienvenue0.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Bienvenue0.html new file mode 100644 index 0000000..122e029 --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Bienvenue0.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie / Experiment in economics +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    +

    Choix de la langue / Choice of language

    + {% formfield player.versionexp %} + +

    + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire0.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire0.html new file mode 100644 index 0000000..32b4b48 --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire0.html @@ -0,0 +1,241 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (1/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    + +
    +
    + +

    + 1) Achetez-vous des produits bio et/ou écologique ? + + {% formfield player.q_1 %} +

    + + + + + + 2) Pour chacun des critères suivants, merci d’indiquer si cela peut + influencer vos choix de produits à acheter: + + + + + + + > + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a. Le prix peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_2_a %} Tout à fait d'accord
    b. La provenance peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_2_b %} Tout à fait d'accord
    c. La qualité peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_2_c %} Tout à fait d'accord
    d. Le goût (si c'est un produit alimentaire) peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_22 %} Tout à fait d'accord
    e. Influence du label
              * Le label Bio peut influencer vos choix de produits à acheter +
    * label Bio: + Un produit Bio est un produit issu de l’agriculture biologique (c’est une méthode de production + agricole qui exclut le recours à la plupart des produits chimiques de synthèse, des produits + toxiques etc.). Il existe un label (AB) en France qui permet d’authentifier les produits issus + de cette méthode d’agriculture. +
            Pas du tout d'accord {% formfield player.q_2_e_a %} Tout à fait d'accord
              * Le label écologique peut influencer vos choix de produits à acheter +
    * label écologique: + Un produit écologique est un produit qui va être pensé, conçu, emballé, distribué, + recyclé de manière à minimiser l’impact sur l’environnement. Il doit respecter de + nombreuses règles liées à ces étapes lors d’un cahier des charges établis par un + organisme tel ECOLABEL ou ECOCERT. Un produit écologique doit être conçu dans un + maximum de respect de l’environnement (respect lié à l’utilisation des matières + premières et des machines lors de la fabrication). Le cycle de vie du produit ainsi + que son recyclage sont également des points importants à prendre en considération. +
            Pas du tout d'accord {% formfield player.q_2_e_b %} Tout à fait d'accord
              * Le label commerce équitable peut influencer vos choix de produits à acheter +
    * label commerce équitable: + Le commerce équitable est un partenariat commercial et international, reposant sur + des principes concrets et lancé depuis près de 20 ans. Son objectif est de pouvoir + garantir un meilleur équilibre entre les producteurs et les revendeurs, en assurant + de meilleures conditions de travail et une meilleure rémunération pour les petits + producteurs. +
            Pas du tout d'accord {% formfield player.q_2_e_c %} Tout à fait d'accord
    + +

    +           * Un autre label peut influencer vos choix de produits à acheter (si oui, à indiquer) + {% formfield player.q_2_h %} + +

    + +

    + +

    + 3) Faites-vous des achats en ligne ? + {% formfield player.q_3 %} +

    + + 4) Achetez-vous des vêtements en ligne ? + {% formfield player.q_4 %} +

    + +

    + 5) Etes-vous d’accord qu’il est moins écologique de faire des achats en ligne plutôt que des achats en magasin ? + + + + + + + + +
    Pas du tout d'accord {% formfield player.q_5 %} Tout à fait d'accord
    +

    + +

    + 6) Apportez-vous votre propre tasse de café (thé) à l'école / au travail (au lieu d'utiliser les tasses de la machine à café) ? + {% formfield player.q_6 %} +

    + + +

    + 7) Triez-vous vos déchets ménagers ? + {% formfield player.q_7 %} +

    + +

    + 8) Utilisez-vous un bac à compost ? + {% formfield player.q_8 %} +

    +

    + 9) Collectez-vous et recyclez-vous les papiers usagés ? + {% formfield player.q_9 %} +

    + +

    + 10) Réutilisez-vous vos sacs de course ? + {% formfield player.q_10 %} +

    + +

    + 11) Renvoyez-vous les piles usées aux points de collecte des déchets dangereux ? + {% formfield player.q_11 %} +

    + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire1.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire1.html new file mode 100644 index 0000000..645b42e --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire1.html @@ -0,0 +1,162 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (2/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    + +
    +
    + +

    + 12) Lors d’achat de nouveaux appareils électroniques, assurez-vous d’acheter ceux qui consomment le moins d'énergie ? + {% formfield player.q_12 %} +

    + +

    + 13) Éteignez-vous ou déconnectez-vous complètement les appareils électriques lorsque vous ne les utilisez pas (sans utiliser le mode veille) ? + {% formfield player.q_13 %} +

    + +

    + 14) Utilisez-vous un sèche-linge pour sécher les vêtements ? + {% formfield player.q_14 %} +

    + +

    + 15) Attendez-vous d'avoir une charge complète avant de faire votre lessive ? + {% formfield player.q_15 %} +

    + +

    + 16) Le radiateur de votre logement en hiver est-il éteint tard le soir entre 1h et 5h du matin ? + {% formfield player.q_16 %} +

    + +

    + 17) Réduisez-vous la température ambiante lorsque vous n'êtes pas à la maison pendant une longue période (en hiver) ? + {% formfield player.q_17 %} +

    + +

    + 18) Vous prenez une douche plutôt qu’un bain +{% formfield player.q_18 %} +

    + + + +

    19) Dégivrez-vous régulièrement le réfrigérateur ?

    + + 1 - Jamais + +
    +
    +

            a - Parce que j’ai acheté un frigo sans givre exprès
    +         b - Je partage le réfrigérateur avec d’autres personnes et quelqu’un d’autre en est responsable
    +         c - Autre raison
    +         (Si autre raison merci de le préciser) :
    + +

    +

    + 2 - Rarement
    + 3 - Souvent
    + 4 - Toujours
    + +

    +

    + 20) Supposons que vous êtes sur le point de réserver un taxi (par ex UBER) pour vous rendre à l’aéroport Orly. +
    Quelle option choisiriez-vous ? +
    + {% formfield player.q_20 %} +

    + +

    + 21) Les voitures électriques sont moins polluantes que les voitures essence ou diesel. +
    (Indiquez votre degré d’accord)

    + + + + + + +
    Pas du tout d'accord {% formfield player.q_21 %} Tout à fait d'accord
    +

    + +

    + 22) Seriez-vous intéressés par acheter une voiture à carburant alternatif ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_22_p2 %} Tout à fait d'accord
    +

    + +

    + 23) Adoptez-vous une conduite éco-responsable ? + +
    Une conduite éco-responsable consiste à : + Vérifier la pression des pneus. S’assurer du bon état du véhicule. Adopter une conduite souple (Démarrer en douceur et passer sans attendre le rapport supérieur pour éviter les sur-régimes). + Couper le moteur lors d’un arrêt prolongé. Ne pas abuser de la climatisation. + + + {% formfield player.q_23 %} +

    + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire2.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire2.html new file mode 100644 index 0000000..5c466b8 --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire2.html @@ -0,0 +1,240 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (3/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. +
    + +
    +
    + +

    + 24) Soutenir des taxes plus élevées pour les comportements dommageables envers l'environnement. +
    (Indiquez votre degré d’accord)

    + + + + + + +
    Pas du tout d'accord {% formfield player.q_24 %} Tout à fait d'accord
    +

    + +

    + 25) + Dans un programme politique, la place donnée aux problèmes environnementaux influence mon vote. +
    (Indiquez votre degré d’accord)

    + + + + {% formfield player.q_25 %} +

    + + +

    + 26) Parlez-vous souvent avec des amis de problèmes liés à l'environnement ? + + {% formfield player.q_26 %} +

    + + +

    27) Êtes-vous membre d'une organisation environnementale ? Si oui laquelle ? ?

    +Non
    +Oui
    +
    +

    {% formfield player.q_27_a %} +

    +
    + +

    + + +

    + 28) Soutenez-vous les incitations financières pour une technologie bénéfique pour l'environnement ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_28 %} Tout à fait d'accord
    +

    + +

    + 29) Pour chacune des actions suivantes, merci d’indiquer si elle peut réduire de façon peu importante ou très importante l'empreinte carbone individuelle : + +

    + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + +
    a. Eviter de voyager par avion. Réduit de façon :
    Peu importante {% formfield player.q_29_a %} Très importante
    b. Faire moins d'enfants. Réduit de façon :
    Peu importante {% formfield player.q_29_b %} Très importante
    c. Ne pas avoir de voiture. Réduit de façon :
    Peu importante {% formfield player.q_29_c %} Très importante
    d. Un régime alimentaire végétarien. Réduit de façon :
    Peu importante {% formfield player.q_29_d %} Très importante
    +

    + + +

    + 30) Selon vous quelles sont les principales différences entre un bâtiment écologique et un bâtiment conventionnel ? + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a- Aménagement paysager et activité physique
    Pas du tout d'accord {% formfield player.q_30_a %} Tout à fait d'accord
    b- Qualité de l'air intérieur
    Pas du tout d'accord {% formfield player.q_30_b %} Tout à fait d'accord
    c- Bruit intérieur
    Pas du tout d'accord {% formfield player.q_30_c %} Tout à fait d'accord
    d- Consommation annuelle d'énergie
    Pas du tout d'accord {% formfield player.q_30_d %} Tout à fait d'accord
    e- Consommation annuelle d'eau potable
    Pas du tout d'accord {% formfield player.q_30_e %} Tout à fait d'accord
    f- Frais de gestion mensuels
    Pas du tout d'accord {% formfield player.q_30_f %} Tout à fait d'accord
    +

    + +

    + 31) Si vous deviez déménager, seriez-vous intéressés par habiter dans un bâtiment écologique ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_31 %} Tout à fait d'accord
    +

    + + +

    + 32) Seriez-vous prêt à payer plus cher pour vivre dans un bâtiment écologique ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_32 %} Tout à fait d'accord
    +

    + + +

    + 33) Savez-vous que vous habitez actuellement dans un bâtiment écologique (à faible consommation en énergies) ? + + {% formfield player.q_33 %} +

    + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire3.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire3.html new file mode 100644 index 0000000..3e936cf --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/Questionnaire3.html @@ -0,0 +1,106 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (4/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    +

    +
    +
    + +

    ISR (Investissement socialement responsable)

    + +

    + La performance extra-financière contient des informations sur les grands axes du développement durable : +

  • Données sociales : l’emploi dans l’entreprise, la santé, la sécurité… On retrouve là les grands thèmes de la qualité de vie au travail. +
  • + +
  • Données sociétales : les mesures anti-discrimination, l’égalité hommes/femmes, l’insertion des travailleurs handicapés. +
  • +
  • Données environnementales : les actions mises en place pour lutter contre le gaspillage, la pollution, le réchauffement climatique… +
  • +

    + +

    + +

    + 34) Pour chacune des données suivantes, merci d’indiquer si elle est peu importante ou très importante dans votre choix d'investissement : + + + + > + + + + + + + + > + + + + + + + + + + + + + + +
    a. Données sociales :
    Peu importante {% formfield player.q_34_a %} Très importante
    b. Données sociétales :
    Peu importante {% formfield player.q_34_b %} Très importante
    c. Données environnementales :
    Peu importante {% formfield player.q_34_c %} Très importante
    + +

    + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/QuestionnaireEnd.html b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/QuestionnaireEnd.html new file mode 100644 index 0000000..314960d --- /dev/null +++ b/exp_e4c_fr_p1_quest/templates/exp_e4c_fr_p1_quest/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Première Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la première étape. + +
    Vous allez maintenant commencer la deuxième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_fr_p1_quest/tests.py b/exp_e4c_fr_p1_quest/tests.py new file mode 100644 index 0000000..998b2f9 --- /dev/null +++ b/exp_e4c_fr_p1_quest/tests.py @@ -0,0 +1,85 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Bienvenue0, { + 'versionexp': random.randint(1,2), + }) + + if self.participant.vars['versionexp'] == 1: + yield (pages.Bienvenue) + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_22': 1, + 'q_2_e_a': 1, + 'q_2_e_b': 1, + 'q_2_e_c': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_5': 1, + 'q_6': 1, + 'q_7': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + }) + yield (pages.Questionnaire1, { + 'q_12': 1, + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + 'q_16': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19': 1, + 'q_19_a': 1, + 'q_19_b': 1, + 'q_20': 1, + 'q_21': 1, + 'q_22_p2': 1, + 'q_23': 1, + }) + yield (pages.Questionnaire2, { + 'q_24': 1, + 'q_25': 1, + 'q_26': 1, + 'q_27': 1, + 'q_27_a': 1, + 'q_28': 1, + 'q_29_a': 1, + 'q_29_b': 1, + 'q_29_c': 1, + 'q_29_d': 1, + 'q_30_a': 1, + 'q_30_b': 1, + 'q_30_c': 1, + 'q_30_d': 1, + 'q_30_e': 1, + 'q_30_f': 1, + 'q_31': 1, + 'q_32': 1, + 'q_33': 1, + + }) + yield (pages.Questionnaire3, { + 'q_34_a': 1, + 'q_34_b': 1, + 'q_34_c': 1, + }) + yield (pages.QuestionnaireEnd) + + + diff --git a/exp_e4c_fr_p2_risk_gneezy/__init__.py b/exp_e4c_fr_p2_risk_gneezy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_fr_p2_risk_gneezy/_builtin/__init__.py b/exp_e4c_fr_p2_risk_gneezy/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_fr_p2_risk_gneezy/models.py b/exp_e4c_fr_p2_risk_gneezy/models.py new file mode 100644 index 0000000..e939969 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/models.py @@ -0,0 +1,109 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_p2_risk_gneezy' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_fr_p2_risk_gneezy/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() + + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/exp_e4c_fr_p2_risk_gneezy/pages.py b/exp_e4c_fr_p2_risk_gneezy/pages.py new file mode 100644 index 0000000..0ac24c7 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/pages.py @@ -0,0 +1,89 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1 + + + def vars_for_template(self): + self.player.task_start_19 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = round(time.time() - self.player.task_start_19,2) ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1 + + def vars_for_template(self): + self.player.task_start_20 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = round(time.time() - self.player.task_start_20,2) ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1 + +page_sequence = [ + L_risk11_qc, + M_risk11, + Jeu1End, + +] diff --git a/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/Jeu1End.html b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/Jeu1End.html new file mode 100644 index 0000000..ed925d8 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Deuxième Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la deuxième étape. + +
    Vous allez maintenant commencer la troisième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/L_risk11_qc.html b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/L_risk11_qc.html new file mode 100644 index 0000000..e9c6057 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/L_risk11_qc.html @@ -0,0 +1,88 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 1 +{% endblock %} + +{% block content %} + +
    +
    + + Ce jeu peut être pris en compte pour le calcul de vos gains. + +
    + {% include Constants.instructions_GP_template %} + + + +
    +
    + +

    + +

    Test de compréhension:

    + + +

    Si vous avez investi 6 ECUs dans le projet risqué :

    + +

    1) Combien d'ECUs avez-vous gardés ?

    + +

    {% formfield player.risk11_qc_a label="" %} +

    +

    2) Si l'investissement est un succès, + + quels sont les ECU en votre possession à la fin de ce jeu ? + + +

    +

    {% formfield player.risk11_qc_b label="" %} +

    +

    3) Si l'investissement est un échec, + + quels sont les ECU en votre possession à la fin de ce jeu ? + +

    +

    {% formfield player.risk11_qc_c label="" %} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/M_risk11.html b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/M_risk11.html new file mode 100644 index 0000000..ec29001 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/M_risk11.html @@ -0,0 +1,56 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 1 +{% endblock %} + +{% block content %} + + +
    +
    + + +

    + Votre choix : +

    +
    + +
    +
    + +
    +

    Veillez saisir le montant de votre investissement dans le projet (en ECUs) (un montant entre 0 et 10):

    +

    {% formfield player.risk11_a label="" %} +

    + +

    Ainsi, combien d'ECUs avez vous gardés (un montant entre 0 et 10) ?

    +

    {% formfield player.risk11_b label="" %} +

    + +

    + Note: la somme des deux montants doit être égale à 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/M_risk11_result.html b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 1 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/instructions.html b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/instructions.html new file mode 100644 index 0000000..5114de7 --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/templates/exp_e4c_fr_p2_risk_gneezy/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Résumé du jeu :

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/exp_e4c_fr_p2_risk_gneezy/tests.py b/exp_e4c_fr_p2_risk_gneezy/tests.py new file mode 100644 index 0000000..b0833ab --- /dev/null +++ b/exp_e4c_fr_p2_risk_gneezy/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + + diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/__init__.py b/exp_e4c_fr_p2bis_risk_gneezy_end/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/_builtin/__init__.py b/exp_e4c_fr_p2bis_risk_gneezy_end/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/models.py b/exp_e4c_fr_p2bis_risk_gneezy_end/models.py new file mode 100644 index 0000000..a76e67e --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/models.py @@ -0,0 +1,109 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_p2bis_risk_gneezy_end' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + + treatment = models.IntegerField() + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/pages.py b/exp_e4c_fr_p2bis_risk_gneezy_end/pages.py new file mode 100644 index 0000000..1d74f5e --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/pages.py @@ -0,0 +1,90 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 ==0 and self.participant.vars['versionexp'] == 1 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 1 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 1 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/Jeu1End.html b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/Jeu1End.html new file mode 100644 index 0000000..43c9c56 --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Troisième Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la troisième étape. + +
    Vous allez maintenant commencer la quatrième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/L_risk11_qc.html b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/L_risk11_qc.html new file mode 100644 index 0000000..ab02d08 --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/L_risk11_qc.html @@ -0,0 +1,84 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Test de compréhension:

    + + +

    Si vous avez investi 6 ECUs dans le projet risqué :

    + +

    1) Combien d'ECUs avez-vous gardés ?

    + +

    {% formfield player.risk11_qc_a label="" %} +

    +

    2) Si l'investissement est un succès, + + quels sont les ECU en votre possession à la fin de ce jeu ? + + +

    +

    {% formfield player.risk11_qc_b label="" %} +

    +

    3) Si l'investissement est un échec, + + quels sont les ECU en votre possession à la fin de ce jeu ? + +

    +

    {% formfield player.risk11_qc_c label="" %} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11.html b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11.html new file mode 100644 index 0000000..1f0ce09 --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Veillez saisir le montant de votre investissement dans le projet (en euros) (un montant entre 0 et 10):

    +

    {% formfield player.risk11_a label="" %} +

    + +

    Ainsi, combien d'euros avez vous gardés (un montant entre 0 et 10) ?

    +

    {% formfield player.risk11_b label="" %} +

    + +

    + Note: la somme des deux montants doit être égale à 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11_result.html b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11_result.html new file mode 100644 index 0000000..70bdd92 --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 2 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html new file mode 100644 index 0000000..5114de7 --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/templates/exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Résumé du jeu :

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/exp_e4c_fr_p2bis_risk_gneezy_end/tests.py b/exp_e4c_fr_p2bis_risk_gneezy_end/tests.py new file mode 100644 index 0000000..eaf4b8c --- /dev/null +++ b/exp_e4c_fr_p2bis_risk_gneezy_end/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + + if self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 1: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + diff --git a/exp_e4c_fr_p3_risk_binswanger/__init__.py b/exp_e4c_fr_p3_risk_binswanger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_fr_p3_risk_binswanger/_builtin/__init__.py b/exp_e4c_fr_p3_risk_binswanger/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_fr_p3_risk_binswanger/models.py b/exp_e4c_fr_p3_risk_binswanger/models.py new file mode 100644 index 0000000..22e285e --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/models.py @@ -0,0 +1,153 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_p3_risk_binswanger' + players_per_group = None + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'exp_e4c_fr_risk_p3_binswanger/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + + treatment = models.IntegerField() + + + riskqc_a = models.IntegerField( + choices=[ + [1, '12 ECUs'], + [2, '0 ECUs'], + [3, '4 ECUs'], + [4, '6 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '20 ECUs'], + [2, '0 ECUs'], + [3, '2 ECUs'], + [4, '12 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '2 ECUs'], + [3, '24 ECUs'], + [4, '8 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/exp_e4c_fr_p3_risk_binswanger/pages.py b/exp_e4c_fr_p3_risk_binswanger/pages.py new file mode 100644 index 0000000..8ad8d95 --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/pages.py @@ -0,0 +1,161 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +###### traitement 1 risk au début +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.treatment = self.player.participant.vars['treatment'] + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + else: + self.player.choicerisknn = "E" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + +####################################################### + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + def before_next_page(self): + + ########################### + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Risk_BinsWanger_result(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + +class Jeu2End(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +page_sequence = [ + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, + Jeu2End, +# Risk_BinsWanger_color, +# Risk_BinsWanger_result, +] diff --git a/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Jeu2End.html b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Jeu2End.html new file mode 100644 index 0000000..3f86457 --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Jeu2End.html @@ -0,0 +1,44 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Troisième Partie : Fin + {% endif %} + {% if player.id_in_group == 2 %} + Deuxième Partie : Fin + {% endif %} + +{% endblock %} + +{% block content %} +
    +
    + + + {% if player.id_in_group == 1 %} +

    + Vous avez terminé la troisième étape. + +
    Vous allez maintenant commencer la quatrième étape. + +

    + {% endif %} + {% if player.id_in_group == 2 %} +

    + Vous avez terminé la deuxième étape. + +
    Vous allez maintenant commencer la troisième étape. + +

    + {% endif %} + + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger.html b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger.html new file mode 100644 index 0000000..3925159 --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger.html @@ -0,0 +1,401 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 : Votre choix + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 : Votre choix + {% endif %} +{% endblock %} + +{% block content %} + + + +
    +
    + + + + +

    +Vous allez maintenant jouer au jeu pour de vrai. Le gain de ce jeu sera pris + en compte dans le gain final. +

    + + + +

    Veuillez maintenant choisir la situation que vous préférez le + plus parmi les choix suivants (A, B, C, D ou E). + +

    + +

    + +

    Merci de faire un choix

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    A
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    B
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    C
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    D
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    E
    (0 ECUs) (24 ECUs)
    + + + + + + + + + +




    + + + + +
    + + + +
    + + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_color.html b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_color.html new file mode 100644 index 0000000..e4129ed --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 : Choix de votre couleur + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 : Choix de votre couleur + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + +
    + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc.html b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..62dc8df --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc.html @@ -0,0 +1,471 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: + +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. + Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles + (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de + ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = {{ Constants.tauxchange}} €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera + enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + + + + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + + +
    (0 ECUs) (24 ECUs)
    + + + + + + + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, + avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc2.html b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..73c4137 --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc2.html @@ -0,0 +1,1159 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire de compréhension +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Maintenant, nous voulons tester si vous avez compris les instructions du jeu.

    + + +
    + +

    + Exemple 1: + +

    + + +

    Si vous avez choisi la situation B, puis la couleur Verte apparaît. + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + A + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    + + C + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + D + +
    (0 ECUs) (24 ECUs)
    + + + + + + +

    + Quels seraient vos gains?

    + + {% formfield player.riskqc_a label="" %} + +

    + + + +

    + Example 2: +

    + + +

    Si vous avez choisi la situation D, puis la couleur Rouge apparaît. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + + + + + + + + +

    + Question 2: Quels seraient vos gains?

    + + {% formfield player.riskqc_b label="" %} + +

    + + + +

    + + Example 3: +

    + + +

    Si vous avez choisi la situation E, puis la couleur Rouge apparaît. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + + + + + + +

    + Question 3: Quels seraient vos gains?

    + + {% formfield player.riskqc_c label="" %} + +

    + + + + + +




    + + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_result.html b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_result.html new file mode 100644 index 0000000..f84fc9f --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/templates/exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_result.html @@ -0,0 +1,58 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + + {% if player.id_in_group == 1 %} + Gain Jeu 2 : Détails + {% endif %} + {% if player.id_in_group == 2 %} + Gain Jeu 1 : Détails + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    Votre choix était : {{ player.choicerisknn }}

    + +

    La couleur sélectionné est : {{ player.colorselectnn }}

    + + +

    Votre gain pour ce jeu est : {{ player.gainrisk }} ECU(s)

    + + +

    Votre gain pour ce jeu est : {{ player.gainriskeur }} ECU(s)

    + +

    -----------------------------------------

    + +
    + + + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + +{% endblock %} + + diff --git a/exp_e4c_fr_p3_risk_binswanger/tests.py b/exp_e4c_fr_p3_risk_binswanger/tests.py new file mode 100644 index 0000000..a49c6ce --- /dev/null +++ b/exp_e4c_fr_p3_risk_binswanger/tests.py @@ -0,0 +1,30 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['versionexp'] == 1: + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 5), + }) + + yield (pages.Jeu2End) + + + diff --git a/exp_e4c_fr_p5_questfin/__init__.py b/exp_e4c_fr_p5_questfin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_fr_p5_questfin/_builtin/__init__.py b/exp_e4c_fr_p5_questfin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_fr_p5_questfin/models.py b/exp_e4c_fr_p5_questfin/models.py new file mode 100644 index 0000000..1c0814b --- /dev/null +++ b/exp_e4c_fr_p5_questfin/models.py @@ -0,0 +1,631 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C + +version: FR +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_p5_questfin' + players_per_group = None + num_rounds = 1 + + showupfee = 5 + + instructions_GP_template = 'exp_e4c_fr_p5_questfin/instructions.html' + instructions_BW_template = 'exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + treatmentname = p.treatmentname, + jeu_tire=p.jeu_tire, + jeuname = p.jeuname, + gainfinal=p.gainfinal, + gaineur=p.gaineur, + gainfinaleur=p.gainfinaleur, + )) + return dict(report=report) + + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + + treatment = models.IntegerField() + treatmentname = models.StringField() + + + + langue = models.StringField() + langue_nn = models.IntegerField() + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + +######### var jeu Binswanger + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts et/ou littérature'], + [2, '2- Economie et/ou gestion'], + [3, '3- Scientifique / ingénierie'], + [4, '4- Autre'], + ], + widget=widgets.RadioSelect, + label="a. Votre domaine d’étude ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Femme'], + [2, '2- Homme'], + [3, '3- Non-binaire'], + [4, '4- Ne souhaite pas répondre'], + ], + widget=widgets.RadioSelect, + label="b. Vous êtes ", + blank=False + ) + + q_42_age = models.IntegerField( + label="c. Quel âge avez-vous ?", + blank=False, + min=15, + max=100, + ) + + q_43_nationalite = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + blank=False, + label="d. Pays de nationalité ", + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Inférieur à 5 000 Euros'], + [2, '2- Entre 5 000 et 10 000 Euros'], + [3, '3- Entre 10 000 et 15 000 Euros '], + [4, '4- Entre 15 000 et 20 000 Euros '], + [5, '5- Entre 20 000 et 25 000 Euros '], + [6, '6- Supérieur à 25 000 Euros '], + ], + widget=widgets.RadioSelect, + label="e. Veuillez estimer votre revenu annuel brut (y compris vos bourses d'études et votre prêt étudiant) en Euros. ", + blank=False + ) + + # q_45_logement_pays = models.StringField( + # label="Pays - précédent logement ", + # blank=False + # ) + + q3_countries = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + label="f. Pays - précédent logement ", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="g. Ville - précédent logement ", + blank=False + ) + + q_31 = models.IntegerField() # nbre d'enfant ##### a changer q_31_enfant + + q_47_residence = models.IntegerField( + label="i. Vous habitez actuellement dans :", + choices=[ + [1, 'Le Bâtiment 103'], + [2, 'Une autre résidence'], + ], + widget=widgets.RadioSelect, + blank=False + ) + + q_48_satisfaction = models.IntegerField( + choices=[ + [1, '1 - Très satisfait(e)'], + [2, '2 - Satisfait(e)'], + [3, '3 - Insatisfait(e)'], + [4, '4 - Très insatisfait(e)'], + ], + widget=widgets.RadioSelect, + label="j. Quel est votre niveau de satisfaction concernant votre lieu de résidence ", + blank=True + ) + + + q_49_propositions = models.StringField( + label="k. Avez-vous des idées ou propositions d'améliorations " + "concernant votre lieu de résidence ? ", + + blank=True + ) + + + +### jeu 2 : Gneezy&Potters + tirageriskresult_j1 = models.StringField() + risk11_a_j1 = models.FloatField() + risk11_b_j1 = models.FloatField() + gainrisk_j1 = models.FloatField() + + + tirageausort = models.FloatField() + + jeu_tire = models.IntegerField() + gainfinal = models.FloatField() + + + #gainfinalecu = models.FloatField() + #gainfinalplushowup = models.FloatField() + gaineur = models.FloatField() + gainfinaleur = models.FloatField() + + gainfinaleur_v1 = models.FloatField() + + jeuname = models.StringField() + + lastname = models.StringField( + label="Nom", + blank=False + ) + + firstname = models.StringField( + label="Prénom", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Numéro de logement", + blank=False + ) + + + + + diff --git a/exp_e4c_fr_p5_questfin/pages.py b/exp_e4c_fr_p5_questfin/pages.py new file mode 100644 index 0000000..c40b894 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/pages.py @@ -0,0 +1,189 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.treatment = self.player.participant.vars['treatment'] + if self.player.treatment == 1: + self.player.treatmentname ='GP - BW' + elif self.player.treatment == 2: + self.player.treatmentname ='BW - GP' + + + ########################### + + self.player.choicerisk = self.participant.vars['choicerisk'] + self.player.choicerisknn = self.participant.vars['choicerisknn'] + + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_age', + 'q_43_nationalite', 'q_44_revenu', + 'q3_countries', 'q_46_logement_ville', 'q_31', + 'q_47_residence', 'q_48_satisfaction', 'q_49_propositions' + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + def before_next_page(self): + ### jeu 2 : risk Binswanger + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.player.colorselectnn = self.participant.vars['colorselectnn'] + self.player.gainrisk = self.participant.vars['gainrisk'] + self.player.gainriskeur = self.participant.vars['gainriskeur'] + + ### jeu 1 : Gneezy_Potters + + self.player.tirageriskresult_j1 = self.participant.vars['tirageriskresult_j1'] + self.player.risk11_a_j1 = self.participant.vars['risk11_a_j1'] + self.player.risk11_b_j1 = self.participant.vars['risk11_b_j1'] + self.player.gainrisk_j1 = self.participant.vars['gainrisk_j1'] + + + self.player.tirageausort = round(random.random(), 2) + + if self.player.treatment == 1 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 1 + self.player.jeuname = "GP" + else: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 2 + self.player.jeuname = "BW" + + if self.player.treatment == 2 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 1 + self.player.jeuname = "BW" + else: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 2 + self.player.jeuname = "GP" + + + #self.player.gainfinalplushowup = self.player.gainfinal + Constants.showupfee + + self.player.gaineur = round(self.player.gainfinal * Constants.tauxchange,1) + + self.player.gainfinaleur = round(self.player.gaineur + Constants.showupfee,1) + + if (self.player.gainfinaleur * 100) % 100 <= 50 and (self.player.gainfinaleur * 100) % 100 > 0 : + self.player.gainfinaleur_v1 = ((round(((self.player.gainfinaleur * 100) - ((self.player.gainfinaleur * 100) % 100)), 0) + 50) / 100) * 1000 + else: + self.player.gainfinaleur_v1 = (round((self.player.gainfinaleur), 0))*1000 + + self.player.payoff = self.player.gainfinaleur_v1 + +class Result(Page): + form_model = 'player' + form_fields = [ + 'lastname', + 'firstname', + 'email', + 'room', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + def before_next_page(self): + self.player.participant.vars['treatmentname'] = self.player.treatmentname + self.player.participant.vars['jeu_tire'] = self.player.jeu_tire + self.player.participant.vars['jeuname'] = self.player.jeuname + self.player.participant.vars['gainfinal'] = self.player.gainfinal + self.player.participant.vars['gaineur'] = self.player.gaineur + self.player.participant.vars['gainfinaleur'] = self.player.gainfinaleur + self.player.participant.vars['lastname'] = self.player.lastname + self.player.participant.vars['firstname'] = self.player.firstname + self.player.participant.vars['email'] = self.player.email + self.player.participant.vars['room'] = self.player.room + + + + + + +page_sequence = [ + Risk_BinsWanger_color, + Questionnaire4, + Result, + + +] diff --git a/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/AdminReport.html b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/AdminReport.html new file mode 100644 index 0000000..ac7e0a5 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/AdminReport.html @@ -0,0 +1,35 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label Treatment name Jeu tire Jeu name Gain (Ecus) Gain (€) gain final (gain+bonus) (€)
    {{ row.id }}{{ row.label }} {{row.treatmentname}}{{ row.jeu_tire }} {{row.jeuname}}{{ row.gainfinal }}{{ row.gaineur }}{{ row.gainfinaleur }}
    + diff --git a/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Questionnaire4.html b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Questionnaire4.html new file mode 100644 index 0000000..e27a1c1 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Questionnaire4.html @@ -0,0 +1,102 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire Final +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    + +
    +
    + + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_age%} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
    +

    + + Indiquez la Ville et le Pays où était votre précédent logement : +

    + {% formfield player.q3_countries %} + + + {% formfield player.q_46_logement_ville %} + + + +
    +
    + + +

    +
    + + + {% formfield player.q_47_residence %} + + {% formfield player.q_48_satisfaction %} + + {% formfield player.q_49_propositions %} + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Result.html b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Result.html new file mode 100644 index 0000000..4c2b8d8 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Result.html @@ -0,0 +1,60 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + QUESTIONNAIRE FINAL + +{% endblock %} + +{% block content %} +
    +
    + +
    +
    + Informations Utiles pour recevoir votre gain : + +
    +
    + +
    + +
    +
    + +

    + Merci de bien remplir les champs suivants afin de pouvoir récupérer la somme que vous avez gagnée durant cette expérience. + {% formfield player.lastname %} + {% formfield player.firstname %} + {% formfield player.email %} + {% formfield player.room %} + +

    + +

    + Rappel pour ceux qui ne se sont pas encore inscrits : pour recevoir votre gain vous devez vous inscrire dans la liste + des participants volontaires via le lien : + +

    http://orsee.labeds.fr/public/

    +
    Note : Vos données personnelles sont strictement confidentielles. + Toutes vos réponses seront traitées anonymement. +
    + +

    + +
    +
    + +

    {% next_button %}

    + + + +{% endblock %} + + + diff --git a/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Risk_BinsWanger_color.html b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Risk_BinsWanger_color.html new file mode 100644 index 0000000..5fb7fc4 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + {% if player.id_in_group == 1 %} + Choix de votre couleur (pour le jeu 2) + {% endif %} + {% if player.id_in_group == 2 %} + Choix de votre couleur (pour le jeu 1) + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + + + + +
    + +

    + + + + + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..98be971 --- /dev/null +++ b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = … €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/instructions.html b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/exp_e4c_fr_p5_questfin/templates/exp_e4c_fr_p5_questfin/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/exp_e4c_fr_p5_questfin/tests.py b/exp_e4c_fr_p5_questfin/tests.py new file mode 100644 index 0000000..551851d --- /dev/null +++ b/exp_e4c_fr_p5_questfin/tests.py @@ -0,0 +1,39 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.participant.vars['versionexp'] == 1: + yield (pages.Risk_BinsWanger_color, { + 'tc3': '1;;0.3', + }) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_age': random.randint(18, 40), + 'q_43_nationalite': 5, + 'q_44_revenu': 1, + 'q3_countries': 1, + 'q_46_logement_ville': 'fr', + 'q_31': 3, + 'q_47_residence': 1, + 'q_48_satisfaction': 2, + 'q_49_propositions': 'sasasadad' + }) + + yield (pages.Result, { + 'lastname': 'a', + 'firstname': 'b', + 'email': '@', + 'room': 'a', + }) + + diff --git a/exp_e4c_x_fr_en_fin/__init__.py b/exp_e4c_x_fr_en_fin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/exp_e4c_x_fr_en_fin/_builtin/__init__.py b/exp_e4c_x_fr_en_fin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/exp_e4c_x_fr_en_fin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/exp_e4c_x_fr_en_fin/models.py b/exp_e4c_x_fr_en_fin/models.py new file mode 100644 index 0000000..df7dd94 --- /dev/null +++ b/exp_e4c_x_fr_en_fin/models.py @@ -0,0 +1,85 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C + +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_x_fr_en_fin' + players_per_group = None + num_rounds = 1 + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + lastname = p.lastname, + firstname =p.firstname, + #email =p.email, + room =p.room , + language =p.language, + treatmentname = p.treatmentname, + jeu_tire=p.jeu_tire, + jeuname = p.jeuname, + gainfinal=p.gainfinal, + gaineur=p.gaineur, + gainfinaleur=p.gainfinaleur, + gain_ff = p.gain_ff + )) + return dict(report=report) + + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + + lastname = models.StringField( + label="Nom", + blank=False + ) + + firstname = models.StringField( + label="Prénom", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Numéro de logement", + blank=False + ) + language = models.StringField() + treatmentname = models.StringField() + jeu_tire = models.IntegerField() + jeuname = models.StringField() + gainfinal = models.FloatField() + gaineur = models.FloatField() + gainfinaleur = models.FloatField() + + gain_ff = models.FloatField() + + + + + diff --git a/exp_e4c_x_fr_en_fin/pages.py b/exp_e4c_x_fr_en_fin/pages.py new file mode 100644 index 0000000..55ad560 --- /dev/null +++ b/exp_e4c_x_fr_en_fin/pages.py @@ -0,0 +1,50 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + + +class Pass(Page): + timeout_seconds = 0 # WB + + form_model = 'player' + + def before_next_page(self): + + + self.player.treatmentname = self.player.participant.vars['treatmentname'] + self.player.jeu_tire = self.player.participant.vars['jeu_tire'] + self.player.jeuname = self.player.participant.vars['jeuname'] + self.player.gainfinal = self.player.participant.vars['gainfinal'] + self.player.gaineur = self.player.participant.vars['gaineur'] + self.player.gainfinaleur = self.player.participant.vars['gainfinaleur'] + + + self.player.lastname = self.player.participant.vars['lastname'] + self.player.firstname = self.player.participant.vars['firstname'] + self.player.email = self.player.participant.vars['email'] + self.player.room = self.player.participant.vars['room'] + self.player.language = self.player.participant.vars['language'] + + + + if (self.player.gainfinaleur * 100) % 100 <= 50 and (self.player.gainfinaleur * 100) % 100 > 0 : + self.player.gain_ff = (round(((self.player.gainfinaleur * 100) - ((self.player.gainfinaleur * 100) % 100)), 0) + 50) / 100 + else: + self.player.gain_ff = round((self.player.gainfinaleur), 0) + +class Fin(Page): + timeout_seconds = 300 # WB + + form_model = 'player' + + +page_sequence = [ + Pass, + Fin, + + +] diff --git a/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/AdminReport.html b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/AdminReport.html new file mode 100644 index 0000000..467e6ca --- /dev/null +++ b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/AdminReport.html @@ -0,0 +1,47 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label lastname firstname room language Treatment name Jeu tire Jeu name Gain (Ecus) Gain (€) gain final (gain+bonus) (€) gain_ff (arrondi)
    {{ row.id }}{{ row.label }} {{ row.lastname }} {{ row.firstname }} {{ row.room }} {{ row.language }} {{row.treatmentname }}{{ row.jeu_tire }} {{row.jeuname }}{{ row.gainfinal }}{{ row.gaineur }}{{ row.gainfinaleur }}{{ row.gain_ff }}
    \ No newline at end of file diff --git a/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Fin.html b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Fin.html new file mode 100644 index 0000000..6201dbb --- /dev/null +++ b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Fin.html @@ -0,0 +1,113 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% if player.language == "FR"%} + GAIN FINAL +{% endif %} + +{% if player.language == "EN"%} + FINAL GAIN +{% endif %} + +{% endblock %} + +{% block content %} + + + +{% if player.language == "FR"%} + +
    +
    + +
    +
    + NB : Vous devez imprimer ou prendre une capture d'écran de cette page et nous la présenter lors de la récupération de votre rémunération !! +
    +
    + +
    + +
    +
    + +

    Jeu sélectionné : Jeu {{ player.jeu_tire}} +
    + Gain jeu (en ECUs): {{player.gainfinal}} +
    + Gain jeu (en €) : {{player.gaineur}} +

    + Gain jeu + rémunération fixe (en €) : {{player.gainfinaleur}} + +

    +
    -------------------------------------------
    + + +

    Informations sur le participant :

    +

    Nom : {{player.lastname}} +
    Prénom : {{player.firstname}} + + + + +

    Un mail vous sera envoyé dès que possible pour vous indiquer comment récupérer votre gain en cash.

    + + +
    +
    + +{% endif %} + + +{% if player.language == "EN"%} + +
    +
    + +
    +
    +NB: You must print or take a screenshot of this page and present it to us when collecting your compensation !!
    +
    + +
    + +
    +
    + +

    Selected game : Game {{ player.jeu_tire}} +
    + Gain of the game (ECUs): {{player.gainfinal}} +
    + Gain of the game (€) : {{player.gaineur}} +

    + Gain + bonus (€) : {{player.gainfinaleur}} + +

    +
    -------------------------------------------
    + + +

    Participant's information:

    +

    Last name : {{player.lastname}} +
    First name : {{player.firstname}} + + + + +

    An email will be sent to you as soon as possible to tell you how to get your cash winnings.

    + +
    +
    + +{% endif %} + + + + + +

    {% next_button %}

    + + + +{% endblock %} diff --git a/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Pass.html b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Pass.html new file mode 100644 index 0000000..0481f99 --- /dev/null +++ b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Pass.html @@ -0,0 +1,22 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Please wait! + +{% endblock %} + +{% block content %} + + +{% endblock %} diff --git a/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Risk_BinsWanger_qc.html b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..98be971 --- /dev/null +++ b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = … €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/instructions.html b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/exp_e4c_x_fr_en_fin/templates/exp_e4c_x_fr_en_fin/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/exp_e4c_x_fr_en_fin/tests.py b/exp_e4c_x_fr_en_fin/tests.py new file mode 100644 index 0000000..7aec6b4 --- /dev/null +++ b/exp_e4c_x_fr_en_fin/tests.py @@ -0,0 +1,23 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + yield Submission( + pages.Pass, + check_html=False + ) + + yield (pages.Fin) + + + + diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..d6f4caa --- /dev/null +++ b/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +import os +import sys + + +if __name__ == "__main__": + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") + + from otree.management.cli import execute_from_command_line + + execute_from_command_line(sys.argv, script_file=__file__) diff --git a/old_versions/__init__.py b/old_versions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/__init__.py b/old_versions/exp_e4c_en_questionnaire_final_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/_builtin/__init__.py b/old_versions/exp_e4c_en_questionnaire_final_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/models.py b/old_versions/exp_e4c_en_questionnaire_final_v2/models.py new file mode 100644 index 0000000..1c5fe5e --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/models.py @@ -0,0 +1,153 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p5_questfin' + players_per_group = 2 + num_rounds = 1 + + showupfee = 5 + + instructions_GP_template = 'exp_e4c_en_p2_risk_gneezy/instructions.html' + instructions_BW_template = 'exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html' + + gainriskAred = 4 + gainriskBred = 3 + gainriskCred = 2 + gainriskDred = 1 + gainriskEred = 0 + + gainriskAgreen = 4 + gainriskBgreen = 6 + gainriskCgreen = 8 + gainriskDgreen = 10 + gainriskEgreen = 12 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + jeu_tire=p.jeu_tire, + gainfinal=p.gainfinal, + gainfinalplushowup=p.gainfinalplushowup, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + langue = models.StringField() + langue_nn = models.IntegerField() + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + +######### var jeu Binswanger + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() ### jeu 1 : Binswanger + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + colorselect = models.IntegerField() ### jeu 1 : Binswanger + colorselectnn = models.StringField() + gainrisk = models.FloatField() ### jeu 1 : Binswanger + gainriskeur = models.FloatField() ### jeu 1 : Binswanger + gainriskeurfinal = models.FloatField() + + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts and / or literature'], + [2, '2- Economy and / or management'], + [3, '3- Scientific / engineering'], + [4, '4- Other'], + ], + widget=widgets.RadioSelect, + label="Your field of study ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Woman'], + [2, '2- Male'], + [3, '3- Non-binary'], + [4, '4- Do not wish to answer'], + ], + widget=widgets.RadioSelect, + label="You are ", + blank=False + ) + + + q_42_annee_naissance = models.IntegerField( + label="What is your year of birth?", + blank=False, + min=1900, + max=2019 + ) + + q_43_nationalite = models.StringField( + label="Your nationality", + blank=False + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Less than 5,000 Euros'], + [2, '2- Between 5,000 and 10,000 Euros'], + [3, '3- Between 10,000 and 15,000 Euros'], + [4, '4- Between 15,000 and 20,000 Euros'], + [5, '5- Between 20,000 and 25,000 Euros'], + [6, '6- Greater than 25,000 Euros'], + ], + widget=widgets.RadioSelect, + label="Please estimate your gross annual income (including your scholarships and student loan) in Euros.", + blank=False + ) + + q_45_logement_pays = models.StringField( + label="City - previous accommodation", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="Country - previous accommodation", + blank=False + ) + + +### jeu 2 : Gneezy&Potters + tirageriskresult_j1 = models.StringField() + risk11_a_j1 = models.FloatField() + risk11_b_j1 = models.FloatField() + gainrisk_j1 = models.FloatField() + + + tirageausort = models.FloatField() + + gainfinal = models.FloatField() + jeu_tire = models.IntegerField() + gainfinalecu = models.FloatField() + gainfinalplushowup = models.FloatField() + diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/pages.py b/old_versions/exp_e4c_en_questionnaire_final_v2/pages.py new file mode 100644 index 0000000..dc51c3b --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/pages.py @@ -0,0 +1,137 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def vars_for_template(self): + pass + + def before_next_page(self): + self.player.choicerisk = self.participant.vars['choicerisk'] + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_annee_naissance', 'q_43_nationalite', 'q_44_revenu', + 'q_45_logement_pays', 'q_46_logement_ville'] + + def before_next_page(self): + ### jeu 2 : risk Binswanger + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.player.colorselectnn = self.participant.vars['colorselectnn'] + self.player.gainrisk = self.participant.vars['gainrisk'] ### + self.player.gainriskeur = self.participant.vars['gainriskeur'] #### + + ### jeu 1 : Gneezy_Potters + self.player.tirageriskresult_j1 = self.participant.vars['tirageriskresult_j1'] + self.player.risk11_a_j1 = self.participant.vars['risk11_a_j1'] + self.player.risk11_b_j1 = self.participant.vars['risk11_b_j1'] + self.player.gainrisk_j1 = self.participant.vars['gainrisk_j1'] + + + self.player.tirageausort = round(random.random(), 2) + + if self.player.id_in_group == 1 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 1 + else: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 2 + + if self.player.id_in_group == 2 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 1 + else: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 2 + + + self.player.gainfinalplushowup = self.player.gainfinal + Constants.showupfee + + self.player.payoff = self.player.gainfinal + Constants.showupfee + + +class Result(Page): + form_model = 'player' + form_fields = [] + + +page_sequence = [ + Risk_BinsWanger_color, + Questionnaire4, + Result, + + +] diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/AdminReport.html b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/AdminReport.html new file mode 100644 index 0000000..80f3c3c --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/AdminReport.html @@ -0,0 +1,27 @@ +{% load otree %} + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label Jeu tire Gain sans showupfee Gain final
    {{ row.id }}{{ row.label }}{{ row.jeu_tire }}{{ row.gainfinal }}{{ row.gainfinalplushowup }}
    + diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Questionnaire4.html b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Questionnaire4.html new file mode 100644 index 0000000..3bb6716 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Questionnaire4.html @@ -0,0 +1,70 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +Final Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account in the calculation of + your earnings. We nevertheless ask you to respond as sincerely as possible. + As a reminder, all your responses will be treated anonymously, and no one + will not have access to your answers. + +

    +
    +
    + + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_annee_naissance %} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
    +

    + +Indicate the City and Country where your previous accommodation was: +

    + {% formfield player.q_45_logement_pays %} + {% formfield player.q_46_logement_ville %} + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Result.html b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Result.html new file mode 100644 index 0000000..01b3c13 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Result.html @@ -0,0 +1,150 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + FINAL GAIN + +{% endblock %} + +{% block content %} +
    +
    +
    Draw: +
    Selected game: Game {{player.jeu_tire}} +

    + Game gain: {{player.gainfinal}} ECU(s) +

    + Final gain (Game gain + fixed remuneration): {{player.gainfinalplushowup}} ECU(s) +

    +
    +
    + +

    {% next_button %}

    + + + +{% if player.id_in_group == 1%} + {% if player.jeu_tire == 1%} +
    +
    +

    Game 1: RESULT Details

    +

    The draw is: {{player.tirageriskresult_j1}} +

    +

    Your investment in risky asset: {{player.risk11_a_j1}} ECU (s)

    +

    You have kept: {{player.risk11_b_j1}} ECU (s)

    +
    +

    Your winnings for this game are: {{player.gainrisk_j1}} ECU (s)

    +

    + +
    +
    +

    +

    +Reminder of the instructions: +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + {% endif %} + + + {% if player.jeu_tire == 2%} +
    +
    +

    Game 2: RESULT Details

    +

    Your choice was: {{player.choicerisknn}}

    +

    The selected color is: {{player.colorselectnn}}

    +

    Your winnings for this game are: {{player.gainrisk}} ECU (s)

    +
    +
    +
    +

    +

    + Reminder of the instructions: +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + {% endif %} +{% endif %} + + + + + +{% if player.id_in_group == 2%} + + {% if player.jeu_tire == 1%} +
    +
    +

    Game 1: RESULT Details

    +

    Your choice was: {{player.choicerisknn}}

    +

    The selected color is: {{player.colorselectnn}}

    +

    Your winnings for this game are: {{player.gainrisk}} ECU (s)

    +
    +
    +
    +

    +

    + Reminder of the instructions: +

    + Rappel des instructions : + +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + {% endif %} + + + {% if player.jeu_tire == 2%} +
    +
    +

    Game 2: RESULT Details

    +

    The draw is: {{player.tirageriskresult_j1}} +

    +

    Your investment in risky asset: {{player.risk11_a_j1}} ECU (s)

    +

    You have kept: {{player.risk11_b_j1}} ECU (s)

    +
    +

    Your winnings for this game are: {{player.gainrisk_j1}} ECU (s)

    +

    + +
    +
    +

    +

    + Reminder of the instructions: +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + {% endif %} + + + +{% endif %} + + + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Risk_BinsWanger_color.html b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Risk_BinsWanger_color.html new file mode 100644 index 0000000..9d3b0df --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Risk_BinsWanger_color.html @@ -0,0 +1,174 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + {% if player.id_in_group == 1 %} + Choice of your color (game 2) + {% endif %} + {% if player.id_in_group == 2 %} + Choice of your color (game 1) + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + +

    Please choose between the following two buttons:

    + +

    A color (red or green) is hidden behind each button. + When you click on one of the buttons, its color appears. + If the color that appears is green, you will receive the green wins + from the selection you made at the start. + If it is red, you will receive the red winnings.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + + +
    + + + + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Risk_BinsWanger_qc.html b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..c6be2d0 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Game 2 + {% endif %} + {% if player.id_in_group == 2 %} + Game 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    +This game can be taken into account when calculating your gains.

    + +
    +
    + + + + + +

    + Rules of the game: + +

    + +

    + Look at the table below. It presents 5 different situations. Look at them carefully. + Situations A, B, C, D and E contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

    + +

    +At the end of the game, the ECU you have won will be converted into € using the following rule:

    +

    +

    1 ECU =… €
    +

    + +

    +So you will first have to choose the situation you prefer the most: A, B, C, D or E.

    + +

    + +

    Warning! The image below is an example, your choice will be saved later.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + +Second, your color will be revealed to you, at the end of the experiment , with the following process: + +
    You will choose between two buttons that look like this: + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    After clicking one of the buttons, a red or green color will appear. This color will determine your winnings.

    +

    There is a 50% chance that the color red will be behind the left or right button. The same probability applies + for the color green.

    +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/instructions.html b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/templates/exp_e4c_en_questionnaire_final_v2/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/old_versions/exp_e4c_en_questionnaire_final_v2/tests.py b/old_versions/exp_e4c_en_questionnaire_final_v2/tests.py new file mode 100644 index 0000000..c19263a --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_final_v2/tests.py @@ -0,0 +1,26 @@ +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Risk_BinsWanger_color, { + 'tc3': '1;;0.3', + }) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_annee_naissance': 1999, + 'q_43_nationalite': 'fr', + 'q_44_revenu': 1, + 'q_45_logement_pays': 'fr', + 'q_46_logement_ville': 'fr', + }) + + yield (pages.Result) diff --git a/old_versions/exp_e4c_en_questionnaire_v2/__init__.py b/old_versions/exp_e4c_en_questionnaire_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_en_questionnaire_v2/_builtin/__init__.py b/old_versions/exp_e4c_en_questionnaire_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_en_questionnaire_v2/models.py b/old_versions/exp_e4c_en_questionnaire_v2/models.py new file mode 100644 index 0000000..34a297f --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/models.py @@ -0,0 +1,773 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p1_quest' + players_per_group = 2 + num_rounds = 1 + + showupfee = 0 + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + q_1 = models.IntegerField( + choices=[ + [0, '0%'], + [1, '10%'], + [2, '20%'], + [3, '30%'], + [4, '40%'], + [5, '50%'], + [6, '60%'], + [7, '70%'], + [8, '80%'], + [9, '90%'], + [10, '100%'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_g = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_6 = models.IntegerField( + choices=[ + + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drink coffee (or the) at school/work'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t use batteries'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_17 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_19 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_20 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_20_a = models.IntegerField( + label="", + blank=True + ) + + q_20_b = models.StringField( + label="", + blank=True + ) + + q_21 = models.IntegerField( + choices=[ + [1, 'a- Green (100% electric or hybrid) (€26 per ride)'], + [2, 'b- UberX (Economical, fast and reliable) (at €22 per ride) '], + [3, 'c- Comfort (spacious vehicles and top rated drivers) (at €30 per ride)'], + + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_24 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drive'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_28 = models.IntegerField( + choices=[ + [0, 'Yes'], + [1, 'No'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_28_a = models.StringField( + label="If yes which one? ", + blank=True + ) + + q_29 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_30_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_31 = models.IntegerField() + + q_32 = models.IntegerField( + choices=[ + [0, 'Yes'], + [1, 'No'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_33_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_34 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_35 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_37 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_38_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_38_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_38_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + diff --git a/old_versions/exp_e4c_en_questionnaire_v2/pages.py b/old_versions/exp_e4c_en_questionnaire_v2/pages.py new file mode 100644 index 0000000..f04a258 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/pages.py @@ -0,0 +1,53 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', 'q_2_e', 'q_2_f', 'q_2_g', 'q_2_h', + 'q_3', 'q_4', 'q_6', 'q_8', 'q_9', 'q_10', 'q_11', 'q_12' + + ] + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_13', 'q_14', 'q_15', 'q_16', 'q_17', 'q_18', 'q_19', 'q_20', 'q_20_a','q_20_b', 'q_21', + 'q_22', 'q_23', 'q_24' + ] + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_25', 'q_26', 'q_27', 'q_28', 'q_28_a', 'q_29', 'q_30_a', 'q_30_b', + 'q_30_c', 'q_30_d', 'q_31', 'q_32', + 'q_33_a', 'q_33_b', 'q_33_c', 'q_33_d', 'q_33_e', 'q_33_f', 'q_34', 'q_35' + + ] + +class Questionnaire3(Page): + form_model = 'player' + form_fields = [ 'q_37', 'q_38_a', 'q_38_b', 'q_38_c'] + +class QuestionnaireEnd(Page): + pass + + +page_sequence = [ + Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + Questionnaire3, + QuestionnaireEnd, + + +] diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/AdminReport.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/AdminReport.html new file mode 100644 index 0000000..2bfb8af --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/AdminReport.html @@ -0,0 +1,22 @@ +{% load otree %} + + + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant ID Participant Label Note
    {{ row.id }}{{ row.label }}
    diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Bienvenue.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Bienvenue.html new file mode 100644 index 0000000..3430048 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Bienvenue.html @@ -0,0 +1,60 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Experiment in economics +{% endblock %} + +{% block content %} + + +
    +
    + +

    Welcome

    + +

    + Thank you for agreeing to participate in this experience. A fixed remuneration (of 5 €) will be paid to you + at the end of the experience for your participation, regardless of your answers during + this experience. To this will be added variable compensation linked to your answers to the course + experience. +

    + +

    + + The experience lasts about 30 minutes. It consists of two types of tasks : questionnaires and games. + The variable remuneration that you will receive at the end of the experience will not depend on your answers to the questionnaires. + Indeed, in these questionnaires, there is neither right nor wrong answer. On the other hand, your variable remuneration will depend on the quality of your answers to the games. +Specifically, at the end of the experiment, only one of the games will be randomly selected to be paid for for real. +
    The currency used in this experiment is the ECU. +

    Exchange rate 1 ECU =… € .
    + +
    + Important: All your answers will be treated anonymously. No one will be able + to directly identify your decisions. + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire0.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire0.html new file mode 100644 index 0000000..c460ec3 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire0.html @@ -0,0 +1,197 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

    +
    +
    + +

    + 1) What percentage of organic and/or ecological products do you usually buy? + {% formfield player.q_1 %} +

    + +
    +

    + 2) For each of the following criteria, please indicate if it can influence your choice to buy a product: + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a. price
    Strongly disagree {% formfield player.q_2_a %} Strongly agree
    b. origin
    Strongly disagree {% formfield player.q_2_b %} Strongly agree
    c. quality and/or taste
    Strongly disagree {% formfield player.q_2_c %} Strongly agree
    d. A label
              * organic label +
    An organic product is a product from organic farming (it is an agricultural production + method that excludes the use of most synthetic chemicals, toxic products, etc.). + There is a label (AB) in France that authenticates products from this method of + agriculture. +
            Strongly disagree {% formfield player.q_2_e %} Strongly agree
              * ecological label +
    An ecological product is a product that will be thought out, designed, + packaged, distributed, recycled in such a way as to minimize the impact on the environment. + It must comply with many rules related to these steps during specifications drawn up by + an organization such as ECOLABEL or ECOCERT. +An ecological product must be designed with maximum respect for the environment + (respect linked to the use of raw materials and machines during manufacture). + The life cycle of the product as well as its recycling are also important points + to consider. +
            Strongly disagree {% formfield player.q_2_f %} Strongly agree
              * equitable trade label +
    Equitable trade is a commercial and international partnership, based on concrete principles and launched + almost 20 years ago. Its objective is to be able to guarantee a better balance between + producers and resellers, by ensuring better working conditions and better remuneration + for small producers. +
            Strongly disagree {% formfield player.q_2_g %} Strongly agree
              * other label
    (if yes, to indicate)
    {% formfield player.q_2_h %}
    +

    + +

    + 3) Do you shop online (including clothes shopping)? + {% formfield player.q_3 %} +

    + +

    + 4) Do you think it is less environmentally friendly to shop online rather than in shop? + + + + + + + + +
    Strongly disagree {% formfield player.q_4 %} Strongly agree
    +

    + +

    + 5) Do you bring your own cup of coffee (tea) to school/work (instead of using the + cups from the coffee machine)? + {% formfield player.q_6 %} +

    + + +

    + 6) Do you sort your household waste? + {% formfield player.q_8 %} +

    + +

    + 7) Do you use a compost bin? + {% formfield player.q_9 %} +

    +

    + 8) Do you collect and recycle used paper? + {% formfield player.q_10 %} +

    + +

    + 9) Do you reuse your shopping bags? + {% formfield player.q_11 %} +

    + +

    + 10) Do you return used batteries to appropriate recycling points? + {% formfield player.q_12 %} +

    + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire1.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire1.html new file mode 100644 index 0000000..4d7ce9e --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire1.html @@ -0,0 +1,161 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

    +
    +
    + +

    + 11) When buying new electronic devices, do you make sure to buy the ones that use the least amount of energy? + {% formfield player.q_13 %} +

    + +

    + 12) Do you switch off or completely disconnect electrical devices when not in use (without using the + standby mode)? + {% formfield player.q_14 %} +

    + +

    + 13) Do you use a dryer for your clothes? + {% formfield player.q_15 %} +

    + +

    + 14) Do you wait until you have a full charge before doing your laundry? + {% formfield player.q_16 %} +

    + +

    + 15) Is the heating in your home turned off late at night (in winter)? + {% formfield player.q_17 %} +

    + +

    + 16) Do you reduce the room temperature when you are not at home for a long time (in winter)? + {% formfield player.q_18 %} +

    + +

    + 17) Would you prefer to take a shower rather than a bath? + + + + + + +
    Strongly disagree {% formfield player.q_19 %} Strongly agree
    +

    + + + +

    18) Do you regularly defrost the fridge? ?

    + + 1 - Never
    +
    +

            a - Because I bought a frost free fridge on purpose
    +         b - I share the refrigerator with other people and someone else is responsible for it
    +         c - Other reason
    +         (If other reason please specify) :
    + +

    +

    + 2 - Rarely
    + 3 - Often
    + 4 - Always
    + +

    +

    + Suppose you are about to book a taxi (e.g. UBER) to Orly airport. + + +
    Which option would you choose? +
    + {% formfield player.q_21 %} +

    + +

    + 20) Do you think that electric cars are less polluting than petrol or diesel cars? + + + + + + +
    Strongly disagree {% formfield player.q_22 %} Strongly agree
    +

    + +

    + 21) Would you be interested in buying an alternative fuel car? + + + + + + +
    Strongly disagree {% formfield player.q_23 %} Strongly agree
    +

    + +

    + 22) Do you drive your car defensively to save fuel? + + {% formfield player.q_24 %} +

    + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire2.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire2.html new file mode 100644 index 0000000..23741e6 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire2.html @@ -0,0 +1,249 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + + +

    +
    +
    + +

    + 23) Do you agree with higher taxes for environmentally damaging behaviour? + + + + + + +
    Strongly disagree {% formfield player.q_25 %} Strongly agree
    +

    + +

    + 24) Do you vote for political parties that have environmental issues at the top of their agenda? + + {% formfield player.q_26 %} +

    + + +

    + 25) Do you often discuss environmental issues with friends? + + {% formfield player.q_27 %} +

    + + + +

    +

    26) Are you a member of an environmental organisation? If so, which one? ?

    +No
    +Yes
    +
    +

    {% formfield player.q_28_a %} +

    +
    + +

    + + +

    + 27) Do you support financial incentives for environmentally beneficial technology? + + + + + + +
    Strongly disagree {% formfield player.q_29 %} Strongly agree
    +

    + +
    +

    + 28) For each of the following actions, please indicate whether it can reduce the + individual carbon footprint to a small or very large extent: + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + +
    a. avoid air travel. Reduced way:
    Peu importante {% formfield player.q_30_a %} Très importante
    b. have fewer children. Reduced way:
    Peu importante {% formfield player.q_30_b %} Très importante
    c. not having a car Reduced way:
    Peu importante {% formfield player.q_30_c %} Très importante
    d. a vegetarian diet Reduced way:
    Peu importante {% formfield player.q_30_d %} Très importante
    +

    + + +
    + + +

    +
    + +

    + 30) Did you know that you currently live in a green (low energy) building? + + {% formfield player.q_32 %} +

    + +

    + 31) What do you think are the main differences between a green building and a conventional building? + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a- Landscaping and physical activity
    Strongly disagree {% formfield player.q_33_a %} Strongly agree
    b- Indoor air quality
    Strongly disagree {% formfield player.q_33_b %} Strongly agree
    c- Indoor noise
    Strongly disagree {% formfield player.q_33_c %} Strongly agree
    d- Annual energy consumption
    Strongly disagree {% formfield player.q_33_d %} Strongly agree
    e- Annual consumption of drinking water
    Strongly disagree {% formfield player.q_33_e %} Strongly agree
    f- Monthly management costs
    Strongly disagree {% formfield player.q_33_f %} Strongly agree
    +

    + +

    + 32) If you were to move, would you be interested in living in a green building? + + + + + + +
    Strongly disagree {% formfield player.q_34 %} Strongly agree
    +

    + + +

    + 33) Would you be willing to pay more to live in a green building? + + + + + + +
    Strongly disagree {% formfield player.q_35 %} Strongly agree
    +

    + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire3.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire3.html new file mode 100644 index 0000000..2b29588 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/Questionnaire3.html @@ -0,0 +1,126 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

    +
    +
    + +

    SRI (Socially Responsible Investment)

    + +

    + The extra-financial performance contains information on the main axes of sustainable development: +

  • Social data : employment in the company, health, safety… Here we find the major themes of the quality of life at work. +
  • + +
  • Governance data : anti-discrimination measures, gender equality, integration of disabled workers. +
  • +
  • Environmental data : actions implemented to fight against waste, pollution, global warming, etc. +
  • +

    + +

    +

    + 34) Suppose you are an investor, and you want to invest in firm A: +

    +

    + Do you think that extra-financial performance should be taken into account in your choice of investment? + + + + + + +
    Strongly disagree {% formfield player.q_37 %} Strongly agree
    +

    + +

    + + 35) For each of the following data, please indicate whether it is unimportant + or very important for you as an investor: + + + + > + + + + + + + + > + + + + + + + + + + + + + + +
    a. Social data:
    Not very important {% formfield player.q_38_a %} Very important
    b. Governance data:
    Not very important {% formfield player.q_38_b %} Very important
    c. Environmental data:
    Not very important {% formfield player.q_38_c %} Very important
    + +

    + + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/QuestionnaireEnd.html b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/QuestionnaireEnd.html new file mode 100644 index 0000000..26368c6 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/templates/exp_e4c_en_questionnaire_v2/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + First part : End + +{% endblock %} + +{% block content %} +
    +
    + + +

    + You have completed the first part. + +
    You will now begin the second part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_en_questionnaire_v2/tests.py b/old_versions/exp_e4c_en_questionnaire_v2/tests.py new file mode 100644 index 0000000..0863b41 --- /dev/null +++ b/old_versions/exp_e4c_en_questionnaire_v2/tests.py @@ -0,0 +1,82 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Bienvenue) + + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_2_e': 1, + 'q_2_f': 1, + 'q_2_g': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_6': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + 'q_12': 1, + }) + + yield (pages.Questionnaire1, { + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + 'q_16': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19': 1, + 'q_20': 1, + 'q_20_a': 1, + 'q_20_b': 1, + 'q_21': 1, + 'q_22': 1, + 'q_23': 1, + 'q_24': 1, + }) + + yield (pages.Questionnaire2, { + 'q_25': 1, + 'q_26': 1, + 'q_27': 1, + 'q_28': 1, + 'q_28_a': 1, + 'q_29': 1, + 'q_30_a': 1, + 'q_30_b': 1, + 'q_30_c': 1, + 'q_30_d': 1, + 'q_31': 1, + 'q_32': 1, + 'q_33_a': 1, + 'q_33_b': 1, + 'q_33_c': 1, + 'q_33_d': 1, + 'q_33_e': 1, + 'q_33_f': 1, + 'q_34': 1, + 'q_35': 1, + }) + + yield (pages.Questionnaire3, { + 'q_37': 1, + 'q_38_a': 1, + 'q_38_b': 1, + 'q_38_c': 1, + }) + + yield (pages.QuestionnaireEnd) + diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/__init__.py b/old_versions/exp_e4c_en_risk_binswanger_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/_builtin/__init__.py b/old_versions/exp_e4c_en_risk_binswanger_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/models.py b/old_versions/exp_e4c_en_risk_binswanger_v2/models.py new file mode 100644 index 0000000..19ee568 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/models.py @@ -0,0 +1,148 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_risk_binswanger_v2' + players_per_group = 2 + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc.html' + + gainriskAred = 4 + gainriskBred = 3 + gainriskCred = 2 + gainriskDred = 1 + gainriskEred = 0 + + gainriskAgreen = 4 + gainriskBgreen = 6 + gainriskCgreen = 8 + gainriskDgreen = 10 + gainriskEgreen = 12 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + + riskqc_a = models.IntegerField( + choices=[ + [1, '6 ECUs'], + [2, '0 ECUs'], + [3, '2 ECUs'], + [4, '3 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '10 ECUs'], + [2, '0 ECUs'], + [3, '1 ECU'], + [4, '6 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '1 ECU'], + [3, '12 ECUs'], + [4, '4 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/pages.py b/old_versions/exp_e4c_en_risk_binswanger_v2/pages.py new file mode 100644 index 0000000..694cf27 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/pages.py @@ -0,0 +1,148 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +###### traitement 1 risk au début +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + else: + self.player.choicerisknn = "E" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + + + +####################################################### elle n'est pas active !!! c'est le programme (exp_e4c_en_p5_questfin) +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def vars_for_template(self): + pass + + def before_next_page(self): + + ########################### + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur +####################################################### + + +class Risk_BinsWanger_result(Page): + form_model = 'player' + form_fields = [] + +class Jeu2End(Page): + pass + +page_sequence = [ + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, + Jeu2End, +###### Risk_BinsWanger_color, +###### Risk_BinsWanger_result, + + +] diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/AdminReport.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/AdminReport.html new file mode 100644 index 0000000..de3a50e --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/AdminReport.html @@ -0,0 +1,20 @@ +{% load otree %} + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant IDParticipant LabelGain jeu
    {{ row.id }}{{ row.label }}{{ row.answers }}
    \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Jeu2End.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Jeu2End.html new file mode 100644 index 0000000..87c1e73 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Jeu2End.html @@ -0,0 +1,44 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Third Part : End + {% endif %} + {% if player.id_in_group == 2 %} + Second Part : End + {% endif %} + +{% endblock %} + +{% block content %} +
    +
    + + +{% if player.id_in_group == 1%} +

    + You have completed the third part. + +
    You will now begin the fourth part. + +

    + {% endif%} + {% if player.id_in_group == 2%} +

    + You have completed the second part. + +
    You will now begin the third part. + +

    + {% endif%} + + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger.html new file mode 100644 index 0000000..11ac7bc --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger.html @@ -0,0 +1,327 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Game 2 : Your choice + {% endif %} + {% if player.id_in_group == 2 %} + Game 1 : Your choice + {% endif %} +{% endblock %} + +{% block content %} + + + +
    +
    + + + + +

    +You will now play the game for real. The winning of this game will count towards the final gain.

    + + + +

    Now please choose the situation you prefer the most from the following choices (A, B, C, D or E). +

    + +

    + +

    Please make a choice

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    A
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    B
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    C
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    D
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    E
    (0 ECUs) (12 ECUs)
    + + + + + + + + +




    + + + + +
    + + + +
    + + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_color.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_color.html new file mode 100644 index 0000000..042c55e --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 : Choix de votre couleur + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 : Choix de votre couleur + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + + +
    + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..a5a1905 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc.html @@ -0,0 +1,395 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Game 2 + {% endif %} + {% if player.id_in_group == 2 %} + Game 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    +This game can be taken into account when calculating your gains.

    + +
    +
    + + + + + +

    + Rules of the game: + +

    + +

    + Look at the table below. It presents 5 different situations. Look at them carefully. + Situations A, B, C, D and E contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

    + +

    +At the end of the game, the ECU you have won will be converted into € using the following rule:

    +

    +

    1 ECU =… €
    +

    + +

    +So you will first have to choose the situation you prefer the most: A, B, C, D or E.

    + +

    + +

    Warning! The image below is an example, your choice will be saved later.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + +Second, your color will be revealed to you, at the end of the experiment , with the following process: + +
    You will choose between two buttons that look like this: + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    After clicking one of the buttons, a red or green color will appear. This color will determine your winnings.

    +

    There is a 50% chance that the color red will be behind the left or right button. The same probability applies + for the color green.

    +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc2.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..ab932b6 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_qc2.html @@ -0,0 +1,941 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Comprehension Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Now we want to test if you have understood the in-game instructions.

    + + +
    + +

    + Example 1: + +

    + + +

    If you have chosen situation B, then the color Green appears. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    + + A + +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    + + B + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    + C + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    + + D + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    + + E + +
    (0 ECUs) (12 ECUs)
    + + + +

    +What would your earnings be?

    + {% formfield player.riskqc_a label="" %} + +

    + + +

    + Example 2: +

    + + +

    If you have chosen situation D, then the color Red appears. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    + + A + +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    + + B + + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    + C + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    + + + D + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    + + E + +
    (0 ECUs) (12 ECUs)
    + +

    + Question 2: What would your earnings be?

    + + {% formfield player.riskqc_b label = ""%} + +

    + + + +

    + + Example 3: +

    + + +

    If you have chosen situation E, then the color + appears. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    + + A + +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    + + + B + + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    + C + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    + + D + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    + + E + + +
    (0 ECUs) (12 ECUs)
    + + +

    + Question 3: What would your earnings be?

    + + {% formfield player.riskqc_c label = ""%} + +

    + + + + + +




    + + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_result.html b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_result.html new file mode 100644 index 0000000..ea6e1de --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/templates/exp_e4c_en_risk_binswanger_v2/Risk_BinsWanger_result.html @@ -0,0 +1,57 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + + {% if player.id_in_group == 1 %} + Gain of game 2 : Details + {% endif %} + {% if player.id_in_group == 2 %} + Gain of game 1 : Details + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    Your choice was: {{player.choicerisknn}}

    + +

    The selected color is: {{player.colorselectnn}}

    + + +

    Your winnings for this game are: {{player.gainrisk}} ECU (s)

    + + +

    Your winnings for this game are: {{player.gainriskeur}} ECU (s)

    +

    -----------------------------------------

    + +
    + + + +
    +
    + +

    +

    +Reminder of the instructions: +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + +{% endblock %} + + diff --git a/old_versions/exp_e4c_en_risk_binswanger_v2/tests.py b/old_versions/exp_e4c_en_risk_binswanger_v2/tests.py new file mode 100644 index 0000000..c2f6c7d --- /dev/null +++ b/old_versions/exp_e4c_en_risk_binswanger_v2/tests.py @@ -0,0 +1,26 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 5), + }) + + yield (pages.Jeu2End) + diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/__init__.py b/old_versions/exp_e4c_en_risk_gneezy_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/_builtin/__init__.py b/old_versions/exp_e4c_en_risk_gneezy_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/models.py b/old_versions/exp_e4c_en_risk_gneezy_v2/models.py new file mode 100644 index 0000000..9c6247a --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/models.py @@ -0,0 +1,106 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p2_risk_gneezy' + players_per_group = 2 + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_en_p2_risk_gneezy/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/pages.py b/old_versions/exp_e4c_en_risk_gneezy_v2/pages.py new file mode 100644 index 0000000..7a40c13 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/pages.py @@ -0,0 +1,97 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group == 1 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + +# Jeu 5 :(Gneezy Potters) +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group == 1 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Success" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Failure" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + + + +# Jeu 5 :(Gneezy Potters) Result +class M_risk11_result(Page): + form_model = 'player' + form_fields = [] + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group == 1 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/AdminReport.html b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/AdminReport.html new file mode 100644 index 0000000..2bfb8af --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/AdminReport.html @@ -0,0 +1,22 @@ +{% load otree %} + + + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant ID Participant Label Note
    {{ row.id }}{{ row.label }}
    diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/Jeu1End.html b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/Jeu1End.html new file mode 100644 index 0000000..817680e --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/Jeu1End.html @@ -0,0 +1,28 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Second part: End + +{% endblock %} + +{% block content %} +
    +
    + +

    + You have completed the second part. + +
    You will now begin the third part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/L_risk11_qc.html b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/L_risk11_qc.html new file mode 100644 index 0000000..32dea82 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 1 +{% endblock %} + +{% block content %} + +

    + This game can be taken into account when calculating your winnings. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Comprehension test:

    + + +

    If you have invested 6 ECUs in the risky project:

    + +

    1) How many ECUs have you kept?

    + +

    {% formfield player.risk11_qc_a label = ""%} +

    +

    2) If the investment is successful, how many ECUs did you earn?

    +

    {% formfield player.risk11_qc_b label = ""%} +

    +

    3) If the investment is unsuccessful, how many ECUs did you earn?

    +

    {% formfield player.risk11_qc_c label = ""%} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/M_risk11.html b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/M_risk11.html new file mode 100644 index 0000000..1e7b413 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 1 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

    +

    {% formfield player.risk11_a label = ""%} +

    + +

    So, how many ECUs did you keep (an amount between 0 and 10)?

    +

    {% formfield player.risk11_b label = ""%} +

    + +

    + Note: the sum of the two amounts must be equal to 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/M_risk11_result.html b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 1 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/instructions.html b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/instructions.html new file mode 100644 index 0000000..f0b5bf4 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/templates/exp_e4c_en_risk_gneezy_v2/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Rules of the game : +

    + +

    You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

    + +
    Project description:
    + +

    This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

    +

    +

    Your gain from this task = amount retained + gain from your investment in the project.

    +

    +

    Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

    + +

    Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Summary of the game:

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2/tests.py b/old_versions/exp_e4c_en_risk_gneezy_v2/tests.py new file mode 100644 index 0000000..805e687 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2/tests.py @@ -0,0 +1,31 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.player.id_in_group == 1: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 9, + 'risk11_b': 1, + }) + + yield (pages.Jeu1End) + + + + + + diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/__init__.py b/old_versions/exp_e4c_en_risk_gneezy_v2_end/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/_builtin/__init__.py b/old_versions/exp_e4c_en_risk_gneezy_v2_end/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/models.py b/old_versions/exp_e4c_en_risk_gneezy_v2_end/models.py new file mode 100644 index 0000000..871ae7b --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/models.py @@ -0,0 +1,106 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_en_p2bis_risk_gneezy_end' + players_per_group = 2 + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_en_p2bis_risk_gneezy_end/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/pages.py b/old_versions/exp_e4c_en_risk_gneezy_v2_end/pages.py new file mode 100644 index 0000000..7c274de --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/pages.py @@ -0,0 +1,97 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group == 2 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + +# Jeu 5 :(Gneezy Potters) +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group == 2 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + + + +# Jeu 5 :(Gneezy Potters) Result +class M_risk11_result(Page): + form_model = 'player' + form_fields = [] + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group == 2 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/AdminReport.html b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/AdminReport.html new file mode 100644 index 0000000..2bfb8af --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/AdminReport.html @@ -0,0 +1,22 @@ +{% load otree %} + + + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant ID Participant Label Note
    {{ row.id }}{{ row.label }}
    diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/Jeu1End.html b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/Jeu1End.html new file mode 100644 index 0000000..402dbc3 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Third Part: End + +{% endblock %} + +{% block content %} +
    +
    + + +

    + You have completed the third part. + +
    You will now begin the fourth part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/L_risk11_qc.html b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/L_risk11_qc.html new file mode 100644 index 0000000..ff96638 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 2 +{% endblock %} + +{% block content %} + +

    + This game can be taken into account when calculating your winnings. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Comprehension test:

    + + +

    If you have invested 6 ECUs in the risky project:

    + +

    1) How many ECUs have you kept?

    + +

    {% formfield player.risk11_qc_a label = ""%} +

    +

    2) If the investment is successful, how many ECUs did you earn?

    +

    {% formfield player.risk11_qc_b label = ""%} +

    +

    3) If the investment is unsuccessful, how many ECUs did you earn?

    +

    {% formfield player.risk11_qc_c label = ""%} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/M_risk11.html b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/M_risk11.html new file mode 100644 index 0000000..af135a7 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 2 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

    +

    {% formfield player.risk11_a label = ""%} +

    + +

    So, how many ECUs did you keep (an amount between 0 and 10)?

    +

    {% formfield player.risk11_b label = ""%} +

    + +

    + Note: the sum of the two amounts must be equal to 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/M_risk11_result.html b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/M_risk11_result.html new file mode 100644 index 0000000..70bdd92 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 2 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/instructions.html b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/instructions.html new file mode 100644 index 0000000..569116a --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/templates/exp_e4c_en_risk_gneezy_v2_end/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Rules of the game : +

    + +

    You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

    + +
    Project description:
    + +

    This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

    +

    +

    Your gain from this task = amount retained + gain from your investment in the project.

    +

    +

    Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

    + +

    Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Summary of the game:

    + +
    +
    +

    + + +
    +
    diff --git a/old_versions/exp_e4c_en_risk_gneezy_v2_end/tests.py b/old_versions/exp_e4c_en_risk_gneezy_v2_end/tests.py new file mode 100644 index 0000000..5312696 --- /dev/null +++ b/old_versions/exp_e4c_en_risk_gneezy_v2_end/tests.py @@ -0,0 +1,30 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.player.id_in_group == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 9, + 'risk11_b': 1, + }) + + yield (pages.Jeu1End) + + + + + diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/__init__.py b/old_versions/exp_e4c_fr_questionnaire_final_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/_builtin/__init__.py b/old_versions/exp_e4c_fr_questionnaire_final_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/models.py b/old_versions/exp_e4c_fr_questionnaire_final_v2/models.py new file mode 100644 index 0000000..59ad3e2 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/models.py @@ -0,0 +1,150 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_questionnaire_final_v2' + players_per_group = 2 + num_rounds = 1 + + showupfee = 5 + + instructions_GP_template = 'exp_e4c_fr_risk_gneezy_v2/instructions.html' + instructions_BW_template = 'exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc.html' + + gainriskAred = 4 + gainriskBred = 3 + gainriskCred = 2 + gainriskDred = 1 + gainriskEred = 0 + + gainriskAgreen = 4 + gainriskBgreen = 6 + gainriskCgreen = 8 + gainriskDgreen = 10 + gainriskEgreen = 12 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + jeu_tire=p.jeu_tire, + gainfinal=p.gainfinal, + gainfinalplushowup=p.gainfinalplushowup, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + langue = models.StringField() + langue_nn = models.IntegerField() + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + +######### var jeu Binswanger + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts et/ou littérature'], + [2, '2- Economie et/ou gestion'], + [3, '3- Scientifique / ingénierie'], + [4, '4- Autre'], + ], + widget=widgets.RadioSelect, + label="Votre domaine d’étude ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Femme'], + [2, '2- Homme'], + [3, '3- Non-binaire'], + [4, '4- Ne souhaite pas répondre'], + ], + widget=widgets.RadioSelect, + label="Vous êtes ", + blank=False + ) + + q_42_annee_naissance = models.IntegerField( + label="Quelle est votre année de naissance ?", + blank=False, + min=1900, + max=2019) + + q_43_nationalite = models.StringField( + label="Votre nationalité ", + blank=False + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Inférieur à 5 000 Euros'], + [2, '2- Entre 5 000 et 10 000 Euros'], + [3, '3- Entre 10 000 et 15 000 Euros '], + [4, '4- Entre 15 000 et 20 000 Euros '], + [5, '5- Entre 20 000 et 25 000 Euros '], + [6, '6- Supérieur à 25 000 Euros '], + ], + widget=widgets.RadioSelect, + label="Veuillez estimer votre revenu annuel brut (y compris vos bourses d'études et votre prêt étudiant) en Euros. ", + blank=False + ) + + q_45_logement_pays = models.StringField( + label="Ville - précédent logement ", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="Pays - précédent logement ", + blank=False + ) + +### jeu 2 : Gneezy&Potters + tirageriskresult_j1 = models.StringField() + risk11_a_j1 = models.FloatField() + risk11_b_j1 = models.FloatField() + gainrisk_j1 = models.FloatField() + + + tirageausort = models.FloatField() + + gainfinal = models.FloatField() + jeu_tire = models.IntegerField() + gainfinalecu = models.FloatField() + gainfinalplushowup = models.FloatField() + diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/pages.py b/old_versions/exp_e4c_fr_questionnaire_final_v2/pages.py new file mode 100644 index 0000000..4695df0 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/pages.py @@ -0,0 +1,142 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def vars_for_template(self): + pass + + def before_next_page(self): + + ########################### + + self.player.choicerisk = self.participant.vars['choicerisk'] + self.player.choicerisknn = self.participant.vars['choicerisknn'] + + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_annee_naissance', 'q_43_nationalite', 'q_44_revenu', + 'q_45_logement_pays', 'q_46_logement_ville'] + + def before_next_page(self): + ### jeu 2 : risk Binswanger + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.player.colorselectnn = self.participant.vars['colorselectnn'] + self.player.gainrisk = self.participant.vars['gainrisk'] + self.player.gainriskeur = self.participant.vars['gainriskeur'] + + ### jeu 1 : Gneezy_Potters + + self.player.tirageriskresult_j1 = self.participant.vars['tirageriskresult_j1'] + self.player.risk11_a_j1 = self.participant.vars['risk11_a_j1'] + self.player.risk11_b_j1 = self.participant.vars['risk11_b_j1'] + self.player.gainrisk_j1 = self.participant.vars['gainrisk_j1'] + + + self.player.tirageausort = round(random.random(), 2) + + if self.player.id_in_group == 1 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 1 + else: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 2 + + if self.player.id_in_group == 2 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 1 + else: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 2 + + + self.player.gainfinalplushowup = self.player.gainfinal + Constants.showupfee + + self.player.payoff = self.player.gainfinal + Constants.showupfee + + +class Result(Page): + form_model = 'player' + form_fields = [] + + +page_sequence = [ + Risk_BinsWanger_color, + Questionnaire4, + Result, + + +] diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/AdminReport.html b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/AdminReport.html new file mode 100644 index 0000000..80f3c3c --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/AdminReport.html @@ -0,0 +1,27 @@ +{% load otree %} + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label Jeu tire Gain sans showupfee Gain final
    {{ row.id }}{{ row.label }}{{ row.jeu_tire }}{{ row.gainfinal }}{{ row.gainfinalplushowup }}
    + diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Questionnaire4.html b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Questionnaire4.html new file mode 100644 index 0000000..71fada3 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Questionnaire4.html @@ -0,0 +1,78 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire Final +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +

    +
    +
    + + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_annee_naissance %} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
    +

    + + Indiquez la Ville et le Pays où était votre précédent logement : +

    + {% formfield player.q_45_logement_pays %} + {% formfield player.q_46_logement_ville %} + + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Result.html b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Result.html new file mode 100644 index 0000000..41e44bf --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Result.html @@ -0,0 +1,148 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + GAIN FINAL + +{% endblock %} + +{% block content %} +
    +
    +
    Tirage au sort : +
    Jeu sélectionné : Jeu {{ player.jeu_tire}} +

    + Gain jeu : {{player.gainfinal}} ECU(s) +

    + Gain final (Gain jeu + rémunération fixe) : {{player.gainfinalplushowup}} ECU(s) +

    +
    +
    + +

    {% next_button %}

    + + + +{% if player.id_in_group == 1%} + {% if player.jeu_tire == 1%} +
    +
    +

    Jeu 1 : RESULTAT Détails

    +

    Le tirage au sort est : {{player.tirageriskresult_j1}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a_j1}} ECU(s)

    +

    Vous avez gardé : {{player.risk11_b_j1}} ECU(s)

    +
    +

    Votre gain pour ce jeu est de : {{player.gainrisk_j1}} ECU(s)

    +

    + +
    +
    +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + {% endif %} + + + {% if player.jeu_tire == 2%} +
    +
    +

    Jeu 2 : RESULTAT Détails

    +

    Votre choix était : {{ player.choicerisknn }}

    +

    La couleur sélectionné est : {{ player.colorselectnn }}

    +

    Votre gain pour ce jeu est : {{ player.gainrisk }} ECU(s)

    +
    +
    +
    +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + {% endif %} +{% endif %} + + + + + +{% if player.id_in_group == 2%} + + {% if player.jeu_tire == 1%} +
    +
    +

    Jeu 1 : RESULTAT Détails

    +

    Votre choix était : {{ player.choicerisknn }}

    +

    La couleur sélectionné est : {{ player.colorselectnn }}

    +

    Votre gain pour ce jeu est : {{ player.gainrisk }} ECU(s)

    +
    +
    +
    +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + {% endif %} + + + {% if player.jeu_tire == 2%} +
    +
    +

    Jeu 2 : RESULTAT Détails

    +

    Le tirage au sort est : {{player.tirageriskresult_j1}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a_j1}} ECU(s)

    +

    Vous avez gardé : {{player.risk11_b_j1}} ECU(s)

    +
    +

    Votre gain pour ce jeu est de : {{player.gainrisk_j1}} ECU(s)

    +

    + +
    +
    +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + {% endif %} + + + +{% endif %} + + + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Risk_BinsWanger_color.html b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Risk_BinsWanger_color.html new file mode 100644 index 0000000..927280d --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Risk_BinsWanger_color.html @@ -0,0 +1,173 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + {% if player.id_in_group == 1 %} + Choix de votre couleur (pour le jeu 2) + {% endif %} + {% if player.id_in_group == 2 %} + Choix de votre couleur (pour le jeu 1) + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + + +

    +

    + +

    + +

    +

    +

    + + +
    + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Risk_BinsWanger_qc.html b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..98be971 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = … €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/instructions.html b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/templates/exp_e4c_fr_questionnaire_final_v2/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/old_versions/exp_e4c_fr_questionnaire_final_v2/tests.py b/old_versions/exp_e4c_fr_questionnaire_final_v2/tests.py new file mode 100644 index 0000000..f1fe1fd --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_final_v2/tests.py @@ -0,0 +1,27 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Risk_BinsWanger_color, { + 'tc3': '1;;0.3', + }) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_annee_naissance': 1999, + 'q_43_nationalite': 'fr', + 'q_44_revenu': 1, + 'q_45_logement_pays': 'fr', + 'q_46_logement_ville': 'fr', + }) + +# yield (pages.Result) diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/__init__.py b/old_versions/exp_e4c_fr_questionnaire_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/_builtin/__init__.py b/old_versions/exp_e4c_fr_questionnaire_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/models.py b/old_versions/exp_e4c_fr_questionnaire_v2/models.py new file mode 100644 index 0000000..4f56cea --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/models.py @@ -0,0 +1,771 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_questionnaire_v2' + players_per_group = 2 + num_rounds = 1 + + showupfee = 0 + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + q_1 = models.IntegerField( + choices=[ + [0, '0%'], + [1, '10%'], + [2, '20%'], + [3, '30%'], + [4, '40%'], + [5, '50%'], + [6, '60%'], + [7, '70%'], + [8, '80%'], + [9, '90%'], + [10, '100%'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_g = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Très souvent'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je ne bois pas de café (thé) à l’école / au travail'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je n’utilise pas de piles'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_17 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_19 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_20 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_20_a = models.IntegerField( + label="", + blank=True + ) + + q_20_b = models.StringField( + label="", + blank=True + ) + + q_21 = models.IntegerField( + choices=[ + [1, 'a- Green (100% électrique ou hybride) (à 26 € la course)'], + [2, 'b- UberX (Économique, rapide et fiable) (à 22€ la course)'], + [3, 'c- Comfort (Véhicules spacieux et chauffeurs les mieux notés) (à 30€ la course)'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_24 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je ne conduis pas'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_26 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_28 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_28_a = models.StringField( + label="Si oui, laquelle ? ", + blank=True + ) + + q_29 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_30_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_31 = models.IntegerField() + + q_32 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_33_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_33_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_34 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_35 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_37 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_38_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_38_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_38_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/pages.py b/old_versions/exp_e4c_fr_questionnaire_v2/pages.py new file mode 100644 index 0000000..f04a258 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/pages.py @@ -0,0 +1,53 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', 'q_2_e', 'q_2_f', 'q_2_g', 'q_2_h', + 'q_3', 'q_4', 'q_6', 'q_8', 'q_9', 'q_10', 'q_11', 'q_12' + + ] + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_13', 'q_14', 'q_15', 'q_16', 'q_17', 'q_18', 'q_19', 'q_20', 'q_20_a','q_20_b', 'q_21', + 'q_22', 'q_23', 'q_24' + ] + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_25', 'q_26', 'q_27', 'q_28', 'q_28_a', 'q_29', 'q_30_a', 'q_30_b', + 'q_30_c', 'q_30_d', 'q_31', 'q_32', + 'q_33_a', 'q_33_b', 'q_33_c', 'q_33_d', 'q_33_e', 'q_33_f', 'q_34', 'q_35' + + ] + +class Questionnaire3(Page): + form_model = 'player' + form_fields = [ 'q_37', 'q_38_a', 'q_38_b', 'q_38_c'] + +class QuestionnaireEnd(Page): + pass + + +page_sequence = [ + Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + Questionnaire3, + QuestionnaireEnd, + + +] diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/AdminReport.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/AdminReport.html new file mode 100644 index 0000000..2bfb8af --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/AdminReport.html @@ -0,0 +1,22 @@ +{% load otree %} + + + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant ID Participant Label Note
    {{ row.id }}{{ row.label }}
    diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Bienvenue.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Bienvenue.html new file mode 100644 index 0000000..c741bcb --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Bienvenue.html @@ -0,0 +1,62 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie +{% endblock %} + +{% block content %} + + +
    +
    + +

    Bienvenue

    + +

    + Merci d’avoir accepté de participer à cette expérience. Une rémunération fixe (de 5 €) vous sera versée + à la fin de l’expérience pour votre participation, et ce, quelles que soient vos réponses durant + cette expérience. À cela s’ajoutera une rémunération variable liée à vos réponses au cours + de l’expérience. +

    + +

    + L’expérience dure environ 30 min. Elle se compose de deux types de tâches : les questionnaires et les jeux. + La rémunération variable que vous percevrez à la fin de l’expérience ne dépendra pas de vos réponses + aux questionnaires. + En effet, dans ces questionnaires, il n’y a ni bonne, ni mauvaise réponse. En revanche, votre rémunération + variable dépendra + de la qualité de vos réponses aux jeux. Plus précisément, à la fin de l’expérience, un seul des jeux + sera sélectionné + aléatoirement pour être payé pour de bon. +

    +
    La monnaie utilisée dans cette expérience est l'ECU. +
    Taux de change 1 ECU = … €.
    + +
    + Important : Toutes vos réponses seront traitées anonymement. + Personne n’aura la possibilité d’identifier directement vos décisions. + + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire0.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire0.html new file mode 100644 index 0000000..277d52b --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire0.html @@ -0,0 +1,198 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +

    +
    +
    + +

    + 1) Quel est le pourcentage de produits bio et/ou écologique que vous avez l’habitude d’acheter ? + {% formfield player.q_1 %} +

    + +
    +

    + 2) Pour chacun des critères suivants, merci d’indiquer si cela peut influencer vos choix de produits à acheter : + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a. prix
    Pas du tout d'accord {% formfield player.q_2_a %} Tout à fait d'accord
    b. provenance
    Pas du tout d'accord {% formfield player.q_2_b %} Tout à fait d'accord
    c. qualité et/ou goût
    Pas du tout d'accord {% formfield player.q_2_c %} Tout à fait d'accord
    d. label
              * label Bio +
    Un produit Bio est un produit issu de l’agriculture biologique (c’est une méthode de production + agricole qui exclut le recours à la plupart des produits chimiques de synthèse, des produits + toxiques etc.). Il existe un label (AB) en France qui permet d’authentifier les produits issus + de cette méthode d’agriculture. +
            Pas du tout d'accord {% formfield player.q_2_e %} Tout à fait d'accord
              * label écologique +
    Un produit écologique est un produit qui va être pensé, conçu, emballé, distribué, + recyclé de manière à minimiser l’impact sur l’environnement. Il doit respecter de + nombreuses règles liées à ces étapes lors d’un cahier des charges établis par un + organisme tel ECOLABEL ou ECOCERT. Un produit écologique doit être conçu dans un + maximum de respect de l’environnement (respect lié à l’utilisation des matières + premières et des machines lors de la fabrication). Le cycle de vie du produit ainsi + que son recyclage sont également des points importants à prendre en considération. +
            Pas du tout d'accord {% formfield player.q_2_f %} Tout à fait d'accord
              * label commerce équitable +
    Le commerce équitable est un partenariat commercial et international, reposant sur + des principes concrets et lancé depuis près de 20 ans. Son objectif est de pouvoir + garantir un meilleur équilibre entre les producteurs et les revendeurs, en assurant + de meilleures conditions de travail et une meilleure rémunération pour les petits + producteurs. +
            Pas du tout d'accord {% formfield player.q_2_g %} Tout à fait d'accord
              * autre label
    (si oui, à indiquer)
    {% formfield player.q_2_h %}
    +

    + +

    + 3) Faites-vous des achats en ligne (dont des achats de vêtements) ? + {% formfield player.q_3 %} +

    + +

    + 4) Pensez-vous qu’il est moins écologique de faire des achats en ligne plutôt que des achats en magasin ? + + + + + + + + +
    Pas du tout d'accord {% formfield player.q_4 %} Tout à fait d'accord
    +

    + +

    + 5) Apportez-vous votre propre tasse de café (thé) à l'école / au travail (au lieu d'utiliser les tasses de la machine à café) ? + {% formfield player.q_6 %} +

    + + +

    + 6) Triez-vous vos déchets ménagers ? + {% formfield player.q_8 %} +

    + +

    + 7) Utilisez-vous un bac à compost ? + {% formfield player.q_9 %} +

    +

    + 8) Collectez-vous et recyclez-vous les papiers usagés ? + {% formfield player.q_10 %} +

    + +

    + 9) Réutilisez-vous vos sacs de course ? + {% formfield player.q_11 %} +

    + +

    + 10) Renvoyez-vous les piles usées aux points de collecte des déchets dangereux ? + {% formfield player.q_12 %} +

    + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire1.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire1.html new file mode 100644 index 0000000..bf77450 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire1.html @@ -0,0 +1,161 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +

    +
    +
    + +

    + 11) Lors d’achat de nouveaux appareils électroniques, assurez-vous d’acheter ceux qui consomment le moins d'énergie ? + {% formfield player.q_13 %} +

    + +

    + 12) Éteignez-vous ou déconnectez-vous complètement les appareils électriques lorsque vous ne les utilisez pas (sans utiliser le mode veille) ? + {% formfield player.q_14 %} +

    + +

    + 13) Utilisez-vous un sèche-linge pour sécher les vêtements ? + {% formfield player.q_15 %} +

    + +

    + 14) Attendez-vous d'avoir une charge complète avant de faire votre lessive ? + {% formfield player.q_16 %} +

    + +

    + 15) Le radiateur de votre logement est-il éteint tard le soir (en hiver) ? + {% formfield player.q_17 %} +

    + +

    + 16) Réduisez-vous la température ambiante lorsque vous n'êtes pas à la maison pendant une longue période (en hiver) ? + {% formfield player.q_18 %} +

    + +

    + 17) Préférez-vous prendre une douche plutôt qu'un bain ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_19 %} Tout à fait d'accord
    +

    + + + +

    18) Dégivrez-vous régulièrement le réfrigérateur ? ?

    + + 1 - Jamais + +
    +
    +

            a - Parce que j’ai acheté un frigo sans givre exprès
    +         b - Je partage le réfrigérateur avec d’autres personnes et quelqu’un d’autre en est responsable
    +         c - Autre raison
    +         (Si autre raison merci de le préciser) :
    + +

    +

    + 2 - Rarement
    + 3 - Souvent
    + 4 - Toujours
    + +

    +

    + 19) Supposons que vous êtes sur le point de réserver un taxi (par ex UBER) pour vous rendre à l’aéroport Orly. +
    Quelle option choisiriez-vous ? +
    + {% formfield player.q_21 %} +

    + +

    + 20) Pensez-vous que les voitures électriques sont moins polluantes que les voitures essence ou diesel ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_22 %} Tout à fait d'accord
    +

    + +

    + 21) Seriez-vous intéressés par acheter une voiture à carburant alternatif ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_23 %} Tout à fait d'accord
    +

    + +

    + 22) Conduisez-vous votre voiture de manière défensive pour économiser du carburant ? + + {% formfield player.q_24 %} +

    + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire2.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire2.html new file mode 100644 index 0000000..8332984 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire2.html @@ -0,0 +1,248 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +

    +
    +
    + +

    + 23) Soutenez-vous des taxes plus élevées pour les comportements dommageables envers l'environnement ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_25 %} Tout à fait d'accord
    +

    + +

    + 24) Votez-vous pour les partis politiques qui ont les sujets environnementaux en tête de leur ordre du jour ? + + {% formfield player.q_26 %} +

    + + +

    + 25) Parlez-vous souvent avec des amis de problèmes liés à l'environnement ? + + {% formfield player.q_27 %} +

    + + + +

    +

    26) Êtes-vous membre d'une organisation environnementale ? Si oui laquelle ? ?

    +Non
    +Oui
    +
    +

    {% formfield player.q_28_a %} +

    +
    + +

    + + +

    + 27) Soutenez-vous les incitations financières pour une technologie bénéfique pour l'environnement ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_29 %} Tout à fait d'accord
    +

    + +
    +

    + 28) Pour chacune des actions suivantes, merci d’indiquer si elle peut réduire de façon peu importante ou très importante l'empreinte carbone individuelle : + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + +
    a. éviter de voyager par avion. Réduit de façon :
    Peu importante {% formfield player.q_30_a %} Très importante
    b. faire moins d'enfants. Réduit de façon :
    Peu importante {% formfield player.q_30_b %} Très importante
    c. ne pas avoir de voiture. Réduit de façon :
    Peu importante {% formfield player.q_30_c %} Très importante
    d. un régime alimentaire végétarien. Réduit de façon :
    Peu importante {% formfield player.q_30_d %} Très importante
    +

    + + +
    + + +

    +
    + +

    + 30) Savez-vous que vous habitez actuellement dans un bâtiment écologique (à faible consommation en énergies) ? + + {% formfield player.q_32 %} +

    + +

    + 31) Selon vous quelles sont les principales différences entre un bâtiment écologique et un bâtiment conventionnel ? + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a- Aménagement paysager et activité physique
    Pas du tout d'accord {% formfield player.q_33_a %} Tout à fait d'accord
    b- Qualité de l'air intérieur
    Pas du tout d'accord {% formfield player.q_33_b %} Tout à fait d'accord
    c- Bruit intérieur
    Pas du tout d'accord {% formfield player.q_33_c %} Tout à fait d'accord
    d- Consommation annuelle d'énergie
    Pas du tout d'accord {% formfield player.q_33_d %} Tout à fait d'accord
    e- Consommation annuelle d'eau potable
    Pas du tout d'accord {% formfield player.q_33_e %} Tout à fait d'accord
    f- Frais de gestion mensuels
    Pas du tout d'accord {% formfield player.q_33_f %} Tout à fait d'accord
    +

    + +

    + 32) Si vous deviez déménager, seriez-vous intéressés par habiter dans un bâtiment écologique ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_34 %} Tout à fait d'accord
    +

    + + +

    + 33) Seriez-vous prêt à payer plus cher pour vivre dans un bâtiment écologique ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_35 %} Tout à fait d'accord
    +

    + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire3.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire3.html new file mode 100644 index 0000000..ab846cf --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/Questionnaire3.html @@ -0,0 +1,126 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +

    +
    +
    + +

    ISR (Investissement socialement responsable)

    + +

    + La performance extra-financière contient des informations sur les grands axes du développement durable : +

  • Données sociales : l’emploi dans l’entreprise, la santé, la sécurité… On retrouve là les grands thèmes de la qualité de vie au travail. +
  • + +
  • Données sociétales : les mesure anti-discrimination, l’égalité hommes/femmes, l’insertion des travailleurs handicapés. +
  • +
  • Données environnementales : les actions mises en place pour lutter contre le gaspillage, la pollution, le réchauffement climatique… +
  • +

    + +

    +

    + 34) Supposez que vous êtes un investisseur, et que vous désirez investir dans une firme A : +

    +

    + Est-ce que vous pensez qu’il faut prendre en compte la performance extra-financière dans votre choix d’investissement ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_37 %} Tout à fait d'accord
    +

    + +

    + + 35) Pour chacune des données suivantes, merci d’indiquer si elle est peu importante ou très importante pour vous entant qu’investisseur : + + + + > + + + + + + + + > + + + + + + + + + + + + + + +
    a. Données sociales :
    Peu importante {% formfield player.q_38_a %} Très importante
    b. Données sociétales :
    Peu importante {% formfield player.q_38_b %} Très importante
    c. Données environnementales :
    Peu importante {% formfield player.q_38_c %} Très importante
    + +

    + + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/QuestionnaireEnd.html b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/QuestionnaireEnd.html new file mode 100644 index 0000000..314960d --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/templates/exp_e4c_fr_questionnaire_v2/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Première Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la première étape. + +
    Vous allez maintenant commencer la deuxième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_fr_questionnaire_v2/tests.py b/old_versions/exp_e4c_fr_questionnaire_v2/tests.py new file mode 100644 index 0000000..0863b41 --- /dev/null +++ b/old_versions/exp_e4c_fr_questionnaire_v2/tests.py @@ -0,0 +1,82 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Bienvenue) + + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_2_e': 1, + 'q_2_f': 1, + 'q_2_g': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_6': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + 'q_12': 1, + }) + + yield (pages.Questionnaire1, { + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + 'q_16': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19': 1, + 'q_20': 1, + 'q_20_a': 1, + 'q_20_b': 1, + 'q_21': 1, + 'q_22': 1, + 'q_23': 1, + 'q_24': 1, + }) + + yield (pages.Questionnaire2, { + 'q_25': 1, + 'q_26': 1, + 'q_27': 1, + 'q_28': 1, + 'q_28_a': 1, + 'q_29': 1, + 'q_30_a': 1, + 'q_30_b': 1, + 'q_30_c': 1, + 'q_30_d': 1, + 'q_31': 1, + 'q_32': 1, + 'q_33_a': 1, + 'q_33_b': 1, + 'q_33_c': 1, + 'q_33_d': 1, + 'q_33_e': 1, + 'q_33_f': 1, + 'q_34': 1, + 'q_35': 1, + }) + + yield (pages.Questionnaire3, { + 'q_37': 1, + 'q_38_a': 1, + 'q_38_b': 1, + 'q_38_c': 1, + }) + + yield (pages.QuestionnaireEnd) + diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/__init__.py b/old_versions/exp_e4c_fr_risk_binswanger_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/_builtin/__init__.py b/old_versions/exp_e4c_fr_risk_binswanger_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/models.py b/old_versions/exp_e4c_fr_risk_binswanger_v2/models.py new file mode 100644 index 0000000..9eeab5b --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/models.py @@ -0,0 +1,148 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_risk_binswanger_v2' + players_per_group = 2 + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc.html' + + gainriskAred = 4 + gainriskBred = 3 + gainriskCred = 2 + gainriskDred = 1 + gainriskEred = 0 + + gainriskAgreen = 4 + gainriskBgreen = 6 + gainriskCgreen = 8 + gainriskDgreen = 10 + gainriskEgreen = 12 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + + riskqc_a = models.IntegerField( + choices=[ + [1, '6 ECUs'], + [2, '0 ECUs'], + [3, '2 ECUs'], + [4, '3 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '10 ECUs'], + [2, '0 ECUs'], + [3, '1 ECU'], + [4, '6 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '1 ECU'], + [3, '12 ECUs'], + [4, '4 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/pages.py b/old_versions/exp_e4c_fr_risk_binswanger_v2/pages.py new file mode 100644 index 0000000..6c93444 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/pages.py @@ -0,0 +1,149 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +###### traitement 1 risk au début +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + else: + self.player.choicerisknn = "E" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + + + +####################################################### + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def vars_for_template(self): + pass + + def before_next_page(self): + + ########################### + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + + + +class Risk_BinsWanger_result(Page): + form_model = 'player' + form_fields = [] + +class Jeu2End(Page): + pass + +page_sequence = [ + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, + Jeu2End, +# Risk_BinsWanger_color, +# Risk_BinsWanger_result, + + +] diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/AdminReport.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/AdminReport.html new file mode 100644 index 0000000..de3a50e --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/AdminReport.html @@ -0,0 +1,20 @@ +{% load otree %} + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant IDParticipant LabelGain jeu
    {{ row.id }}{{ row.label }}{{ row.answers }}
    \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Jeu2End.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Jeu2End.html new file mode 100644 index 0000000..3f86457 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Jeu2End.html @@ -0,0 +1,44 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Troisième Partie : Fin + {% endif %} + {% if player.id_in_group == 2 %} + Deuxième Partie : Fin + {% endif %} + +{% endblock %} + +{% block content %} +
    +
    + + + {% if player.id_in_group == 1 %} +

    + Vous avez terminé la troisième étape. + +
    Vous allez maintenant commencer la quatrième étape. + +

    + {% endif %} + {% if player.id_in_group == 2 %} +

    + Vous avez terminé la deuxième étape. + +
    Vous allez maintenant commencer la troisième étape. + +

    + {% endif %} + + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger.html new file mode 100644 index 0000000..061c6da --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger.html @@ -0,0 +1,329 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 : Votre choix + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 : Votre choix + {% endif %} +{% endblock %} + +{% block content %} + + + +
    +
    + + + + +

    +Vous allez maintenant jouer au jeu pour de vrai. Le gain de ce jeu sera pris en compte dans le gain final. +

    + + + +

    Veuillez maintenant choisir la situation que vous préférez le plus parmi les choix suivants (A, B, C, D ou E). + +

    + +

    + +

    Merci de faire un choix

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    A
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    B
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    C
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    D
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    E
    (0 ECUs) (12 ECUs)
    + + + + + + + + +




    + + + + +
    + + + +
    + + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_color.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_color.html new file mode 100644 index 0000000..e4129ed --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 : Choix de votre couleur + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 : Choix de votre couleur + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + +
    + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..aa77da8 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc.html @@ -0,0 +1,400 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group == 1 %} + Jeu 2 + {% endif %} + {% if player.id_in_group == 2 %} + Jeu 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: + +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = … €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc2.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..fed16e3 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_qc2.html @@ -0,0 +1,943 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire de compréhension +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Maintenant, nous voulons tester si vous avez compris les instructions du jeu.

    + + +
    + +

    + Exemple 1: + +

    + + +

    Si vous avez choisi la situation B, puis la couleur Verte apparaît. + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    + + A + +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    + + B + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    + C + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    + + D + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    + + E + +
    (0 ECUs) (12 ECUs)
    + + + +

    + Quels seraient vos gains?

    + + {% formfield player.riskqc_a label="" %} + +

    + + + +

    + Example 2: +

    + + +

    Si vous avez choisi la situation D, puis la couleur Rouge apparaît. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    + + A + +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    + + B + + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    + C + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    + + + D + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    + + E + +
    (0 ECUs) (12 ECUs)
    + +

    + Question 2: Quels seraient vos gains?

    + + {% formfield player.riskqc_b label="" %} + +

    + + + +

    + + Example 3: +

    + + +

    Si vous avez choisi la situation E, puis la couleur Rouge apparaît. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    + + A + +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    + + + B + + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    + C + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + +
    + + D + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + +
    + + E + + +
    (0 ECUs) (12 ECUs)
    + + +

    + Question 3: Quels seraient vos gains?

    + + {% formfield player.riskqc_c label="" %} + +

    + + + + + +




    + + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_result.html b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_result.html new file mode 100644 index 0000000..f84fc9f --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/templates/exp_e4c_fr_risk_binswanger_v2/Risk_BinsWanger_result.html @@ -0,0 +1,58 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + + {% if player.id_in_group == 1 %} + Gain Jeu 2 : Détails + {% endif %} + {% if player.id_in_group == 2 %} + Gain Jeu 1 : Détails + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    Votre choix était : {{ player.choicerisknn }}

    + +

    La couleur sélectionné est : {{ player.colorselectnn }}

    + + +

    Votre gain pour ce jeu est : {{ player.gainrisk }} ECU(s)

    + + +

    Votre gain pour ce jeu est : {{ player.gainriskeur }} ECU(s)

    + +

    -----------------------------------------

    + +
    + + + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + +{% endblock %} + + diff --git a/old_versions/exp_e4c_fr_risk_binswanger_v2/tests.py b/old_versions/exp_e4c_fr_risk_binswanger_v2/tests.py new file mode 100644 index 0000000..c2f6c7d --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_binswanger_v2/tests.py @@ -0,0 +1,26 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 5), + }) + + yield (pages.Jeu2End) + diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/__init__.py b/old_versions/exp_e4c_fr_risk_gneezy_v2/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/_builtin/__init__.py b/old_versions/exp_e4c_fr_risk_gneezy_v2/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/models.py b/old_versions/exp_e4c_fr_risk_gneezy_v2/models.py new file mode 100644 index 0000000..e1da3cf --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/models.py @@ -0,0 +1,106 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_risk_gneezy_v2' + players_per_group = 2 + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_fr_risk_gneezy_v2/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/pages.py b/old_versions/exp_e4c_fr_risk_gneezy_v2/pages.py new file mode 100644 index 0000000..92f9f55 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/pages.py @@ -0,0 +1,97 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group == 1 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + +# Jeu 5 :(Gneezy Potters) +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group == 1 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + + + +# Jeu 5 :(Gneezy Potters) Result +class M_risk11_result(Page): + form_model = 'player' + form_fields = [] + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group == 1 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/AdminReport.html b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/AdminReport.html new file mode 100644 index 0000000..2bfb8af --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/AdminReport.html @@ -0,0 +1,22 @@ +{% load otree %} + + + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant ID Participant Label Note
    {{ row.id }}{{ row.label }}
    diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/Jeu1End.html b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/Jeu1End.html new file mode 100644 index 0000000..ed925d8 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Deuxième Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la deuxième étape. + +
    Vous allez maintenant commencer la troisième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/L_risk11_qc.html b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/L_risk11_qc.html new file mode 100644 index 0000000..e3c27fa --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/L_risk11_qc.html @@ -0,0 +1,81 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 1 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + {% include Constants.instructions_GP_template %} + + + + + + + + +
    +
    + +

    + +

    Test de compréhension:

    + + +

    Si vous avez investi 6 ECUs dans le projet risqué :

    + +

    1) Combien d'ECUs avez-vous gardés ?

    + +

    {% formfield player.risk11_qc_a label="" %} +

    +

    2) Si l'investissement est un succès, combien d'ECUs avez-vous gagnés ?

    +

    {% formfield player.risk11_qc_b label="" %} +

    +

    3) Si l'investissement est un échec, combien d'ECUs avez-vous gagnés ?

    +

    {% formfield player.risk11_qc_c label="" %} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/M_risk11.html b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/M_risk11.html new file mode 100644 index 0000000..d4b6630 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 1 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Veillez saisir le montant de votre investissement dans le projet (en ECUs) (un montant entre 0 et 10):

    +

    {% formfield player.risk11_a label="" %} +

    + +

    Ainsi, combien d'ECUs avez vous gardés (un montant entre 0 et 10) ?

    +

    {% formfield player.risk11_b label="" %} +

    + +

    + Note: la somme des deux montants doit être égale à 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/M_risk11_result.html b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 1 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/instructions.html b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/instructions.html new file mode 100644 index 0000000..5114de7 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/templates/exp_e4c_fr_risk_gneezy_v2/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Résumé du jeu :

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2/tests.py b/old_versions/exp_e4c_fr_risk_gneezy_v2/tests.py new file mode 100644 index 0000000..cb15192 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2/tests.py @@ -0,0 +1,28 @@ +from . import pages +from ._builtin import Bot + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.player.id_in_group == 1: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 9, + 'risk11_b': 1, + }) + + yield (pages.Jeu1End) + + + + + + diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/__init__.py b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/_builtin/__init__.py b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/models.py b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/models.py new file mode 100644 index 0000000..ed306c9 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/models.py @@ -0,0 +1,106 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'exp_e4c_fr_risk_gneezy_v2_end' + players_per_group = 2 + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'exp_e4c_fr_risk_gneezy_v2_end/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + def role(self): + return {1: 'A', 2: 'B'}[self.id_in_group] + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/pages.py b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/pages.py new file mode 100644 index 0000000..7c274de --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/pages.py @@ -0,0 +1,97 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group == 2 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + +# Jeu 5 :(Gneezy Potters) +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group == 2 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + + + +# Jeu 5 :(Gneezy Potters) Result +class M_risk11_result(Page): + form_model = 'player' + form_fields = [] + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group == 2 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/AdminReport.html b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/AdminReport.html new file mode 100644 index 0000000..2bfb8af --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/AdminReport.html @@ -0,0 +1,22 @@ +{% load otree %} + + + + + + + + + + + + + {% for row in report %} + + + + + + {% endfor %} + +
    Participant ID Participant Label Note
    {{ row.id }}{{ row.label }}
    diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/Jeu1End.html b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/Jeu1End.html new file mode 100644 index 0000000..43c9c56 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Troisième Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la troisième étape. + +
    Vous allez maintenant commencer la quatrième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/L_risk11_qc.html b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/L_risk11_qc.html new file mode 100644 index 0000000..a197ea0 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Test de compréhension:

    + + +

    Si vous avez investi 6 ECUs dans le projet risqué :

    + +

    1) Combien d'euros avez-vous gardés ?

    + +

    {% formfield player.risk11_qc_a label="" %} +

    +

    2) Si l'investissement est un succès, combien d'euros avez-vous gagnés ?

    +

    {% formfield player.risk11_qc_b label="" %} +

    +

    3) Si l'investissement est un échec, combien d'euros avez-vous gagnés ?

    +

    {% formfield player.risk11_qc_c label="" %} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/M_risk11.html b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/M_risk11.html new file mode 100644 index 0000000..1f0ce09 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Veillez saisir le montant de votre investissement dans le projet (en euros) (un montant entre 0 et 10):

    +

    {% formfield player.risk11_a label="" %} +

    + +

    Ainsi, combien d'euros avez vous gardés (un montant entre 0 et 10) ?

    +

    {% formfield player.risk11_b label="" %} +

    + +

    + Note: la somme des deux montants doit être égale à 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/M_risk11_result.html b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/M_risk11_result.html new file mode 100644 index 0000000..70bdd92 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 2 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/instructions.html b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/instructions.html new file mode 100644 index 0000000..5114de7 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/templates/exp_e4c_fr_risk_gneezy_v2_end/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Résumé du jeu :

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/old_versions/exp_e4c_fr_risk_gneezy_v2_end/tests.py b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/tests.py new file mode 100644 index 0000000..5312696 --- /dev/null +++ b/old_versions/exp_e4c_fr_risk_gneezy_v2_end/tests.py @@ -0,0 +1,30 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.player.id_in_group == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 9, + 'risk11_b': 1, + }) + + yield (pages.Jeu1End) + + + + + diff --git a/payment_info/__init__.py b/payment_info/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/payment_info/_builtin/__init__.py b/payment_info/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/payment_info/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/payment_info/models.py b/payment_info/models.py new file mode 100644 index 0000000..bc8d9ac --- /dev/null +++ b/payment_info/models.py @@ -0,0 +1,34 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + + +doc = """ +This application provides a webpage instructing participants how to get paid. +Examples are given for the lab and Amazon Mechanical Turk (AMT). +""" + + +class Constants(BaseConstants): + name_in_url = 'payment_info' + players_per_group = None + num_rounds = 1 + + +class Subsession(BaseSubsession): + pass + + +class Group(BaseGroup): + pass + + +class Player(BasePlayer): + pass diff --git a/payment_info/pages.py b/payment_info/pages.py new file mode 100644 index 0000000..7e49437 --- /dev/null +++ b/payment_info/pages.py @@ -0,0 +1,12 @@ +from ._builtin import Page, WaitPage +from otree.api import Currency as c, currency_range +from .models import Constants + + +class PaymentInfo(Page): + def vars_for_template(self): + participant = self.participant + return dict(redemption_code=participant.label or participant.code) + + +page_sequence = [PaymentInfo] diff --git a/payment_info/templates/payment_info/PaymentInfo.html b/payment_info/templates/payment_info/PaymentInfo.html new file mode 100644 index 0000000..a9ef850 --- /dev/null +++ b/payment_info/templates/payment_info/PaymentInfo.html @@ -0,0 +1,23 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +

    Le questionnaire est terminé.

    + +

    + + +{% endblock %} + +{% block content %} + + +

    + Merci pour votre participation !!

    +

    +
    +

    + Veillez remettre la tablette à un responsable !!

    +

    + +{% endblock %} \ No newline at end of file diff --git a/payment_info/tests.py b/payment_info/tests.py new file mode 100644 index 0000000..fbb6009 --- /dev/null +++ b/payment_info/tests.py @@ -0,0 +1,9 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants + + +class PlayerBot(Bot): + def play_round(self): + pass diff --git a/payment_info_mturk/__init__.py b/payment_info_mturk/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/payment_info_mturk/_builtin/__init__.py b/payment_info_mturk/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/payment_info_mturk/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/payment_info_mturk/models.py b/payment_info_mturk/models.py new file mode 100644 index 0000000..5f08b36 --- /dev/null +++ b/payment_info_mturk/models.py @@ -0,0 +1,34 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + + +doc = """ +This application provides a webpage instructing participants how to get paid. +Examples are given for the lab and Amazon Mechanical Turk (AMT). +""" + + +class Constants(BaseConstants): + name_in_url = 'payment_info_mturk' + players_per_group = None + num_rounds = 1 + + +class Subsession(BaseSubsession): + pass + + +class Group(BaseGroup): + pass + + +class Player(BasePlayer): + pass diff --git a/payment_info_mturk/pages.py b/payment_info_mturk/pages.py new file mode 100644 index 0000000..7e49437 --- /dev/null +++ b/payment_info_mturk/pages.py @@ -0,0 +1,12 @@ +from ._builtin import Page, WaitPage +from otree.api import Currency as c, currency_range +from .models import Constants + + +class PaymentInfo(Page): + def vars_for_template(self): + participant = self.participant + return dict(redemption_code=participant.label or participant.code) + + +page_sequence = [PaymentInfo] diff --git a/payment_info_mturk/templates/payment_info_mturk/PaymentInfo.html b/payment_info_mturk/templates/payment_info_mturk/PaymentInfo.html new file mode 100644 index 0000000..692d4ae --- /dev/null +++ b/payment_info_mturk/templates/payment_info_mturk/PaymentInfo.html @@ -0,0 +1,28 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +

    The questionnaire is finished.

    + +

    + + +{% endblock %} + +{% block content %} + + +

    + Thank you for your participation !!

    +
    +

    + Your task end code is: "TRUST2021" +

    +
    +

    + Please copy and paste it in the initial page. +

    + +

    + +{% endblock %} diff --git a/payment_info_mturk/tests.py b/payment_info_mturk/tests.py new file mode 100644 index 0000000..fbb6009 --- /dev/null +++ b/payment_info_mturk/tests.py @@ -0,0 +1,9 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants + + +class PlayerBot(Bot): + def play_round(self): + pass diff --git a/quest_demo/__init__.py b/quest_demo/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/quest_demo/_builtin/__init__.py b/quest_demo/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/quest_demo/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/quest_demo/models.py b/quest_demo/models.py new file mode 100644 index 0000000..dddb29c --- /dev/null +++ b/quest_demo/models.py @@ -0,0 +1,173 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + + +class Constants(BaseConstants): + name_in_url = 'quest_demo' + players_per_group = None + num_rounds = 1 + +class Subsession(BaseSubsession): + pass + + +class Group(BaseGroup): + pass + + +class Player(BasePlayer): + task_start_1 = models.FloatField() + task_time_1 = models.FloatField() + num_errors = models.IntegerField() + + genre = models.IntegerField( + choices=[ + [0, 'Un homme'], + [1, 'Une femme'], + ], + widget=widgets.RadioSelectHorizontal, + label="1 - Vous êtes ...", + blank=False + ) + + age = models.IntegerField( + choices=[ + [0, '0-17 ans'], + [1, '18-25 ans'], + [2, '26-35 ans'], + [3, '36-45 ans'], + [4, '46-55 ans'], + [5, '56-65 ans'], + [6, 'plus de 65 ans'], + ], + widget=widgets.RadioSelectHorizontal, + label="2 - Quel est votre âge ?", + blank=False, + min = 0, + max = 100, + ) + + pays = models.StringField( + label="3 - Quel est votre pays de résidence ?", + blank=False, + ) + + code_postal = models.IntegerField( + label="4 - Quel est votre code postale ?", + blank=False, + min = 0, + max = 99999, + ) + + salaire = models.IntegerField( + choices=[ + [0, 'Moins de 1250 €'], + [1, 'Entre 1250 et 1400 €'], + [2, 'Entre 1400 et 1550 €'], + [3, 'Entre 1550 et 1700 €'], + [4, 'Entre 1700 et 1850 €'], + [5, 'Entre 1850 et 2050 €'], + [6, 'Entre 2050 et 2350 €'], + [7, 'Entre 2350 et 2800 €'], + [8, 'Entre 2800 et 3700 €'], + [9, 'Plus de 3700 €'], + ], + widget=widgets.RadioSelect, + label="5 - Quel est approximativement votre niveau de salaire mensuel ?", + blank=False + ) + + socio_pro = models.IntegerField( + choices=[ + [0, 'agriculteurs exploitants'], + [1, 'artisans, commerçants et chefs d''entreprise'], + [2, 'cadres et professions intellectuelles supérieures'], + [3, 'professions intermédiaires (cadres moyens)'], + [4, 'employés et personnel de service'], + [5, 'ouvriers qualifiés'], + [6, 'manœuvres et ouvriers spécialisés'], + [7, 'autres personnes sans activité professionnelle'], + [8, 'étudiant'], + ], + widget=widgets.RadioSelect, + label="6 - Quelle est/était votre catégorie socio-professionnelle ?", + blank=False + ) + + annee_naissance = models.IntegerField( + label="7 - Quelle est votre année de naissance ?", + blank=False, + min=1900, + max=2010, + ) + + etudes = models.IntegerField( + choices=[ + [0, 'Aucun diplôme ou certificat d’études primaires'], + [1, 'Brevet des collèges'], + [2, 'CAP, BEP ou équivalent'], + [3, 'Baccalauréat, brevet professionnel ou équivalent'], + [4, 'Diplôme du supérieur court (niveau bac +2)'], + [5, 'Diplôme du supérieur long (supérieur à bac +2)'], + ], + widget=widgets.RadioSelect, + label="8 - Quel est le plus haut diplôme que vous avez obtenu ? Si toujours étudiant, quel est le diplôme dans lequel vous êtes actuellement inscrit ?", + blank=False + ) + + police_question1 = models.IntegerField( + choices=[ + [0, 'Très satisfaisante'], + [1, 'Satisfaisante'], + [2, 'Peu satisfaisante'], + [3, 'Pas du tout satisfaisante'], + ], + widget=widgets.RadioSelectHorizontal, + label="9 - A propos de l’action en général de la police ou de la gendarmerie nationale dans la société française actuelle, vous diriez généralement qu’elle est …", + blank=False + ) + + police_question2 = models.IntegerField( + choices=[ + [0, 'Souvent'], + [1, 'De temps en temps'], + [2, 'Rarement'], + [3, 'Jamais'], + ], + widget=widgets.RadioSelectHorizontal, + label="10 - Vous arrive-t-il personnellement de vous sentir en insécurité dans votre quartier ou votre village ?", + blank=False + ) + + police_question3 = models.IntegerField( + choices=[ + [0, 'Pas du tout d’accord'], + [1, 'Plutôt pas d’accord'], + [2, 'Plutôt d’accord'], + [3, 'Tout à fait d’accord'], + ], + widget=widgets.RadioSelectHorizontal, + label="11 - Imaginons que dans le futur vous soyez la victime d’un vol. Vous êtes certain d’aller le déclarer auprès de la police.", + blank=False + ) + + + + + + + + + + + + + diff --git a/quest_demo/pages.py b/quest_demo/pages.py new file mode 100644 index 0000000..d1db038 --- /dev/null +++ b/quest_demo/pages.py @@ -0,0 +1,28 @@ +from ._builtin import Page, WaitPage +from otree.api import Currency as c, currency_range +from .models import Constants + +import random +import time + + +class Welcome(Page): + form_model = 'player' + form_fields = [] + +class Questionnaire(Page): + form_model = 'player' + form_fields = ['genre', 'age','pays', 'code_postal','salaire', + 'socio_pro', 'annee_naissance','etudes', 'police_question1', + 'police_question2', 'police_question3' + ] + +class Result(Page): + form_model = 'player' + form_fields = [] + +page_sequence = [ + Welcome, + Questionnaire, +] + diff --git a/quest_demo/templates/quest_demo/Questionnaire.html b/quest_demo/templates/quest_demo/Questionnaire.html new file mode 100644 index 0000000..77f1bd7 --- /dev/null +++ b/quest_demo/templates/quest_demo/Questionnaire.html @@ -0,0 +1,40 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire +{% endblock %} + +{% block content %} +
    +
    + + {% formfield player.genre %} +
    + {% formfield player.age %} +
    + {% formfield player.pays %} +
    + {% formfield player.code_postal %} +
    + {% formfield player.salaire %} +
    + {% formfield player.socio_pro %} +
    + {% formfield player.annee_naissance %} +
    + {% formfield player.etudes %} +
    + {% formfield player.police_question1 %} +
    + {% formfield player.police_question2 %} +
    + {% formfield player.police_question3 %} +
    + +
    +
    + + {% next_button %} + +{% endblock %} diff --git a/quest_demo/templates/quest_demo/Welcome.html b/quest_demo/templates/quest_demo/Welcome.html new file mode 100644 index 0000000..4814629 --- /dev/null +++ b/quest_demo/templates/quest_demo/Welcome.html @@ -0,0 +1,18 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Bienvenue +{% endblock %} + +{% block content %} + +

    + Merci de répondre aux questions suivantes. +

    + + {% formfields %} + + {% next_button %} + +{% endblock %} diff --git a/quest_demo/tests.py b/quest_demo/tests.py new file mode 100644 index 0000000..75b255a --- /dev/null +++ b/quest_demo/tests.py @@ -0,0 +1,18 @@ +from otree.api import Currency as c, currency_range + +from . import pages +from ._builtin import Bot +from .models import Constants + + +class PlayerBot(Bot): + def play_round(self): + + yield (pages.Demographics, {'age': 24, 'gender': 'Male'}) + + yield ( + pages.CognitiveReflectionTest, {'crt_bat': 10, 'crt_widget': 5, 'crt_lake': 48}, + ) + + for value in [self.player.crt_bat, self.player.payoff]: + assert value != None diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..72b01ab --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +# oTree-may-not-overwrite-this-file +otree[mturk]>=3.3.11,<5 +psycopg2>=2.8.4,<2.9 +sentry-sdk==0.7.9 diff --git a/requirements_base.txt b/requirements_base.txt new file mode 100644 index 0000000..ac998e5 --- /dev/null +++ b/requirements_base.txt @@ -0,0 +1,2 @@ +# You should put your requirements in requirements.txt instead. +# You can delete this file. diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..43b47fb --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +python-3.8.5 diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..704a058 --- /dev/null +++ b/settings.py @@ -0,0 +1,356 @@ +from os import environ + + +# if you set a property in SESSION_CONFIG_DEFAULTS, it will be inherited by all configs +# in SESSION_CONFIGS, except those that explicitly override it. +# the session config can be accessed from methods in your apps as self.session.config, +# e.g. self.session.config['participation_fee'] + +#### WB MTURK / session config MTurk ######################### + +mturk_hit_settings = { + 'keywords': ['Survey', 'Game', 'Demographics'], # Questionnaire démographique #'Questionnaire', 'Français' + 'title': 'Survey (gain $3.0, duration 7 min)',# Questionnaire démographique + 'description': 'You can earn up to $3.0 in approximately 7 minutes.', # Questionnaire démographique: Gain de $0.60 pour une durée de 1 minute. + 'frame_height': 500, + 'template': 'global/mturk_template.html', + 'minutes_allotted_per_assignment': 60, + 'expiration_hours': 7*24, # 7 days +# 'grant_qualification_id': '3O3C52ZQEUFOKIZH0662Y397HAFSHV',# Mturk reel Exp G-J ###to prevent retakes +# 'grant_qualification_id': '3ZSPHI510NGVHARBJTEPE3ECGE6IJ2', # Sandbox Exp G-J + 'grant_qualification_id': '3IMKSS0I9C91UAW9OSPZY1N2EAQW6A' , # Mturk exp Covid +# 'grant_qualification_id': '3LKGAM13UYJQHAONM1Z1QYBBX0W7ES', # Sandbox exp Covid + +# 'grant_qualification_id': '3C2W12C2LIJHOP5OLGDWR8T1PGZURB',# Mturk reel Exp Ines +# 'grant_qualification_id': '3MTUBPNNZX0I8DMRLCRIX5T88L6XMM', # Sandbox Exp Ines + + 'qualification_requirements': [ + { + 'QualificationTypeId': "00000000000000000071", # que pour expé Ines ##### workers from the US, 00000000000000000071 is the code for a location-based qualification + 'Comparator': "EqualTo", +# 'LocaleValues': [{'Country': "FR"}] + 'LocaleValues': [{'Country': "US"}] + }, + + { +# 'QualificationTypeId': "3O3C52ZQEUFOKIZH0662Y397HAFSHV", # Mturk reel Exp G-J ###To prevent a worker from participating in your study twice +# 'QualificationTypeId': "3ZSPHI510NGVHARBJTEPE3ECGE6IJ2", # Sandbox Exp G-J +# 'QualificationTypeId': '3C2W12C2LIJHOP5OLGDWR8T1PGZURB',# Mturk reel Exp Ines +# 'QualificationTypeId': '3MTUBPNNZX0I8DMRLCRIX5T88L6XMM', # Sandbox Exp Ines + 'QualificationTypeId': '3IMKSS0I9C91UAW9OSPZY1N2EAQW6A', # Mturk exp Covid +# 'QualificationTypeId':'3LKGAM13UYJQHAONM1Z1QYBBX0W7ES', # Sandbox exp Covid + + 'Comparator': "DoesNotExist", + } + +] + } +############################################################################# +SESSION_CONFIG_DEFAULTS = { + 'real_world_currency_per_point': 0.001,# 0.001 pour exp realeffort et exp covid sinon = 1 + 'participation_fee': 0,# 0.5 # 0 Expé police + 'doc': "", + 'mturk_hit_settings': mturk_hit_settings, +} +############################################################################# + + + + +# # Liste des jeux +# games = [ +# 'a3_gp', +# 'b3_bw', +# 'dictator_modif_asso', +# 'dictator_modif_class', +# ] +# +# # Mélanger l'ordre des jeux +# random.shuffle(games) + + +def custom_app_sequence(num_participants): + # Define the tasks + tasks = ['A', 'B', 'C', 'D'] + + # Create a list to store randomized sequences for each participant + participant_sequences = [] + + # Generate a random sequence for each participant + for _ in range(num_participants): + participant_sequence = tasks[:] # Copy the tasks list + shuffle(participant_sequence) # Shuffle the sequence for each participant + participant_sequences.append(participant_sequence) + + return participant_sequences + + + +SESSION_CONFIGS = [ + + # dict( + # name='exp2_e4c', + # display_name='exp2_e4c', + # num_demo_participants=1, + # app_sequence=['a3_welcome', + # 'a1_en_p1_quest', + # 'a3_gp', + # 'b3_bw', + # 'dictator_modif_asso', + # 'dictator_modif_class', + # 'a5_questfin', + # ], + # ), # + # + # dict( + # name='exp2_e4c_BOT', + # display_name='exp2_e4c_BOT', + # num_demo_participants=1, + # app_sequence=['a3_welcome', + # 'a1_en_p1_quest', + # 'a3_gp', + # 'b3_bw', + # 'dictator_modif_asso', + # 'dictator_modif_class', + # 'a5_questfin', + # ], + # use_browser_bots=True, + # + # ), # + + dict( + name='exp2_e4c_random', + display_name='exp2_e4c_random', + num_demo_participants=1, + app_sequence=['a3_welcome', + 'a1_en_p1_quest', + 'b3_bw_v2', # game 2 (v2) + 'a3_gp', # game 1 + 'b3_bw', # game 2 + 'dictator_modif_class_v2', # game 4 (v2) + 'dictator_modif_asso', # game 3 + 'dictator_modif_class', # game 4 + 'a1_en_p1_quest_v2', # questionnaire (after) + 'a5_questfin', + ], + ), # + + + dict( + name='exp2_e4c_random_BOT', + display_name='exp2_e4c_random_BOT', + num_demo_participants=1, + app_sequence=['a3_welcome', + 'a1_en_p1_quest', + 'b3_bw_v2', # game 2 (v2) + 'a3_gp', # game 1 + 'b3_bw', # game 2 + 'dictator_modif_class_v2', # game 4 (v2) + 'dictator_modif_asso', # game 3 + 'dictator_modif_class', # game 4 + 'a1_en_p1_quest_v2', # questionnaire (after) + 'a5_questfin', + ], + use_browser_bots=True, + + ), # + + + + + # dict( + # name='trust', + # display_name='trust', + # num_demo_participants=2, + # app_sequence=['trust', + # ], + # ), + # + # dict( + # name='exp_e4c_final_FR_EN_MAY_2022', + # display_name='exp_e4c_final_FR_EN_MAY_2022', + # num_demo_participants=1, + # app_sequence=[ + # 'v2_exp_e4c_a_p0', + # + # 'v2_exp_e4c_fr_p2_risk_gneezy', + # 'v2_exp_e4c_fr_p3_risk_binswanger', + # 'v2_exp_e4c_fr_p2bis_risk_gneezy_end', + # 'v2_exp_e4c_fr_p1_quest', + # 'v2_exp_e4c_fr_p5_questfin', + # + # 'v2_exp_e4c_en_p2_risk_gneezy', + # 'v2_exp_e4c_en_p3_risk_binswanger', + # 'v2_exp_e4c_en_p2bis_risk_gneezy_end', + # 'v2_exp_e4c_en_p1_quest', + # 'v2_exp_e4c_en_p5_questfin', + # 'v2_exp_e4c_x_fr_en_fin', + # + # ], + # + # ), # + # + # dict( + # name='exp_e4c_final_FR_EN_MAY_2022_BOT', + # display_name='exp_e4c_final_FR_EN_MAY_2022_BOT', + # num_demo_participants=1, + # app_sequence=[ + # 'v2_exp_e4c_a_p0', + # + # 'v2_exp_e4c_fr_p2_risk_gneezy', + # 'v2_exp_e4c_fr_p3_risk_binswanger', + # 'v2_exp_e4c_fr_p2bis_risk_gneezy_end', + # 'v2_exp_e4c_fr_p1_quest', + # 'v2_exp_e4c_fr_p5_questfin', + # + # 'v2_exp_e4c_en_p2_risk_gneezy', + # 'v2_exp_e4c_en_p3_risk_binswanger', + # 'v2_exp_e4c_en_p2bis_risk_gneezy_end', + # 'v2_exp_e4c_en_p1_quest', + # 'v2_exp_e4c_en_p5_questfin', + # 'v2_exp_e4c_x_fr_en_fin', + # + # + # ], + # use_browser_bots=True, + # ), # + + # dict( + # name='dictator_modif', + # display_name='dictator_modif', + # num_demo_participants=2, + # app_sequence=['dictator_modif', + # ], + # ), + # + # dict( + # name='GAME_1_GP_test', + # display_name='GAME_1_GP_test', + # num_demo_participants=1, + # app_sequence=[ + # 'a3_gp', + # ], + # ), # + # + # dict( + # name='GAME_1_GP_test_BOT', + # display_name='GAME_1_GP_test_BOT', + # num_demo_participants=1, + # app_sequence=[ + # 'a3_gp', + # ], + # use_browser_bots=True, + # ), # + # + # dict( + # name='GAME_2_BW_test', + # display_name='GAME_2_BW_test', + # num_demo_participants=1, + # app_sequence=[ + # 'b3_bw', + # ], + # ), # + # + # dict( + # name='GAME_3_BW_test_BOT', + # display_name='GAME_3_BW_test_BOT', + # num_demo_participants=1, + # app_sequence=[ + # 'b3_bw', + # ], + # use_browser_bots=True, + # ), # + # + # dict( + # name='GAME_3_dictator_modif_asso', + # display_name='GAME_3_dictator_modif_asso', + # num_demo_participants=1, + # app_sequence=['dictator_modif_asso', + # ], + # ), + # + # dict( + # name='GAME_3_dictator_modif_asso_BOT', + # display_name='GAME_3_dictator_modif_asso_BOT', + # num_demo_participants=1, + # app_sequence=['dictator_modif_asso', + # ], + # use_browser_bots=True, + # ), + # + # dict( + # name='GAME_4_dictator_modif_class', + # display_name='GAME_4_dictator_modif_class', + # num_demo_participants=1, + # app_sequence=['dictator_modif_class', + # ], + # ), + # + # dict( + # name='GAME_4_dictator_modif_class_BOT', + # display_name='GAME_4_dictator_modif_class_BOT', + # num_demo_participants=1, + # app_sequence=['dictator_modif_class', + # ], + # use_browser_bots=True, + # ), + + # dict( + # name='dictator_one_shot', + # display_name="Dictator game (10 rounds, different players)", + # app_sequence=['dictator', 'payment_info'], + # num_demo_participants=2, + # ), + + + +] + + + +# ISO-639 code +# for example: de, fr, ja, ko, zh-hans +LANGUAGE_CODE = 'en' #en # 'fr' pour Exp Mindfullness et exp police + +# e.g. EUR, GBP, CNY, JPY +REAL_WORLD_CURRENCY_CODE = 'USD' # EUR pour Exp Mindfullness +USE_POINTS = True # False + +ROOMS = [ + dict( + name="labeds", + display_name="labeds", + participant_label_file="_rooms/labeds.txt" + ), +] + +#ADMIN_USERNAME = 'admin' +ADMIN_USERNAME = 'wael bousselmi' +# for security, best to set admin password in an environment variable +ADMIN_PASSWORD = environ.get('OTREE_ADMIN_PASSWORD') + + +DEMO_PAGE_INTRO_HTML = """ +Here are some oTree games. +""" + +# don't share this with anybody. +SECRET_KEY = 'nm5eaornndp(_0bt_64k+03(-f-n%4bir_+==$8i7&-o$th2@)' + +# List of additional apps besides otree default apps +INSTALLED_APPS = ['otree', 'a3_welcome', 'a3_gp', 'b3_bw', 'dictator_modif_asso', 'dictator_modif_class'] + + + +AWS_ACCESS_KEY_ID = environ.get('AWS_ACCESS_KEY_ID') +AWS_SECRET_ACCESS_KEY = environ.get('AWS_SECRET_ACCESS_KEY') + + + + + + + + + + diff --git a/trust/__init__.py b/trust/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/trust/_builtin/__init__.py b/trust/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/trust/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/trust/models.py b/trust/models.py new file mode 100644 index 0000000..2d4aa7b --- /dev/null +++ b/trust/models.py @@ -0,0 +1,63 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + + +doc = """ +This is a standard 2-player trust game where the amount sent by player 1 gets +tripled. The trust game was first proposed by + + Berg, Dickhaut, and McCabe (1995) +. +""" + + +class Constants(BaseConstants): + name_in_url = 'trust' + players_per_group = 2 + num_rounds = 1 + + instructions_template = 'trust/instructions.html' + + # Initial amount allocated to each player + endowment = c(100) + multiplier = 3 + + +class Subsession(BaseSubsession): + pass + + +class Group(BaseGroup): + sent_amount = models.CurrencyField( + min=0, max=Constants.endowment, doc="""Amount sent by P1""" + ) + + sent_back_amount = models.CurrencyField(doc="""Amount sent back by P2""", min=c(0)) + + def sent_back_amount_max(self): + return self.sent_amount * Constants.multiplier + + def set_payoffs(self): + p1 = self.get_player_by_id(1) + p2 = self.get_player_by_id(2) + p1.payoff = Constants.endowment - self.sent_amount + self.sent_back_amount + p2.payoff = self.sent_amount * Constants.multiplier - self.sent_back_amount + + +class Player(BasePlayer): + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + def role(self): + if self.id_in_group == 1: + return 'trustor' + if self.id_in_group == 2: + return 'trustee' \ No newline at end of file diff --git a/trust/pages.py b/trust/pages.py new file mode 100644 index 0000000..3c7589b --- /dev/null +++ b/trust/pages.py @@ -0,0 +1,64 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + + +class Introduction(Page): + pass + + +class Send(Page): + """This page is only for P1 + P1 sends amount (all, some, or none) to P2 + This amount is tripled by experimenter, + i.e if sent amount by P1 is 5, amount received by P2 is 15""" + + form_model = 'group' + form_fields = ['sent_amount'] + + def is_displayed(self): + return self.player.id_in_group == 1 + + +class SendBackWaitPage(WaitPage): + pass + + +class SendBack(Page): + """This page is only for P2 + P2 sends back some amount (of the tripled amount received) to P1""" + + form_model = 'group' + form_fields = ['sent_back_amount'] + + def is_displayed(self): + return self.player.id_in_group == 2 + + def vars_for_template(self): + tripled_amount = self.group.sent_amount * Constants.multiplier + + return dict( + tripled_amount=tripled_amount, + prompt='Please an amount from 0 to {}'.format(tripled_amount), + ) + + +class ResultsWaitPage(WaitPage): + after_all_players_arrive = 'set_payoffs' + + +class Results(Page): + """This page displays the earnings of each player""" + + def vars_for_template(self): + return dict(tripled_amount=self.group.sent_amount * Constants.multiplier) + + +page_sequence = [ + Introduction, + Send, + SendBackWaitPage, + SendBack, + ResultsWaitPage, + Results, +] diff --git a/trust/templates/trust/Introduction.html b/trust/templates/trust/Introduction.html new file mode 100644 index 0000000..f3493bb --- /dev/null +++ b/trust/templates/trust/Introduction.html @@ -0,0 +1,14 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Introduction +{% endblock %} + +{% block content %} + + {% include Constants.instructions_template %} + + {% next_button %} + +{% endblock %} diff --git a/trust/templates/trust/Results.html b/trust/templates/trust/Results.html new file mode 100644 index 0000000..13e9603 --- /dev/null +++ b/trust/templates/trust/Results.html @@ -0,0 +1,41 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Results +{% endblock %} + +{% block content %} + + {% if player.role == 'A' %} +

    + You chose to send participant B {{ group.sent_amount }}. + Participant B returned {{ group.sent_back_amount }}. +

    +

    + You were initially endowed with {{ Constants.endowment }}, + chose to send {{ group.sent_amount }}, + received {{ group.sent_back_amount }} + thus you now have: + {{ Constants.endowment }}-{{ group.sent_amount }}+{{ group.sent_back_amount }}={{ player.payoff }} +

    + {% else %} +

    + Participant A sent you {{ group.sent_amount }}. + They were tripled so you received {{ tripled_amount }}. + You chose to return {{ group.sent_back_amount }}. +

    +

    + You received {{ tripled_amount }}, + chose to return {{ group.sent_back_amount }} + thus you now have: + ({{ tripled_amount }})-({{ group.sent_back_amount }})={{ player.payoff }} +

    + . + {% endif %} + +

    {% next_button %}

    + + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/trust/templates/trust/Send.html b/trust/templates/trust/Send.html new file mode 100644 index 0000000..1d3220f --- /dev/null +++ b/trust/templates/trust/Send.html @@ -0,0 +1,21 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Your Choice +{% endblock %} + +{% block content %} + +

    + You are Participant A. Now you have {{Constants.endowment}}. How much will you send to participant B? +

    + + {% formfield group.sent_amount label="Please enter an amount from 0 to 100:" %} +

    + {% next_button %} +

    + + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/trust/templates/trust/SendBack.html b/trust/templates/trust/SendBack.html new file mode 100644 index 0000000..74de502 --- /dev/null +++ b/trust/templates/trust/SendBack.html @@ -0,0 +1,20 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Your Choice +{% endblock %} + +{% block content %} +

    + You are Participant B. + Participant A sent you {{group.sent_amount}} and you received {{tripled_amount}}. + Now you have {{tripled_amount}}. + How much will you send to participant A? +

    + + {% formfield group.sent_back_amount label=prompt %} +

    {% next_button %}

    + {% include Constants.instructions_template %} + +{% endblock %} diff --git a/trust/templates/trust/instructions.html b/trust/templates/trust/instructions.html new file mode 100644 index 0000000..cc1164d --- /dev/null +++ b/trust/templates/trust/instructions.html @@ -0,0 +1,28 @@ +{% load otree %} + +
    +
    + +

    + Instructions +

    +

    + You have been randomly and anonymously paired with another participant. + One of you will be selected at random to be participant A; + the other will be participant B. + You will learn whether you are participant A or B prior to making any + decision. +

    +

    + To start, participant A receives {{ Constants.endowment }}; + participant B receives + nothing. + Participant A can send some or all of + his {{ Constants.endowment }} to participant B. + Before B receives this amount, it will be multiplied + by {{ Constants.multiplier }}. Once B receives + the tripled amount he can decide to send some or all of it to + A. +

    +
    +
    \ No newline at end of file diff --git a/trust/tests.py b/trust/tests.py new file mode 100644 index 0000000..38e8d15 --- /dev/null +++ b/trust/tests.py @@ -0,0 +1,18 @@ +from otree.api import Currency as c, currency_range +from . import pages +from ._builtin import Bot +from .models import Constants + + +class PlayerBot(Bot): + def play_round(self): + + yield (pages.Introduction) + + if self.player.id_in_group == 1: + yield (pages.Send, {"sent_amount": 4}) + + else: + yield (pages.SendBack, {'sent_back_amount': 8}) + + yield (pages.Results) diff --git a/v2_exp_e4c_a_p0/__init__.py b/v2_exp_e4c_a_p0/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_a_p0/_builtin/__init__.py b/v2_exp_e4c_a_p0/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_a_p0/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_a_p0/models.py b/v2_exp_e4c_a_p0/models.py new file mode 100644 index 0000000..e9a778b --- /dev/null +++ b/v2_exp_e4c_a_p0/models.py @@ -0,0 +1,71 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_a_p0' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + + id_in_group_nn = models.IntegerField() + secondexp = models.StringField() + ######################################## le code ci-dessous ne fonctionne pas (du role) + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + versionexp = models.IntegerField( + choices=[ + [1, '1 - Je veux participer en "Français" '], + [2, '2 - I want to participate in "English" '], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + language = models.StringField() + + + + + + + diff --git a/v2_exp_e4c_a_p0/pages.py b/v2_exp_e4c_a_p0/pages.py new file mode 100644 index 0000000..48ab793 --- /dev/null +++ b/v2_exp_e4c_a_p0/pages.py @@ -0,0 +1,70 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Bienvenue0(Page): + form_model = 'player' + form_fields = ['versionexp'] + + def before_next_page(self): + self.participant.vars['versionexp'] = self.player.versionexp + self.player.secondexp = "Yes" + if self.player.id_in_group % 2 == 1: + self.player.id_in_group_nn = 1 + else : + self.player.id_in_group_nn = 2 + + self.player.participant.vars['role_nn'] = self.player.id_in_group_nn + + +class Bienvenue(Page): # version française + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.language = "FR" + self.player.participant.vars['language'] = self.player.language + + + + if self.player.id_in_group % 2 == 1: + self.player.treatment = 1 # gneezy - BinsWanger + else: + self.player.treatment = 2 # BinsWanger -gneezy + + self.player.participant.vars['treatment'] = self.player.treatment + +class BienvenueBis(Page): # version anglaise + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + def before_next_page(self): + + self.player.language = "EN" + self.player.participant.vars['language'] = self.player.language + + if self.player.id_in_group % 2 == 1: + self.player.treatment = 1 # gneezy - BinsWanger + else: + self.player.treatment = 2 # BinsWanger -gneezy + + self.player.participant.vars['treatment'] = self.player.treatment + + +page_sequence = [ + Bienvenue0, + Bienvenue, + BienvenueBis, + +] diff --git a/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/Bienvenue.html b/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/Bienvenue.html new file mode 100644 index 0000000..d345c6a --- /dev/null +++ b/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/Bienvenue.html @@ -0,0 +1,68 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie +{% endblock %} + +{% block content %} + + +
    +
    + +

    Bienvenue

    + +

    + Merci d’avoir accepté de participer à cette expérience. + Une rémunération fixe (de 5 €) vous sera versée + pour votre participation, et ce, quelles que soient vos réponses durant + cette expérience. À cela s’ajoutera une rémunération variable liée + à vos réponses au cours + de l’expérience. +

    + +

    + L’expérience dure environ 30 min. Elle se compose de deux types de tâches : + les questionnaires et les jeux. + La rémunération variable que vous percevrez à la fin de l’expérience + ne dépendra pas de vos réponses + aux questionnaires. + En effet, dans ces questionnaires, il n’y a ni bonne, ni mauvaise réponse. + En revanche, votre rémunération + variable dépendra + de la qualité de vos réponses aux jeux. Plus précisément, à la fin de l’expérience, + un seul des jeux + sera sélectionné + aléatoirement pour être payé pour de bon. +

    +
    La monnaie utilisée dans cette expérience est l'ECU. +
    Taux de change 1 ECU = {{ Constants.tauxchange}} €.
    + +
    + Important : Toutes vos réponses seront traitées anonymement. + Personne n’aura la possibilité d’identifier directement vos décisions. + + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/Bienvenue0.html b/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/Bienvenue0.html new file mode 100644 index 0000000..122e029 --- /dev/null +++ b/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/Bienvenue0.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie / Experiment in economics +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    +

    Choix de la langue / Choice of language

    + {% formfield player.versionexp %} + +

    + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/BienvenueBis.html b/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/BienvenueBis.html new file mode 100644 index 0000000..8a89a4d --- /dev/null +++ b/v2_exp_e4c_a_p0/templates/v2_exp_e4c_a_p0/BienvenueBis.html @@ -0,0 +1,60 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Experiment in economics +{% endblock %} + +{% block content %} + + +
    +
    + +

    Welcome

    + +

    + Thank you for agreeing to participate in this experience. A fixed remuneration (of 5 €) will be paid to you + at the end of the experience for your participation, regardless of your answers during + this experience. To this will be added variable compensation linked to your answers to the course + experience. +

    + +

    + + The experience lasts about 30 minutes. It consists of two types of tasks : questionnaires and games. + The variable remuneration that you will receive at the end of the experience will not depend on your answers to the questionnaires. + Indeed, in these questionnaires, there is neither right nor wrong answer. On the other hand, your variable remuneration will depend on the quality of your answers to the games. +Specifically, at the end of the experiment, only one of the games will be randomly selected to be paid for for real. +
    The currency used in this experiment is the ECU. +

    Exchange rate 1 ECU = {{ Constants.tauxchange}} €.
    + +
    + Important: All your answers will be treated anonymously. No one will be able + to directly identify your decisions. + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/v2_exp_e4c_a_p0/tests.py b/v2_exp_e4c_a_p0/tests.py new file mode 100644 index 0000000..836df06 --- /dev/null +++ b/v2_exp_e4c_a_p0/tests.py @@ -0,0 +1,23 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + yield (pages.Bienvenue0, { + 'versionexp': random.randint(1,2), + }) + + if self.participant.vars['versionexp'] == 1: + yield (pages.Bienvenue) + elif self.participant.vars['versionexp'] == 2: + yield (pages.BienvenueBis) + + + diff --git a/v2_exp_e4c_en_p1_quest/__init__.py b/v2_exp_e4c_en_p1_quest/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_en_p1_quest/_builtin/__init__.py b/v2_exp_e4c_en_p1_quest/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_en_p1_quest/models.py b/v2_exp_e4c_en_p1_quest/models.py new file mode 100644 index 0000000..ecfcb3a --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/models.py @@ -0,0 +1,790 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_en_p1_quest' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + language = models.StringField() + + q_1 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + # q_6 = models.IntegerField( + # choices=[ + # [1, '1'], + # [2, '2'], + # [3, '3'], + # [4, '4'], + # [5, '5'], + # [6, '6'], + # ], + # widget=widgets.RadioSelectHorizontal, + # label="", + # blank=False + # ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drink coffee (or the) at school/work'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + # q_11 = models.IntegerField( + # choices=[ + # [1, '1 - Jamais'], + # [2, '2 - Rarement'], + # [3, '3 - Souvent'], + # [4, '4 - Toujours'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t use batteries'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) +################################################ page Questionnaire 1 + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_17 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_19 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_19_a = models.IntegerField( + label="", + blank=True + ) + + q_19_b = models.StringField( + label="", + blank=True + ) + + q_20 = models.IntegerField( + choices=[ + [1, 'a- Green (100% electric or hybrid) (€26 per ride)'], + [2, 'b- UberX (Economical, fast and reliable) (at €22 per ride) '], + [3, 'c- Comfort (spacious vehicles and top rated drivers) (at €30 per ride)'], + + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_21 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22_p2 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + [5, '5 - I don’t drive'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + +################################################# Page : Questionnaire2 + + q_24 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_26 = models.IntegerField( + choices=[ + [1, '1 - Never'], + [2, '2 - Rarely'], + [3, '3 - Often'], + [4, '4 - Always'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27_a = models.StringField( + label="If yes which one? ", + blank=True + ) + + q_28 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_29_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_30_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_31 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_32 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_33 = models.IntegerField( + choices=[ + [0, 'Yes'], + [1, 'No'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + +##################################### Page : Questionnaire3 + + q_34_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + + diff --git a/v2_exp_e4c_en_p1_quest/pages.py b/v2_exp_e4c_en_p1_quest/pages.py new file mode 100644 index 0000000..36f06dc --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/pages.py @@ -0,0 +1,94 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def before_next_page(self): + self.player.language = "EN" + self.player.participant.vars['language'] = self.player.language + + if self.player.id_in_group % 2 == 1: + self.player.treatment = 1 # gneezy - BinsWanger + else: + self.player.treatment = 2 # BinsWanger -gneezy + + self.player.participant.vars['treatment'] = self.player.treatment + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', + 'q_22', 'q_2_e_a', 'q_2_e_b', 'q_2_e_c', 'q_2_h', + 'q_3', 'q_4', 'q_5', 'q_6', + 'q_7', 'q_8', 'q_9', 'q_10', 'q_11', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_12', 'q_13', 'q_14', 'q_15', + 'q_16', 'q_17', 'q_18', + 'q_19', + 'q_19_a','q_19_b', 'q_20', + 'q_21', + 'q_22_p2', 'q_23', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_24', 'q_25', 'q_26', 'q_27', + 'q_27_a', 'q_28', + 'q_29_a', 'q_29_b', + 'q_29_c', 'q_29_d', + 'q_30_a', 'q_30_b', 'q_30_c', + 'q_30_d', 'q_30_e', 'q_30_f', + 'q_31', 'q_32', 'q_33' + + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Questionnaire3(Page): + form_model = 'player' + form_fields = [ 'q_34_a', 'q_34_b', 'q_34_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class QuestionnaireEnd(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + +page_sequence = [ + #Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + Questionnaire3, + QuestionnaireEnd, + + +] diff --git a/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Bienvenue.html b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Bienvenue.html new file mode 100644 index 0000000..8a89a4d --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Bienvenue.html @@ -0,0 +1,60 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Experiment in economics +{% endblock %} + +{% block content %} + + +
    +
    + +

    Welcome

    + +

    + Thank you for agreeing to participate in this experience. A fixed remuneration (of 5 €) will be paid to you + at the end of the experience for your participation, regardless of your answers during + this experience. To this will be added variable compensation linked to your answers to the course + experience. +

    + +

    + + The experience lasts about 30 minutes. It consists of two types of tasks : questionnaires and games. + The variable remuneration that you will receive at the end of the experience will not depend on your answers to the questionnaires. + Indeed, in these questionnaires, there is neither right nor wrong answer. On the other hand, your variable remuneration will depend on the quality of your answers to the games. +Specifically, at the end of the experiment, only one of the games will be randomly selected to be paid for for real. +
    The currency used in this experiment is the ECU. +

    Exchange rate 1 ECU = {{ Constants.tauxchange}} €.
    + +
    + Important: All your answers will be treated anonymously. No one will be able + to directly identify your decisions. + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire0.html b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire0.html new file mode 100644 index 0000000..1217996 --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire0.html @@ -0,0 +1,228 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (1/4) +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

    +
    +
    + +

    + 1) + Do you buy organic and / or ecological products? + + + {% formfield player.q_1 %} +

    + +
    +

    + 2) For each of the following criteria, please indicate if it can influence your choice to buy a product: + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a. The price can influence your choices of products to buy
    Strongly disagree {% formfield player.q_2_a %} Strongly agree
    b. The origin can influence your choices of products to buy
    Strongly disagree {% formfield player.q_2_b %} Strongly agree
    c. The quality can influence your choices of products to buy
    Strongly disagree {% formfield player.q_2_c %} Strongly agree
    d. The taste (if it is a food product) can influence your choices of products to buy
    Strongly disagree {% formfield player.q_22 %} Strongly agree
    e. Label influence:
    +           * The organic label can influence your choices of products to buy +
    * Organic label: + An organic product is a product from organic farming (it is an agricultural production + method that excludes the use of most synthetic chemicals, toxic products, etc.). + There is a label (AB) in France that authenticates products from this method of + agriculture. +
            Strongly disagree {% formfield player.q_2_e_a %} Strongly agree
    +           * The ecological label can influence your choices of products to buy +
    * Ecological label: + An ecological product is a product that will be thought out, designed, + packaged, distributed, recycled in such a way as to minimize the impact on the environment. + It must comply with many rules related to these steps during specifications drawn up by + an organization such as ECOLABEL or ECOCERT. +An ecological product must be designed with maximum respect for the environment + (respect linked to the use of raw materials and machines during manufacture). + The life cycle of the product as well as its recycling are also important points + to consider. +
            Strongly disagree {% formfield player.q_2_e_b %} Strongly agree
    +           * The equitable trade label can influence your choices of products to buy +
    * Equitable trade label: + Equitable trade is a commercial and international partnership, based on concrete principles and launched + almost 20 years ago. Its objective is to be able to guarantee a better balance between + producers and resellers, by ensuring better working conditions and better remuneration + for small producers. +
            Strongly disagree {% formfield player.q_2_e_c %} Strongly agree
    +

    +           * + Other label can influence your choices of + products to buy (if yes, to indicate) + {% formfield player.q_2_h %} + +

    + +

    + 3) Do you shop online ? + {% formfield player.q_3 %} +

    + + +

    + 4) Do you shop clothes online? + {% formfield player.q_4 %} +

    + + + +

    + 5) + Do you agree that it is less + environmentally friendly to shop online rather than in-store? + + + + + + + + + +
    Strongly disagree {% formfield player.q_5 %} Strongly agree
    +

    + +

    + 6) Do you bring your own cup of coffee (tea) to school/work (instead of using the + cups from the coffee machine)? + {% formfield player.q_6 %} +

    + + +

    + 7) Do you sort your household waste? + {% formfield player.q_7 %} +

    + +

    + 8) Do you use a compost bin? + {% formfield player.q_8 %} +

    +

    + 9) Do you collect and recycle used paper? + {% formfield player.q_9 %} +

    + +

    + 10) Do you reuse your shopping bags? + {% formfield player.q_10 %} +

    + +

    + 11) Do you return used batteries to appropriate recycling points? + {% formfield player.q_11 %} +

    + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire1.html b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire1.html new file mode 100644 index 0000000..233f7ed --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire1.html @@ -0,0 +1,168 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (2/4) +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

    +
    +
    + +

    + 12) When buying new electronic devices, do you make sure to buy the ones that use the least amount of energy? + {% formfield player.q_12 %} +

    + +

    + 13) Do you switch off or completely disconnect electrical devices when not in use (without using the + standby mode)? + {% formfield player.q_13 %} +

    + +

    + 14) Do you use a dryer for your clothes? + {% formfield player.q_14 %} +

    + +

    + 15) Do you wait until you have a full charge before doing your laundry? + {% formfield player.q_15 %} +

    + +

    + 16) Is the heating in your home turned off late at night between 1 am and 5 am (in winter)? + {% formfield player.q_16 %} +

    + +

    + 17) Do you reduce the room temperature when you are not at home for a long time (in winter)? + {% formfield player.q_17 %} +

    + +

    + 18) + You take a shower rather than a bath + + + {% formfield player.q_18 %} + +

    + + + +

    19) Do you regularly defrost the fridge?

    + + 1 - Never
    +
    +

            a - Because I bought a frost free fridge on purpose
    +         b - I share the refrigerator with other people and someone else is responsible for it
    +         c - Other reason
    +         (If other reason please specify) :
    + +

    +

    + 2 - Rarely
    + 3 - Often
    + 4 - Always
    + +

    + + +

    + 20) Suppose you are about to book a taxi (e.g. UBER) to Orly airport. +
    Which option would you choose? +
    + {% formfield player.q_20 %} +

    + +

    + 21) Electric cars are less polluting than petrol or diesel cars. +
    (Indicate your degree of agreement) + + + + + + +
    Strongly disagree {% formfield player.q_21 %} Strongly agree
    +

    + +

    + 22) Would you be interested in buying an alternative fuel car? + + + + + + + +
    Strongly disagree {% formfield player.q_22_p2 %} Strongly agree
    +

    + +

    + 23) Do you adopt eco-responsible driving? +
    + + Eco-responsible driving consists of: Checking the tire pressure. + Make sure the vehicle is in good condition. Adopt a smooth driving + (Start smoothly and change without waiting for a higher gear to + avoid over-revs). Stop the engine during a prolonged stop. Do not + abuse the air conditioning. + + {% formfield player.q_23 %} +

    + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire2.html b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire2.html new file mode 100644 index 0000000..6a973ef --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire2.html @@ -0,0 +1,243 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (3/4) +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + + +

    +
    +
    + +

    + 24) + Support higher taxes for environmentally damaging behavior. +
    (Indicate your degree of agreement) +
    + + + + + + +
    Strongly disagree {% formfield player.q_24 %} Strongly agree
    +

    + +

    + 25) +In a political program, the place given to environmental issues influences my vote. +
    (Indicate your degree of agreement) +
    + + {% formfield player.q_25 %} +

    + + +

    + 26) Do you often discuss environmental issues with friends? + + {% formfield player.q_26 %} +

    + +

    27) Are you a member of an environmental organisation? If so, which one? ?

    +No
    +Yes
    +
    +

    {% formfield player.q_27_a %} +

    +
    + +

    + + +

    + 28) Do you support financial incentives for environmentally beneficial technology? + + + + + + +
    Strongly disagree {% formfield player.q_28 %} Strongly agree
    +

    + +

    + 29) For each of the following actions, please indicate whether it can reduce the + individual carbon footprint to a small or very large extent: + +

    + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + +
    a. Avoid air travel. Reduced way:
    Not very important {% formfield player.q_29_a %} Very important
    b. Have fewer children. Reduced way:
    Not very important {% formfield player.q_29_b %} Very important
    c. Not having a car. Reduced way:
    Not very important {% formfield player.q_29_c %} Very important
    d. a Vegetarian diet. Reduced way:
    Not very important {% formfield player.q_29_d %} Very important
    +

    + + + + +

    + 30) What do you think are the main differences between a green building and a conventional building? + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a- Landscaping and physical activity
    Strongly disagree {% formfield player.q_30_a %} Strongly agree
    b- Indoor air quality
    Strongly disagree {% formfield player.q_30_b %} Strongly agree
    c- Indoor noise
    Strongly disagree {% formfield player.q_30_c %} Strongly agree
    d- Annual energy consumption
    Strongly disagree {% formfield player.q_30_d %} Strongly agree
    e- Annual consumption of drinking water
    Strongly disagree {% formfield player.q_30_e %} Strongly agree
    f- Monthly management costs
    Strongly disagree {% formfield player.q_30_f %} Strongly agree
    +

    + +

    + 31) If you were to move, would you be interested in living in a green building? + + + + + + +
    Strongly disagree {% formfield player.q_31 %} Strongly agree
    +

    + + +

    + 32) Would you be willing to pay more to live in a green building? + + + + + + +
    Strongly disagree {% formfield player.q_32 %} Strongly agree
    +

    + +

    + + 33) Did you know that you currently live in a green building (with low energy consumption)? + + {% formfield player.q_33 %} + +

    + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire3.html b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire3.html new file mode 100644 index 0000000..a67192d --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/Questionnaire3.html @@ -0,0 +1,113 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (4/4) +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account when calculating your winnings. + However, we ask that you answer as honestly as possible. As a reminder, all your answers will + be treated anonymously, and no one will have access to your answers. + +

    +
    +
    + +

    SRI (Socially Responsible Investment)

    + +

    + The extra-financial performance contains information on the main axes of sustainable development: +

  • Social data : employment in the company, health, safety… Here we find the major themes of the quality of life at work. +
  • + +
  • Governance data : anti-discrimination measures, gender equality, integration of disabled workers. +
  • +
  • Environmental data : actions implemented to fight against waste, pollution, global warming, etc. +
  • +

    + +

    +

    + 34) + For each of the following data, please indicate whether it is unimportant + or very important in your choice of investment: + + + + + > + + + + + + + + > + + + + + + + + + + + + + + +
    a. Social data:
    Not very important {% formfield player.q_34_a %} Very important
    b. Governance data:
    Not very important {% formfield player.q_34_b %} Very important
    c. Environmental data:
    Not very important {% formfield player.q_34_c %} Very important
    + +

    + + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/QuestionnaireEnd.html b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/QuestionnaireEnd.html new file mode 100644 index 0000000..8569b1f --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/templates/v2_exp_e4c_en_p1_quest/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Third part : End + +{% endblock %} + +{% block content %} +
    +
    + + +

    + You have completed the third part. + +
    You will now begin the fourth part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_en_p1_quest/tests.py b/v2_exp_e4c_en_p1_quest/tests.py new file mode 100644 index 0000000..4ca616d --- /dev/null +++ b/v2_exp_e4c_en_p1_quest/tests.py @@ -0,0 +1,81 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['versionexp'] == 2: + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_22': 1, + 'q_2_e_a': 1, + 'q_2_e_b': 1, + 'q_2_e_c': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_5': 1, + 'q_6': 1, + 'q_7': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + }) + yield (pages.Questionnaire1, { + 'q_12': 1, + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + 'q_16': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19': 1, + 'q_19_a': 1, + 'q_19_b': 1, + 'q_20': 1, + 'q_21': 1, + 'q_22_p2': 1, + 'q_23': 1, + }) + yield (pages.Questionnaire2, { + 'q_24': 1, + 'q_25': 1, + 'q_26': 1, + 'q_27': 1, + 'q_27_a': 1, + 'q_28': 1, + 'q_29_a': 1, + 'q_29_b': 1, + 'q_29_c': 1, + 'q_29_d': 1, + 'q_30_a': 1, + 'q_30_b': 1, + 'q_30_c': 1, + 'q_30_d': 1, + 'q_30_e': 1, + 'q_30_f': 1, + 'q_31': 1, + 'q_32': 1, + 'q_33': 1, + + }) + yield (pages.Questionnaire3, { + 'q_34_a': 1, + 'q_34_b': 1, + 'q_34_c': 1, + }) + yield (pages.QuestionnaireEnd) + + + diff --git a/v2_exp_e4c_en_p2_risk_gneezy/__init__.py b/v2_exp_e4c_en_p2_risk_gneezy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_en_p2_risk_gneezy/_builtin/__init__.py b/v2_exp_e4c_en_p2_risk_gneezy/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_en_p2_risk_gneezy/models.py b/v2_exp_e4c_en_p2_risk_gneezy/models.py new file mode 100644 index 0000000..ccc9c4c --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/models.py @@ -0,0 +1,110 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_en_p2_risk_gneezy' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'v2_exp_e4c_en_p2_risk_gneezy/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + # + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() + + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/v2_exp_e4c_en_p2_risk_gneezy/pages.py b/v2_exp_e4c_en_p2_risk_gneezy/pages.py new file mode 100644 index 0000000..a572e05 --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/pages.py @@ -0,0 +1,90 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + + + def vars_for_template(self): + self.player.task_start_19 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = round(time.time() - self.player.task_start_19,2) ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_20 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = round(time.time() - self.player.task_start_20,2) ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2 + +page_sequence = [ + L_risk11_qc, + M_risk11, + Jeu1End, + +] diff --git a/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/Jeu1End.html b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/Jeu1End.html new file mode 100644 index 0000000..b0081ff --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/Jeu1End.html @@ -0,0 +1,28 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + First part: End + +{% endblock %} + +{% block content %} +
    +
    + +

    + You have completed the first part. + +
    You will now begin the second part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/L_risk11_qc.html b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/L_risk11_qc.html new file mode 100644 index 0000000..87c577f --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 1 +{% endblock %} + +{% block content %} + +

    + This game can be taken into account when calculating your winnings. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Comprehension test:

    + + +

    If you have invested 6 ECUs in the risky project:

    + +

    1) How many ECUs have you kept?

    + +

    {% formfield player.risk11_qc_a label = ""%} +

    +

    2) If the investment is successful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_b label = ""%} +

    +

    3) If the investment is unsuccessful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_c label = ""%} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/M_risk11.html b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/M_risk11.html new file mode 100644 index 0000000..1e7b413 --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 1 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

    +

    {% formfield player.risk11_a label = ""%} +

    + +

    So, how many ECUs did you keep (an amount between 0 and 10)?

    +

    {% formfield player.risk11_b label = ""%} +

    + +

    + Note: the sum of the two amounts must be equal to 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/M_risk11_result.html b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 1 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/instructions.html b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/instructions.html new file mode 100644 index 0000000..f0b5bf4 --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/templates/v2_exp_e4c_en_p2_risk_gneezy/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Rules of the game : +

    + +

    You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

    + +
    Project description:
    + +

    This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

    +

    +

    Your gain from this task = amount retained + gain from your investment in the project.

    +

    +

    Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

    + +

    Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Summary of the game:

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/v2_exp_e4c_en_p2_risk_gneezy/tests.py b/v2_exp_e4c_en_p2_risk_gneezy/tests.py new file mode 100644 index 0000000..04e8fff --- /dev/null +++ b/v2_exp_e4c_en_p2_risk_gneezy/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + + diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/__init__.py b/v2_exp_e4c_en_p2bis_risk_gneezy_end/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/_builtin/__init__.py b/v2_exp_e4c_en_p2bis_risk_gneezy_end/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/models.py b/v2_exp_e4c_en_p2bis_risk_gneezy_end/models.py new file mode 100644 index 0000000..22a398f --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/models.py @@ -0,0 +1,110 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_en_p2bis_risk_gneezy_end' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'v2_exp_e4c_en_p2bis_risk_gneezy_end/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + # + + treatment = models.IntegerField() + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/pages.py b/v2_exp_e4c_en_p2bis_risk_gneezy_end/pages.py new file mode 100644 index 0000000..4ad9284 --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/pages.py @@ -0,0 +1,91 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 ==0 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 2 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 2 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/Jeu1End.html b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/Jeu1End.html new file mode 100644 index 0000000..167509f --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Second Part: End + +{% endblock %} + +{% block content %} +
    +
    + + +

    + You have completed the second part. + +
    You will now begin the third part. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/L_risk11_qc.html b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/L_risk11_qc.html new file mode 100644 index 0000000..cbb0176 --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/L_risk11_qc.html @@ -0,0 +1,75 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 2 +{% endblock %} + +{% block content %} + +

    + This game can be taken into account when calculating your winnings. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Comprehension test:

    + + +

    If you have invested 6 ECUs in the risky project:

    + +

    1) How many ECUs have you kept?

    + +

    {% formfield player.risk11_qc_a label = ""%} +

    +

    2) If the investment is successful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_b label = ""%} +

    +

    3) If the investment is unsuccessful, how many ECUs in your possession at the end of this game?

    +

    {% formfield player.risk11_qc_c label = ""%} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/M_risk11.html b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/M_risk11.html new file mode 100644 index 0000000..af135a7 --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Game 2 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Please enter the amount of your investment in the project (in ECUs) (an amount between 0 and 10):

    +

    {% formfield player.risk11_a label = ""%} +

    + +

    So, how many ECUs did you keep (an amount between 0 and 10)?

    +

    {% formfield player.risk11_b label = ""%} +

    + +

    + Note: the sum of the two amounts must be equal to 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/M_risk11_result.html b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/M_risk11_result.html new file mode 100644 index 0000000..70bdd92 --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 2 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/instructions.html b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/instructions.html new file mode 100644 index 0000000..569116a --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/templates/v2_exp_e4c_en_p2bis_risk_gneezy_end/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Rules of the game : +

    + +

    You have a capital of 10 ECUs, and you must decide the amount of your investment in the project described below. + You can invest any amount between 0 ECUs and 10 ECUs (in whole numbers).

    + +
    Project description:
    + +

    This project earns 3 times the amount invested in the event of success and 0 in the event of failure. + Success and failure have the same probability of happening: 1 in 2 chance.

    +

    +

    Your gain from this task = amount retained + gain from your investment in the project.

    +

    +

    Example 1: You decide to invest 4 ECUs in the project. The project is a success. Your project gain is + of 3 x 4 ECUs = 12 ECUs. Your gain from this task is therefore 6 ECUs kept + 12 ECUs from the project = 18 ECUs. +

    + +

    Example 2: You decide to invest 4 ECUs in the project. The project is a failure. Your project gain is + of 0 x 4 ECUs = 0 ECUs. Your gain from this game is therefore 6 ECUs kept + 0 ECUs from the project = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Summary of the game:

    + +
    +
    +

    + + +
    +
    diff --git a/v2_exp_e4c_en_p2bis_risk_gneezy_end/tests.py b/v2_exp_e4c_en_p2bis_risk_gneezy_end/tests.py new file mode 100644 index 0000000..2253a12 --- /dev/null +++ b/v2_exp_e4c_en_p2bis_risk_gneezy_end/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + + if self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 2: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + diff --git a/v2_exp_e4c_en_p3_risk_binswanger/__init__.py b/v2_exp_e4c_en_p3_risk_binswanger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_en_p3_risk_binswanger/_builtin/__init__.py b/v2_exp_e4c_en_p3_risk_binswanger/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_en_p3_risk_binswanger/models.py b/v2_exp_e4c_en_p3_risk_binswanger/models.py new file mode 100644 index 0000000..f7552b9 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/models.py @@ -0,0 +1,152 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_en_p3_risk_binswanger' + players_per_group = None + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'v2_exp_e4c_en_risk_p3_binswanger/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + treatment = models.IntegerField() + riskqc_a = models.IntegerField( + choices=[ + [1, '12 ECUs'], + [2, '0 ECUs'], + [3, '4 ECUs'], + [4, '6 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '20 ECUs'], + [2, '0 ECUs'], + [3, '2 ECUs'], + [4, '12 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '2 ECUs'], + [3, '24 ECUs'], + [4, '8 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + id_in_group_nn = models.IntegerField() + + + + + + + + + + diff --git a/v2_exp_e4c_en_p3_risk_binswanger/pages.py b/v2_exp_e4c_en_p3_risk_binswanger/pages.py new file mode 100644 index 0000000..91e6f2e --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/pages.py @@ -0,0 +1,174 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +def vars_for_all_templates(self): + return { + 'id_in_group_nn': self.player.participant.vars['role_nn'], + } + +###### traitement 1 risk au début +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + def before_next_page(self): ########### new V2 epx + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + else: + self.player.choicerisknn = "E" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + + + +####################################################### elle n'est pas active !!! c'est le programme (exp_e4c_en_p5_questfin) +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def before_next_page(self): + + ########################### + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur +####################################################### + + +class Risk_BinsWanger_result(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +class Jeu2End(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + +page_sequence = [ + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, + Jeu2End, +###### Risk_BinsWanger_color, +###### Risk_BinsWanger_result, + + +] diff --git a/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Jeu2End.html b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Jeu2End.html new file mode 100644 index 0000000..84293d9 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Jeu2End.html @@ -0,0 +1,44 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Second Part : End + {% endif %} + {% if id_in_group_nn == 2 %} + First Part : End + {% endif %} + +{% endblock %} + +{% block content %} +
    +
    + + +{% if player.id_in_group_nn == 1%} +

    + You have completed the second part. + +
    You will now begin the third part. + +

    + {% endif%} + {% if player.id_in_group_nn == 2 %} +

    + You have completed the first part. + +
    You will now begin the second part. + +

    + {% endif%} + + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger.html b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger.html new file mode 100644 index 0000000..291b1c9 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger.html @@ -0,0 +1,392 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Game 2 : Your choice + {% endif %} + {% if id_in_group_nn == 2 %} + Game 1 : Your choice + {% endif %} +{% endblock %} + +{% block content %} + + + +
    +
    + + + + +

    +You will now play the game for real. The winning of this game will count towards the final gain.

    + + + +

    Now please choose the situation you prefer the most from the following choices (A, B, C, D or E). +

    + +

    + +

    Please make a choice

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    A
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    B
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    C
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    D
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    E
    (0 ECUs) (24 ECUs)
    + + + + + +




    + + + + +
    + + + +
    + + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_color.html b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_color.html new file mode 100644 index 0000000..2a06e55 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Jeu 2 : Choix de votre couleur + {% endif %} + {% if id_in_group_nn == 2 %} + Jeu 1 : Choix de votre couleur + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + + +
    + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc.html b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..c118b1e --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc.html @@ -0,0 +1,455 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Game 2 + {% endif %} + {% if id_in_group_nn == 2 %} + Game 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    +This game can be taken into account when calculating your gains.

    + +
    +
    + + + + + +

    + Rules of the game: + +

    + +

    + Look at the table below. It presents 5 different situations. Look at them carefully. + Situations A, B, C, D and E contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

    + +

    +At the end of the game, the ECU you have won will be converted into € using the following rule:

    +

    +

    1 ECU = {{ Constants.tauxchange}} €
    +

    + +

    +So you will first have to choose the situation you prefer the most: A, B, C, D or E.

    + +

    + +

    Warning! The image below is an example, your choice will be saved later.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + + + + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + + +
    (0 ECUs) (24 ECUs)
    + + + +

    + +

    + +Second, your color will be revealed to you, at the end of the experiment , with the following process: + +
    You will choose between two buttons that look like this: + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    After clicking one of the buttons, a red or green color will appear. This color will determine your winnings.

    +

    There is a 50% chance that the color red will be behind the left or right button. The same probability applies + for the color green.

    +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc2.html b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..2ff856b --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_qc2.html @@ -0,0 +1,1134 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Comprehension Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Now we want to test if you have understood the in-game instructions.

    + + +
    + +

    + Example 1: + +

    + + +

    If you have chosen situation B, then the color Green appears. +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + A + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    + + C + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + D + +
    (0 ECUs) (24 ECUs)
    + + +

    +What would your earnings be?

    + {% formfield player.riskqc_a label="" %} + +

    + + +

    + Example 2: +

    + + +

    If you have chosen situation D, then the color Red appears. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + +

    + Question 2: What would your earnings be?

    + + {% formfield player.riskqc_b label = ""%} + +

    + + + +

    + + Example 3: +

    + + +

    If you have chosen situation E, then the color Red + appears. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + +

    + Question 3: What would your earnings be?

    + + {% formfield player.riskqc_c label = ""%} + +

    + + + + + +




    + + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_result.html b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_result.html new file mode 100644 index 0000000..4b77418 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/templates/v2_exp_e4c_en_p3_risk_binswanger/Risk_BinsWanger_result.html @@ -0,0 +1,57 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + + {% if id_in_group_nn == 1 %} + Gain of game 2 : Details + {% endif %} + {% if id_in_group_nn == 2 %} + Gain of game 1 : Details + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    Your choice was: {{player.choicerisknn}}

    + +

    The selected color is: {{player.colorselectnn}}

    + + +

    Your winnings for this game are: {{player.gainrisk}} ECU (s)

    + + +

    Your winnings for this game are: {{player.gainriskeur}} ECU (s)

    +

    -----------------------------------------

    + +
    + + + +
    +
    + +

    +

    +Reminder of the instructions: +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + +{% endblock %} + + diff --git a/v2_exp_e4c_en_p3_risk_binswanger/tests.py b/v2_exp_e4c_en_p3_risk_binswanger/tests.py new file mode 100644 index 0000000..f5bc831 --- /dev/null +++ b/v2_exp_e4c_en_p3_risk_binswanger/tests.py @@ -0,0 +1,30 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['versionexp'] == 2: + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 5), + }) + + yield (pages.Jeu2End) + + + diff --git a/v2_exp_e4c_en_p5_questfin/__init__.py b/v2_exp_e4c_en_p5_questfin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_en_p5_questfin/_builtin/__init__.py b/v2_exp_e4c_en_p5_questfin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_en_p5_questfin/models.py b/v2_exp_e4c_en_p5_questfin/models.py new file mode 100644 index 0000000..a6a4339 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/models.py @@ -0,0 +1,627 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C + +version: EN +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_en_p5_questfin' + players_per_group = None + num_rounds = 1 + + showupfee = 5 + + instructions_GP_template = 'v2_exp_e4c_en_p5_questfin/instructions.html' + instructions_BW_template = 'v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + treatmentname = p.treatmentname, + jeu_tire=p.jeu_tire, + jeuname = p.jeuname, + gainfinal=p.gainfinal, + gaineur=p.gaineur, + gainfinaleur=p.gainfinaleur, + )) + return dict(report=report) + + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + treatment = models.IntegerField() + treatmentname = models.StringField() + + langue = models.StringField() + langue_nn = models.IntegerField() + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + +######### var jeu Binswanger + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts and / or literature'], + [2, '2- Economy and / or management'], + [3, '3- Scientific / engineering'], + [4, '4- Other'], + ], + widget=widgets.RadioSelect, + label="a. Your field of study ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Woman'], + [2, '2- Male'], + [3, '3- Non-binary'], + [4, '4- Do not wish to answer'], + ], + widget=widgets.RadioSelect, + label="b. You are ", + blank=False + ) + + q_42_age = models.IntegerField( + label="c. How old are you?", + blank=False, + min=15, + max=100, + ) + + q_43_nationalite = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + blank=False, + label="d. Country of citizenship", + + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Less than 5,000 Euros'], + [2, '2- Between 5,000 and 10,000 Euros'], + [3, '3- Between 10,000 and 15,000 Euros'], + [4, '4- Between 15,000 and 20,000 Euros'], + [5, '5- Between 20,000 and 25,000 Euros'], + [6, '6- Greater than 25,000 Euros'], + ], + widget=widgets.RadioSelect, + label="e. Please estimate your gross annual income (including your scholarships and student loan) in Euros.", + blank=False + ) + + + q3_countries = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + label="f. Country - previous accommodation", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="g. City - previous accommodation", + blank=False + ) + + q_31 = models.IntegerField() # nbre d'enfant + + q_47_residence = models.IntegerField( + label="i. You currently live in:", + choices=[ + [1, 'Bâtiment 103'], + [2, 'Another residence '], + ], + widget=widgets.RadioSelect, + blank=False + ) + + q_48_satisfaction = models.IntegerField( + choices=[ + [1, '1 - Very satisfied'], + [2, '2 - Satisfied '], + [3, '3 - Unsatisfied '], + [4, '4 - Very unsatisfied'], + ], + widget=widgets.RadioSelect, + label="j. How satisfied are you with your place of residence? ", + blank=True + ) + + + q_49_propositions = models.StringField( + label="k. Do you have any ideas or suggestions for improvements concerning your place of residence?", + blank=True + ) + + + +### jeu 2 : Gneezy&Potters + tirageriskresult_j1 = models.StringField() + risk11_a_j1 = models.FloatField() + risk11_b_j1 = models.FloatField() + gainrisk_j1 = models.FloatField() + + + tirageausort = models.FloatField() + + jeu_tire = models.IntegerField() + gainfinal = models.FloatField() + + + #gainfinalecu = models.FloatField() + #gainfinalplushowup = models.FloatField() + gaineur = models.FloatField() + gainfinaleur = models.FloatField() + + gainfinaleur_v1 = models.FloatField() + + jeuname = models.StringField() + + lastname = models.StringField( + label="Last Name", + blank=False + ) + + firstname = models.StringField( + label="First Name", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Room number", + blank=False + ) + id_in_group_nn = models.IntegerField() + + + + + + diff --git a/v2_exp_e4c_en_p5_questfin/pages.py b/v2_exp_e4c_en_p5_questfin/pages.py new file mode 100644 index 0000000..4a87be2 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/pages.py @@ -0,0 +1,195 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + def before_next_page(self): + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + + if self.player.treatment == 1: + self.player.treatmentname ='GP - BW' + elif self.player.treatment == 2: + self.player.treatmentname ='BW - GP' + + + ########################### + + self.player.choicerisk = self.participant.vars['choicerisk'] + self.player.choicerisknn = self.participant.vars['choicerisknn'] + + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_age', + 'q_43_nationalite', 'q_44_revenu', + 'q3_countries', 'q_46_logement_ville', 'q_31', + 'q_47_residence', 'q_48_satisfaction', 'q_49_propositions' + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + + + + def before_next_page(self): + ### jeu 2 : risk Binswanger + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.player.colorselectnn = self.participant.vars['colorselectnn'] + self.player.gainrisk = self.participant.vars['gainrisk'] + self.player.gainriskeur = self.participant.vars['gainriskeur'] + + ### jeu 1 : Gneezy_Potters + + self.player.tirageriskresult_j1 = self.participant.vars['tirageriskresult_j1'] + self.player.risk11_a_j1 = self.participant.vars['risk11_a_j1'] + self.player.risk11_b_j1 = self.participant.vars['risk11_b_j1'] + self.player.gainrisk_j1 = self.participant.vars['gainrisk_j1'] + + + self.player.tirageausort = round(random.random(), 2) + + if self.player.treatment == 1 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 1 + self.player.jeuname = "GP" + else: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 2 + self.player.jeuname = "BW" + + if self.player.treatment == 2 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 1 + self.player.jeuname = "BW" + else: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 2 + self.player.jeuname = "GP" + + + #self.player.gainfinalplushowup = self.player.gainfinal + Constants.showupfee + + self.player.gaineur = round(self.player.gainfinal * Constants.tauxchange,1) + + self.player.gainfinaleur = round(self.player.gaineur + Constants.showupfee,1) + + if (self.player.gainfinaleur * 100) % 100 <= 50 and (self.player.gainfinaleur * 100) % 100 > 0 : + self.player.gainfinaleur_v1 = ((round(((self.player.gainfinaleur * 100) - ((self.player.gainfinaleur * 100) % 100)), 0) + 50) / 100) * 1000 + else: + self.player.gainfinaleur_v1 = (round((self.player.gainfinaleur), 0))*1000 + + self.player.payoff = self.player.gainfinaleur_v1 + + +class Result(Page): + form_model = 'player' + form_fields = [ + 'lastname', + 'firstname', + 'email', + 'room', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 2 + + def before_next_page(self): + self.player.participant.vars['treatmentname'] = self.player.treatmentname + self.player.participant.vars['jeu_tire'] = self.player.jeu_tire + self.player.participant.vars['jeuname'] = self.player.jeuname + self.player.participant.vars['gainfinal'] = self.player.gainfinal + self.player.participant.vars['gaineur'] = self.player.gaineur + self.player.participant.vars['gainfinaleur'] = self.player.gainfinaleur + self.player.participant.vars['lastname'] = self.player.lastname + self.player.participant.vars['firstname'] = self.player.firstname + self.player.participant.vars['email'] = self.player.email + self.player.participant.vars['room'] = self.player.room + + + + + + +page_sequence = [ + Risk_BinsWanger_color, + Questionnaire4, + Result, + + +] diff --git a/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/AdminReport.html b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/AdminReport.html new file mode 100644 index 0000000..ac7e0a5 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/AdminReport.html @@ -0,0 +1,35 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label Treatment name Jeu tire Jeu name Gain (Ecus) Gain (€) gain final (gain+bonus) (€)
    {{ row.id }}{{ row.label }} {{row.treatmentname}}{{ row.jeu_tire }} {{row.jeuname}}{{ row.gainfinal }}{{ row.gaineur }}{{ row.gainfinaleur }}
    + diff --git a/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Questionnaire4.html b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Questionnaire4.html new file mode 100644 index 0000000..efd5055 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Questionnaire4.html @@ -0,0 +1,104 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +Final Questionnaire +{% endblock %} + +{% block content %} + + +
    +
    + +The answers to the following questions will not be taken into account in the calculation of + your earnings. We nevertheless ask you to respond as sincerely as possible. + As a reminder, all your responses will be treated anonymously, and no one + will not have access to your answers. + +

    +
    +
    + + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_age%} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
    +

    + +Indicate the City and Country where your previous accommodation was: +

    + {% formfield player.q3_countries %} + + + {% formfield player.q_46_logement_ville %} + + + +
    +
    + + +

    +
    + + + {% formfield player.q_47_residence %} + + {% formfield player.q_48_satisfaction %} + + {% formfield player.q_49_propositions %} + + + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Result.html b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Result.html new file mode 100644 index 0000000..3557420 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Result.html @@ -0,0 +1,59 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + FINAL QUESTIONNAIRE + +{% endblock %} + +{% block content %} +
    +
    + +
    +
    + NB : Useful information to receive your gain: +
    +
    + +
    + +
    +
    + +

    + Please fill in the following fields in order to be able to take the + amount you won during this experience. + {% formfield player.lastname %} + {% formfield player.firstname %} + {% formfield player.email %} + {% formfield player.room %} + +

    + +

    + + Reminder for those who have not yet registered + + : to receive your gain you must subscribe to the list of voluntary participants via the link : + + +

    http://orsee.labeds.fr/public/

    + +
    Note : Your personal data are strictly confidential. + All your responses will be treated anonymously. +
    + +

    + + +
    +
    + +

    {% next_button %}

    + + + +{% endblock %} + diff --git a/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_color.html b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_color.html new file mode 100644 index 0000000..fefd2be --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_color.html @@ -0,0 +1,168 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + {% if player.id_in_group_nn == 1 %} + Choice of your color (game 2) + {% endif %} + {% if player.id_in_group_nn == 0 %} + Choice of your color (game 1) + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + +

    Please choose between the following two buttons:

    + +

    A color (red or green) is hidden behind each button. + When you click on one of the buttons, its color appears. + If the color that appears is green, you will receive the green wins + from the selection you made at the start. + If it is red, you will receive the red winnings.

    +

    + +
    + + + +
    + + + +
    + +

    + + + + + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..7704883 --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if player.id_in_group_nn == 1 %} + Game 2 + {% endif %} + {% if player.id_in_group_nn == 0 %} + Game 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    +This game can be taken into account when calculating your gains.

    + +
    +
    + + + + + +

    + Rules of the game: + +

    + +

    + Look at the table below. It presents 5 different situations. Look at them carefully. + Situations A, B, C, D and E contain two possible gains (in ECUS): the red gains on the left and + green gains on the right. You will receive one of these two amounts of ECUS depending on the color that + will be assigned to you at the end of the game. +

    + +

    +At the end of the game, the ECU you have won will be converted into € using the following rule:

    +

    +

    1 ECU =… €
    +

    + +

    +So you will first have to choose the situation you prefer the most: A, B, C, D or E.

    + +

    + +

    Warning! The image below is an example, your choice will be saved later.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Red Green
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + +Second, your color will be revealed to you, at the end of the experiment , with the following process: + +
    You will choose between two buttons that look like this: + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    After clicking one of the buttons, a red or green color will appear. This color will determine your winnings.

    +

    There is a 50% chance that the color red will be behind the left or right button. The same probability applies + for the color green.

    +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/instructions.html b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/templates/v2_exp_e4c_en_p5_questfin/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/v2_exp_e4c_en_p5_questfin/tests.py b/v2_exp_e4c_en_p5_questfin/tests.py new file mode 100644 index 0000000..af8593e --- /dev/null +++ b/v2_exp_e4c_en_p5_questfin/tests.py @@ -0,0 +1,39 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.participant.vars['versionexp'] == 2: + yield (pages.Risk_BinsWanger_color, { + 'tc3': '1;;0.3', + }) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_age': random.randint(18, 40), + 'q_43_nationalite': 5, + 'q_44_revenu': 1, + 'q3_countries': 1, + 'q_46_logement_ville': 'fr', + 'q_31': 3, + 'q_47_residence': 1, + 'q_48_satisfaction': 2, + 'q_49_propositions': 'sasasadad' + }) + + yield (pages.Result, { + 'lastname': 'a', + 'firstname': 'b', + 'email': '@', + 'room': 'a', + }) + + diff --git a/v2_exp_e4c_fr_p1_quest/__init__.py b/v2_exp_e4c_fr_p1_quest/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_fr_p1_quest/_builtin/__init__.py b/v2_exp_e4c_fr_p1_quest/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_fr_p1_quest/models.py b/v2_exp_e4c_fr_p1_quest/models.py new file mode 100644 index 0000000..a73ff07 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/models.py @@ -0,0 +1,799 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_fr_p1_quest' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + treatment = models.IntegerField() +################################################ page Questionnaire 0 + + versionexp = models.IntegerField( + choices=[ + [1, '1 - Je veux participer en "Français" '], + [2, '2 - I want to participate in "English" '], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + language = models.StringField() + + q_1 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_2_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_2_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_2_e_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_e_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_2_h = models.StringField( + label="", + blank=True + ) + + q_3 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_4 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_5 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + # q_6 = models.IntegerField( + # choices=[ + # [1, '1'], + # [2, '2'], + # [3, '3'], + # [4, '4'], + # [5, '5'], + # [6, '6'], + # ], + # widget=widgets.RadioSelectHorizontal, + # label="", + # blank=False + # ) + + q_6 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je ne bois pas de café (thé) à l’école / au travail'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_7 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_8 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_9 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_10 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + # q_11 = models.IntegerField( + # choices=[ + # [1, '1 - Jamais'], + # [2, '2 - Rarement'], + # [3, '3 - Souvent'], + # [4, '4 - Toujours'], + # ], + # widget=widgets.RadioSelect, + # label="", + # blank=False + # ) + + q_11 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je n’utilise pas de piles'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) +################################################ page Questionnaire 1 + + q_12 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_13 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_14 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_15 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_16 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_17 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_18 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_19 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + q_19_a = models.IntegerField( + label="", + blank=True + ) + + q_19_b = models.StringField( + label="", + blank=True + ) + + q_20 = models.IntegerField( + choices=[ + [1, 'a- Green (100% électrique ou hybride) (à 26 € la course)'], + [2, 'b- UberX (Économique, rapide et fiable) (à 22€ la course)'], + [3, 'c- Comfort (Véhicules spacieux et chauffeurs les mieux notés) (à 30€ la course)'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_21 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_22_p2 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_23 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + [5, '5 - Je ne conduis pas'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + +################################################# Page : Questionnaire2 + + q_24 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_25 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_26 = models.IntegerField( + choices=[ + [1, '1 - Jamais'], + [2, '2 - Rarement'], + [3, '3 - Souvent'], + [4, '4 - Toujours'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + q_27_a = models.StringField( + label="Si oui, laquelle ? ", + blank=True + ) + + q_28 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_29_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_29_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + q_30_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_d = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_e = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_30_f = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_31 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + q_32 = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + q_33 = models.IntegerField( + choices=[ + [0, 'Oui'], + [1, 'Non'], + ], + widget=widgets.RadioSelect, + label="", + blank=False + ) + + +##################################### Page : Questionnaire3 + + q_34_a = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_b = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + q_34_c = models.IntegerField( + choices=[ + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'], + [8, '8'], + [9, '9'], + [10, '10'], + ], + widget=widgets.RadioSelectHorizontal, + label="", + blank=False + ) + + + + + diff --git a/v2_exp_e4c_fr_p1_quest/pages.py b/v2_exp_e4c_fr_p1_quest/pages.py new file mode 100644 index 0000000..c7011b7 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/pages.py @@ -0,0 +1,106 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Bienvenue0(Page): + form_model = 'player' + form_fields = ['versionexp'] + + def before_next_page(self): + self.participant.vars['versionexp'] = self.player.versionexp + + + +class Bienvenue(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.language = "FR" + self.player.participant.vars['language'] = self.player.language + + + + if self.player.id_in_group % 2 == 1: + self.player.treatment = 1 # gneezy - BinsWanger + else: + self.player.treatment = 2 # BinsWanger -gneezy + + self.player.participant.vars['treatment'] = self.player.treatment + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + + +class Questionnaire0(Page): + form_model = 'player' + form_fields = ['q_1', 'q_2_a', 'q_2_b', 'q_2_c', + 'q_22', 'q_2_e_a', 'q_2_e_b', 'q_2_e_c', 'q_2_h', + 'q_3', 'q_4', 'q_5', 'q_6', + 'q_7', 'q_8', 'q_9', 'q_10', 'q_11', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +class Questionnaire1(Page): + form_model = 'player' + form_fields = [ + 'q_12', 'q_13', 'q_14', + 'q_15', 'q_16', 'q_17', 'q_18', + 'q_19', + 'q_19_a','q_19_b', 'q_20', + 'q_21', + 'q_22_p2', 'q_23', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + +class Questionnaire2(Page): + form_model = 'player' + form_fields = [ 'q_24', 'q_25', 'q_26', 'q_27', + 'q_27_a', 'q_28', 'q_29_a', + 'q_29_b', + 'q_29_c', 'q_29_d', + 'q_30_a', 'q_30_b', 'q_30_c', + 'q_30_d', 'q_30_e', 'q_30_f', + 'q_31', 'q_32', 'q_33' + + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +class Questionnaire3(Page): + form_model = 'player' + form_fields = [ 'q_34_a', 'q_34_b', 'q_34_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +class QuestionnaireEnd(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + +page_sequence = [ + #Bienvenue0, + #Bienvenue, + Questionnaire0, + Questionnaire1, + Questionnaire2, + Questionnaire3, + QuestionnaireEnd, + + +] diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Bienvenue.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Bienvenue.html new file mode 100644 index 0000000..d345c6a --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Bienvenue.html @@ -0,0 +1,68 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie +{% endblock %} + +{% block content %} + + +
    +
    + +

    Bienvenue

    + +

    + Merci d’avoir accepté de participer à cette expérience. + Une rémunération fixe (de 5 €) vous sera versée + pour votre participation, et ce, quelles que soient vos réponses durant + cette expérience. À cela s’ajoutera une rémunération variable liée + à vos réponses au cours + de l’expérience. +

    + +

    + L’expérience dure environ 30 min. Elle se compose de deux types de tâches : + les questionnaires et les jeux. + La rémunération variable que vous percevrez à la fin de l’expérience + ne dépendra pas de vos réponses + aux questionnaires. + En effet, dans ces questionnaires, il n’y a ni bonne, ni mauvaise réponse. + En revanche, votre rémunération + variable dépendra + de la qualité de vos réponses aux jeux. Plus précisément, à la fin de l’expérience, + un seul des jeux + sera sélectionné + aléatoirement pour être payé pour de bon. +

    +
    La monnaie utilisée dans cette expérience est l'ECU. +
    Taux de change 1 ECU = {{ Constants.tauxchange}} €.
    + +
    + Important : Toutes vos réponses seront traitées anonymement. + Personne n’aura la possibilité d’identifier directement vos décisions. + + + + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Bienvenue0.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Bienvenue0.html new file mode 100644 index 0000000..122e029 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Bienvenue0.html @@ -0,0 +1,41 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Expérience en économie / Experiment in economics +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    +

    Choix de la langue / Choice of language

    + {% formfield player.versionexp %} + +

    + + +

    {% next_button %}

    + +
    + + + +{% endblock %} + diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire0.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire0.html new file mode 100644 index 0000000..32b4b48 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire0.html @@ -0,0 +1,241 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (1/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    + +
    +
    + +

    + 1) Achetez-vous des produits bio et/ou écologique ? + + {% formfield player.q_1 %} +

    + + + + + + 2) Pour chacun des critères suivants, merci d’indiquer si cela peut + influencer vos choix de produits à acheter: + + + + + + + > + + + + + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a. Le prix peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_2_a %} Tout à fait d'accord
    b. La provenance peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_2_b %} Tout à fait d'accord
    c. La qualité peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_2_c %} Tout à fait d'accord
    d. Le goût (si c'est un produit alimentaire) peut influencer vos choix de produits à acheter
    Pas du tout d'accord {% formfield player.q_22 %} Tout à fait d'accord
    e. Influence du label
              * Le label Bio peut influencer vos choix de produits à acheter +
    * label Bio: + Un produit Bio est un produit issu de l’agriculture biologique (c’est une méthode de production + agricole qui exclut le recours à la plupart des produits chimiques de synthèse, des produits + toxiques etc.). Il existe un label (AB) en France qui permet d’authentifier les produits issus + de cette méthode d’agriculture. +
            Pas du tout d'accord {% formfield player.q_2_e_a %} Tout à fait d'accord
              * Le label écologique peut influencer vos choix de produits à acheter +
    * label écologique: + Un produit écologique est un produit qui va être pensé, conçu, emballé, distribué, + recyclé de manière à minimiser l’impact sur l’environnement. Il doit respecter de + nombreuses règles liées à ces étapes lors d’un cahier des charges établis par un + organisme tel ECOLABEL ou ECOCERT. Un produit écologique doit être conçu dans un + maximum de respect de l’environnement (respect lié à l’utilisation des matières + premières et des machines lors de la fabrication). Le cycle de vie du produit ainsi + que son recyclage sont également des points importants à prendre en considération. +
            Pas du tout d'accord {% formfield player.q_2_e_b %} Tout à fait d'accord
              * Le label commerce équitable peut influencer vos choix de produits à acheter +
    * label commerce équitable: + Le commerce équitable est un partenariat commercial et international, reposant sur + des principes concrets et lancé depuis près de 20 ans. Son objectif est de pouvoir + garantir un meilleur équilibre entre les producteurs et les revendeurs, en assurant + de meilleures conditions de travail et une meilleure rémunération pour les petits + producteurs. +
            Pas du tout d'accord {% formfield player.q_2_e_c %} Tout à fait d'accord
    + +

    +           * Un autre label peut influencer vos choix de produits à acheter (si oui, à indiquer) + {% formfield player.q_2_h %} + +

    + +

    + +

    + 3) Faites-vous des achats en ligne ? + {% formfield player.q_3 %} +

    + + 4) Achetez-vous des vêtements en ligne ? + {% formfield player.q_4 %} +

    + +

    + 5) Etes-vous d’accord qu’il est moins écologique de faire des achats en ligne plutôt que des achats en magasin ? + + + + + + + + +
    Pas du tout d'accord {% formfield player.q_5 %} Tout à fait d'accord
    +

    + +

    + 6) Apportez-vous votre propre tasse de café (thé) à l'école / au travail (au lieu d'utiliser les tasses de la machine à café) ? + {% formfield player.q_6 %} +

    + + +

    + 7) Triez-vous vos déchets ménagers ? + {% formfield player.q_7 %} +

    + +

    + 8) Utilisez-vous un bac à compost ? + {% formfield player.q_8 %} +

    +

    + 9) Collectez-vous et recyclez-vous les papiers usagés ? + {% formfield player.q_9 %} +

    + +

    + 10) Réutilisez-vous vos sacs de course ? + {% formfield player.q_10 %} +

    + +

    + 11) Renvoyez-vous les piles usées aux points de collecte des déchets dangereux ? + {% formfield player.q_11 %} +

    + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire1.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire1.html new file mode 100644 index 0000000..645b42e --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire1.html @@ -0,0 +1,162 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (2/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    + +
    +
    + +

    + 12) Lors d’achat de nouveaux appareils électroniques, assurez-vous d’acheter ceux qui consomment le moins d'énergie ? + {% formfield player.q_12 %} +

    + +

    + 13) Éteignez-vous ou déconnectez-vous complètement les appareils électriques lorsque vous ne les utilisez pas (sans utiliser le mode veille) ? + {% formfield player.q_13 %} +

    + +

    + 14) Utilisez-vous un sèche-linge pour sécher les vêtements ? + {% formfield player.q_14 %} +

    + +

    + 15) Attendez-vous d'avoir une charge complète avant de faire votre lessive ? + {% formfield player.q_15 %} +

    + +

    + 16) Le radiateur de votre logement en hiver est-il éteint tard le soir entre 1h et 5h du matin ? + {% formfield player.q_16 %} +

    + +

    + 17) Réduisez-vous la température ambiante lorsque vous n'êtes pas à la maison pendant une longue période (en hiver) ? + {% formfield player.q_17 %} +

    + +

    + 18) Vous prenez une douche plutôt qu’un bain +{% formfield player.q_18 %} +

    + + + +

    19) Dégivrez-vous régulièrement le réfrigérateur ?

    + + 1 - Jamais + +
    +
    +

            a - Parce que j’ai acheté un frigo sans givre exprès
    +         b - Je partage le réfrigérateur avec d’autres personnes et quelqu’un d’autre en est responsable
    +         c - Autre raison
    +         (Si autre raison merci de le préciser) :
    + +

    +

    + 2 - Rarement
    + 3 - Souvent
    + 4 - Toujours
    + +

    +

    + 20) Supposons que vous êtes sur le point de réserver un taxi (par ex UBER) pour vous rendre à l’aéroport Orly. +
    Quelle option choisiriez-vous ? +
    + {% formfield player.q_20 %} +

    + +

    + 21) Les voitures électriques sont moins polluantes que les voitures essence ou diesel. +
    (Indiquez votre degré d’accord)

    + + + + + + +
    Pas du tout d'accord {% formfield player.q_21 %} Tout à fait d'accord
    +

    + +

    + 22) Seriez-vous intéressés par acheter une voiture à carburant alternatif ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_22_p2 %} Tout à fait d'accord
    +

    + +

    + 23) Adoptez-vous une conduite éco-responsable ? + +
    Une conduite éco-responsable consiste à : + Vérifier la pression des pneus. S’assurer du bon état du véhicule. Adopter une conduite souple (Démarrer en douceur et passer sans attendre le rapport supérieur pour éviter les sur-régimes). + Couper le moteur lors d’un arrêt prolongé. Ne pas abuser de la climatisation. + + + {% formfield player.q_23 %} +

    + + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire2.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire2.html new file mode 100644 index 0000000..5c466b8 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire2.html @@ -0,0 +1,240 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (3/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. +
    + +
    +
    + +

    + 24) Soutenir des taxes plus élevées pour les comportements dommageables envers l'environnement. +
    (Indiquez votre degré d’accord)

    + + + + + + +
    Pas du tout d'accord {% formfield player.q_24 %} Tout à fait d'accord
    +

    + +

    + 25) + Dans un programme politique, la place donnée aux problèmes environnementaux influence mon vote. +
    (Indiquez votre degré d’accord)

    + + + + {% formfield player.q_25 %} +

    + + +

    + 26) Parlez-vous souvent avec des amis de problèmes liés à l'environnement ? + + {% formfield player.q_26 %} +

    + + +

    27) Êtes-vous membre d'une organisation environnementale ? Si oui laquelle ? ?

    +Non
    +Oui
    +
    +

    {% formfield player.q_27_a %} +

    +
    + +

    + + +

    + 28) Soutenez-vous les incitations financières pour une technologie bénéfique pour l'environnement ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_28 %} Tout à fait d'accord
    +

    + +

    + 29) Pour chacune des actions suivantes, merci d’indiquer si elle peut réduire de façon peu importante ou très importante l'empreinte carbone individuelle : + +

    + + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + +
    a. Eviter de voyager par avion. Réduit de façon :
    Peu importante {% formfield player.q_29_a %} Très importante
    b. Faire moins d'enfants. Réduit de façon :
    Peu importante {% formfield player.q_29_b %} Très importante
    c. Ne pas avoir de voiture. Réduit de façon :
    Peu importante {% formfield player.q_29_c %} Très importante
    d. Un régime alimentaire végétarien. Réduit de façon :
    Peu importante {% formfield player.q_29_d %} Très importante
    +

    + + +

    + 30) Selon vous quelles sont les principales différences entre un bâtiment écologique et un bâtiment conventionnel ? + + + > + + + + + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    a- Aménagement paysager et activité physique
    Pas du tout d'accord {% formfield player.q_30_a %} Tout à fait d'accord
    b- Qualité de l'air intérieur
    Pas du tout d'accord {% formfield player.q_30_b %} Tout à fait d'accord
    c- Bruit intérieur
    Pas du tout d'accord {% formfield player.q_30_c %} Tout à fait d'accord
    d- Consommation annuelle d'énergie
    Pas du tout d'accord {% formfield player.q_30_d %} Tout à fait d'accord
    e- Consommation annuelle d'eau potable
    Pas du tout d'accord {% formfield player.q_30_e %} Tout à fait d'accord
    f- Frais de gestion mensuels
    Pas du tout d'accord {% formfield player.q_30_f %} Tout à fait d'accord
    +

    + +

    + 31) Si vous deviez déménager, seriez-vous intéressés par habiter dans un bâtiment écologique ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_31 %} Tout à fait d'accord
    +

    + + +

    + 32) Seriez-vous prêt à payer plus cher pour vivre dans un bâtiment écologique ? + + + + + + +
    Pas du tout d'accord {% formfield player.q_32 %} Tout à fait d'accord
    +

    + + +

    + 33) Savez-vous que vous habitez actuellement dans un bâtiment écologique (à faible consommation en énergies) ? + + {% formfield player.q_33 %} +

    + + + + +

    {% next_button %}

    + +
    + +

    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire3.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire3.html new file mode 100644 index 0000000..3e936cf --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/Questionnaire3.html @@ -0,0 +1,106 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire (4/4) +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    +

    +
    +
    + +

    ISR (Investissement socialement responsable)

    + +

    + La performance extra-financière contient des informations sur les grands axes du développement durable : +

  • Données sociales : l’emploi dans l’entreprise, la santé, la sécurité… On retrouve là les grands thèmes de la qualité de vie au travail. +
  • + +
  • Données sociétales : les mesures anti-discrimination, l’égalité hommes/femmes, l’insertion des travailleurs handicapés. +
  • +
  • Données environnementales : les actions mises en place pour lutter contre le gaspillage, la pollution, le réchauffement climatique… +
  • +

    + +

    + +

    + 34) Pour chacune des données suivantes, merci d’indiquer si elle est peu importante ou très importante dans votre choix d'investissement : + + + + > + + + + + + + + > + + + + + + + + + + + + + + +
    a. Données sociales :
    Peu importante {% formfield player.q_34_a %} Très importante
    b. Données sociétales :
    Peu importante {% formfield player.q_34_b %} Très importante
    c. Données environnementales :
    Peu importante {% formfield player.q_34_c %} Très importante
    + +

    + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/QuestionnaireEnd.html b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/QuestionnaireEnd.html new file mode 100644 index 0000000..43c9c56 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/templates/v2_exp_e4c_fr_p1_quest/QuestionnaireEnd.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Troisième Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la troisième étape. + +
    Vous allez maintenant commencer la quatrième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_fr_p1_quest/tests.py b/v2_exp_e4c_fr_p1_quest/tests.py new file mode 100644 index 0000000..cf1df41 --- /dev/null +++ b/v2_exp_e4c_fr_p1_quest/tests.py @@ -0,0 +1,80 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.participant.vars['versionexp'] == 1: + yield (pages.Questionnaire0, { + 'q_1': 1, + 'q_2_a': 1, + 'q_2_b': 1, + 'q_2_c': 1, + 'q_22': 1, + 'q_2_e_a': 1, + 'q_2_e_b': 1, + 'q_2_e_c': 1, + 'q_2_h': 1, + 'q_3': 1, + 'q_4': 1, + 'q_5': 1, + 'q_6': 1, + 'q_7': 1, + 'q_8': 1, + 'q_9': 1, + 'q_10': 1, + 'q_11': 1, + }) + yield (pages.Questionnaire1, { + 'q_12': 1, + 'q_13': 1, + 'q_14': 1, + 'q_15': 1, + 'q_16': 1, + 'q_17': 1, + 'q_18': 1, + 'q_19': 1, + 'q_19_a': 1, + 'q_19_b': 1, + 'q_20': 1, + 'q_21': 1, + 'q_22_p2': 1, + 'q_23': 1, + }) + yield (pages.Questionnaire2, { + 'q_24': 1, + 'q_25': 1, + 'q_26': 1, + 'q_27': 1, + 'q_27_a': 1, + 'q_28': 1, + 'q_29_a': 1, + 'q_29_b': 1, + 'q_29_c': 1, + 'q_29_d': 1, + 'q_30_a': 1, + 'q_30_b': 1, + 'q_30_c': 1, + 'q_30_d': 1, + 'q_30_e': 1, + 'q_30_f': 1, + 'q_31': 1, + 'q_32': 1, + 'q_33': 1, + + }) + yield (pages.Questionnaire3, { + 'q_34_a': 1, + 'q_34_b': 1, + 'q_34_c': 1, + }) + yield (pages.QuestionnaireEnd) + + + diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/__init__.py b/v2_exp_e4c_fr_p2_risk_gneezy/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/_builtin/__init__.py b/v2_exp_e4c_fr_p2_risk_gneezy/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/models.py b/v2_exp_e4c_fr_p2_risk_gneezy/models.py new file mode 100644 index 0000000..9870017 --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/models.py @@ -0,0 +1,106 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_fr_p2_risk_gneezy' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'v2_exp_e4c_fr_p2_risk_gneezy/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + treatment = models.IntegerField() + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/pages.py b/v2_exp_e4c_fr_p2_risk_gneezy/pages.py new file mode 100644 index 0000000..e68127f --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/pages.py @@ -0,0 +1,90 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1 + + + def vars_for_template(self): + self.player.task_start_19 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = round(time.time() - self.player.task_start_19,2) ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1 + + def vars_for_template(self): + self.player.task_start_20 = round(time.time(),2) ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = round(time.time() - self.player.task_start_20,2) ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1 + +page_sequence = [ + L_risk11_qc, + M_risk11, + Jeu1End, + +] diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/Jeu1End.html b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/Jeu1End.html new file mode 100644 index 0000000..314960d --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Première Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la première étape. + +
    Vous allez maintenant commencer la deuxième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/L_risk11_qc.html b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/L_risk11_qc.html new file mode 100644 index 0000000..e9c6057 --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/L_risk11_qc.html @@ -0,0 +1,88 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 1 +{% endblock %} + +{% block content %} + +
    +
    + + Ce jeu peut être pris en compte pour le calcul de vos gains. + +
    + {% include Constants.instructions_GP_template %} + + + +
    +
    + +

    + +

    Test de compréhension:

    + + +

    Si vous avez investi 6 ECUs dans le projet risqué :

    + +

    1) Combien d'ECUs avez-vous gardés ?

    + +

    {% formfield player.risk11_qc_a label="" %} +

    +

    2) Si l'investissement est un succès, + + quels sont les ECU en votre possession à la fin de ce jeu ? + + +

    +

    {% formfield player.risk11_qc_b label="" %} +

    +

    3) Si l'investissement est un échec, + + quels sont les ECU en votre possession à la fin de ce jeu ? + +

    +

    {% formfield player.risk11_qc_c label="" %} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/M_risk11.html b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/M_risk11.html new file mode 100644 index 0000000..ec29001 --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/M_risk11.html @@ -0,0 +1,56 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 1 +{% endblock %} + +{% block content %} + + +
    +
    + + +

    + Votre choix : +

    +
    + +
    +
    + +
    +

    Veillez saisir le montant de votre investissement dans le projet (en ECUs) (un montant entre 0 et 10):

    +

    {% formfield player.risk11_a label="" %} +

    + +

    Ainsi, combien d'ECUs avez vous gardés (un montant entre 0 et 10) ?

    +

    {% formfield player.risk11_b label="" %} +

    + +

    + Note: la somme des deux montants doit être égale à 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/M_risk11_result.html b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/M_risk11_result.html new file mode 100644 index 0000000..0358d57 --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 1 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/instructions.html b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/instructions.html new file mode 100644 index 0000000..5114de7 --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/templates/v2_exp_e4c_fr_p2_risk_gneezy/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Résumé du jeu :

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/v2_exp_e4c_fr_p2_risk_gneezy/tests.py b/v2_exp_e4c_fr_p2_risk_gneezy/tests.py new file mode 100644 index 0000000..b0833ab --- /dev/null +++ b/v2_exp_e4c_fr_p2_risk_gneezy/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.player.id_in_group % 2 == 1 and self.participant.vars['versionexp'] == 1: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + + diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/__init__.py b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/_builtin/__init__.py b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/models.py b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/models.py new file mode 100644 index 0000000..3aaefef --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/models.py @@ -0,0 +1,110 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_fr_p2bis_risk_gneezy_end' + players_per_group = None + num_rounds = 1 + + showupfee = 0 + + instructions_GP_template = 'v2_exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html' + + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + )) + return dict(report=report) + +class Group(BaseGroup): + pass + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + + + treatment = models.IntegerField() + + risk11_qc_a = models.IntegerField( + choices=[ + [1, '3'], + [2, '4'], + [3, '5'], + [4, '6'], + [5, '7'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_b = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + risk11_qc_c = models.IntegerField( + choices=[ + [1, '4'], + [2, '6'], + [3, '16'], + [4, '22'], + [5, '28'], + ], + widget=widgets.RadioSelectHorizontal, + blank=False + ) + ########################################################################################## + risk11_a = models.IntegerField( + label="investment dans le projet risqué", + blank=False, + min=0, + max=10 + ) + risk11_b = models.IntegerField( + label="investment dans le projet non-risqué", + blank=False, + min=0, + max=10 + ) + + tiragerisk = models.FloatField() + gainrisk = models.FloatField() + tirageriskresult = models.StringField() + + task_start_19 = models.FloatField() + task_time_19 = models.FloatField() + task_start_20 = models.FloatField() + task_time_20 = models.FloatField() + + + diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/pages.py b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/pages.py new file mode 100644 index 0000000..7b4c3e4 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/pages.py @@ -0,0 +1,91 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +########################################################################################### Jeu 5 : Risk - Gneezy Potters- Questionnaire compréhension +class L_risk11_qc(Page): + form_model = 'player' + form_fields = ['risk11_qc_a', 'risk11_qc_b', 'risk11_qc_c'] + + def is_displayed(self): + return self.player.id_in_group % 2 ==0 and self.participant.vars['versionexp'] == 1 + + def vars_for_template(self): + self.player.task_start_19 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 10, + } + + + def error_message(self, values): + print('values is', values) + if values['risk11_qc_a'] != 2: + return 'Merci de corriger votre réponse 1 !!' + elif values['risk11_qc_b'] != 4: + return 'Merci de corriger votre réponse 2 !!' + elif values['risk11_qc_c'] != 1: + return 'Merci de corriger votre réponse 3 !!' + + def before_next_page(self): + self.player.task_time_19 = time.time() - self.player.task_start_19 ######### count_time + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + +class M_risk11(Page): + # timeout_seconds = 1 # WB + + form_model = 'player' + form_fields = ['risk11_a', 'risk11_b'] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 1 + + def vars_for_template(self): + self.player.task_start_20 = time.time() ###### get_time + + return { + 'page': self.subsession.round_number + 11, + } + + def error_message(self, values): + print('values is', values) + if values['risk11_a'] + values['risk11_b'] != 10: + return 'La somme doit être égale à 10 !!' + + def before_next_page(self): + self.player.task_time_20 = time.time() - self.player.task_start_20 ######### count_time + + self.player.tiragerisk = round(random.random(), 2) ## + if self.player.tiragerisk < 0.5: + self.player.gainrisk = (self.player.risk11_a * 3) + self.player.risk11_b + self.player.tirageriskresult = "Succès" + else: + self.player.gainrisk = self.player.risk11_b + self.player.tirageriskresult = "Echec" + + + self.participant.vars['tirageriskresult_j1'] = self.player.tirageriskresult + self.participant.vars['risk11_a_j1'] = self.player.risk11_a + self.participant.vars['risk11_b_j1'] = self.player.risk11_b + self.participant.vars['gainrisk_j1'] = self.player.gainrisk + +class Jeu1End(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 1 + + +page_sequence = [ + L_risk11_qc, + M_risk11, +# M_risk11_result, + Jeu1End, + +] diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/Jeu1End.html b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/Jeu1End.html new file mode 100644 index 0000000..ed925d8 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/Jeu1End.html @@ -0,0 +1,29 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Deuxième Partie : Fin + +{% endblock %} + +{% block content %} +
    +
    + + +

    + Vous avez terminé la deuxième étape. + +
    Vous allez maintenant commencer la troisième étape. + +

    + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/L_risk11_qc.html b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/L_risk11_qc.html new file mode 100644 index 0000000..ab02d08 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/L_risk11_qc.html @@ -0,0 +1,84 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + {% include Constants.instructions_GP_template %} + + +
    +
    + +

    + +

    Test de compréhension:

    + + +

    Si vous avez investi 6 ECUs dans le projet risqué :

    + +

    1) Combien d'ECUs avez-vous gardés ?

    + +

    {% formfield player.risk11_qc_a label="" %} +

    +

    2) Si l'investissement est un succès, + + quels sont les ECU en votre possession à la fin de ce jeu ? + + +

    +

    {% formfield player.risk11_qc_b label="" %} +

    +

    3) Si l'investissement est un échec, + + quels sont les ECU en votre possession à la fin de ce jeu ? + +

    +

    {% formfield player.risk11_qc_c label="" %} +

    + + + +

    + + +{% next_button %} + + + +
    +
    + + +{% endblock %} + + + +{% block scripts %} + + + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11.html b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11.html new file mode 100644 index 0000000..1f0ce09 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11.html @@ -0,0 +1,55 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + + +
    +
    + +

    +

    + Votre choix : +

    + +
    +
    + +
    +

    Veillez saisir le montant de votre investissement dans le projet (en euros) (un montant entre 0 et 10):

    +

    {% formfield player.risk11_a label="" %} +

    + +

    Ainsi, combien d'euros avez vous gardés (un montant entre 0 et 10) ?

    +

    {% formfield player.risk11_b label="" %} +

    + +

    + Note: la somme des deux montants doit être égale à 10. +

    + +

    + + + {% next_button %} + +
    +
    + + + +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11_result.html b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11_result.html new file mode 100644 index 0000000..70bdd92 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/M_risk11_result.html @@ -0,0 +1,43 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} +{% endblock %} + +{% block content %} + +
    +
    + + +

    Jeu 2 : RESULTAT

    + + + +

    Le tirage au sort est : {{player.tirageriskresult}} +

    +

    Votre investissement dans l’actif risqué : {{player.risk11_a}}

    +

    Vous avez gardé : {{player.risk11_b}}

    + +
    + +

    Votre gain pour ce jeu est de : {{player.gainrisk}} ECU(s)

    + + +

    + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_GP_template %} + +
    + +{% endblock %} diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html new file mode 100644 index 0000000..5114de7 --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/templates/v2_exp_e4c_fr_p2bis_risk_gneezy_end/instructions.html @@ -0,0 +1,43 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + +
    +
    + +

    +

    Résumé du jeu :

    + +
    +
    +

    + + +
    +
    \ No newline at end of file diff --git a/v2_exp_e4c_fr_p2bis_risk_gneezy_end/tests.py b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/tests.py new file mode 100644 index 0000000..eaf4b8c --- /dev/null +++ b/v2_exp_e4c_fr_p2bis_risk_gneezy_end/tests.py @@ -0,0 +1,32 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + + if self.player.id_in_group % 2 == 0 and self.participant.vars['versionexp'] == 1: + yield (pages.L_risk11_qc, { + 'risk11_qc_a': 2, + 'risk11_qc_b': 4, + 'risk11_qc_c': 1, + }) + + yield (pages.M_risk11, { + 'risk11_a': 0, #random.randint(0, 10), + 'risk11_b': 10 , + }) + + yield (pages.Jeu1End) + + + + + diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/__init__.py b/v2_exp_e4c_fr_p3_risk_binswanger/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/_builtin/__init__.py b/v2_exp_e4c_fr_p3_risk_binswanger/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/models.py b/v2_exp_e4c_fr_p3_risk_binswanger/models.py new file mode 100644 index 0000000..e2eead6 --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/models.py @@ -0,0 +1,154 @@ +import random +from otree.api import ( + models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, + Currency as c, currency_range +) + + +doc = """ +Author : Wael Bousselmi +""" + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_fr_p3_risk_binswanger' + players_per_group = None + num_rounds = 1 + + tauxdechange = 1 + + instructions_BW_template = 'v2_exp_e4c_fr_risk_p3_binswanger/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, label=p.participant.label, answers=p.gainrisk)) + return dict(report=report) + + +class Group(BaseGroup): + pass + + +############################# +def imi_inv(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + [6, '6'], + [7, '7'] + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) + +# Define template for Goal commitment questions +def goal_com(label): + return models.IntegerField( + choices=[ + [0, '0'], + [1, '1'], + [2, '2'], + [3, '3'], + [4, '4'], + [5, '5'], + ], + label=label, + widget=widgets.RadioSelect, + blank=False + ) +############################# + + + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + treatment = models.IntegerField() + + + riskqc_a = models.IntegerField( + choices=[ + [1, '12 ECUs'], + [2, '0 ECUs'], + [3, '4 ECUs'], + [4, '6 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_b = models.IntegerField( + choices=[ + [1, '20 ECUs'], + [2, '0 ECUs'], + [3, '2 ECUs'], + [4, '12 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + riskqc_c = models.IntegerField( + choices=[ + [1, '0 ECUs'], + [2, '2 ECUs'], + [3, '24 ECUs'], + [4, '8 ECUs'], + ], + label="", + widget=widgets.RadioSelectHorizontal, + blank=False + ) + + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + task_start_risk = models.FloatField() + task_time_risk = models.FloatField() + + + + + + + + + + diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/pages.py b/v2_exp_e4c_fr_p3_risk_binswanger/pages.py new file mode 100644 index 0000000..2e2d8ca --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/pages.py @@ -0,0 +1,167 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + +def vars_for_all_templates(self): + return { + 'id_in_group_nn': self.player.participant.vars['role_nn'], + } + +###### traitement 1 risk au début +class Risk_BinsWanger_qc(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + +class Risk_BinsWanger_qc2(Page): + form_model = 'player' + form_fields = ['riskqc_a', 'riskqc_b', 'riskqc_c'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def error_message(self, values): + print('values is', values) + if values['riskqc_a'] != 1: + return 'Please correct your answer 1!!' + elif values['riskqc_b'] != 3: + return 'Please correct your answer 2!!' + elif values['riskqc_c'] != 1: + return 'Please correct your answer 3!!' + +class Risk_BinsWanger(Page): + form_model = 'player' + form_fields = ['choicerisk'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def vars_for_template(self): + self.player.task_start_risk = time.time() ###### get_time + + def before_next_page(self): + + if self.player.choicerisk == 1: + self.player.choicerisknn = "A" + elif self.player.choicerisk == 2: + self.player.choicerisknn = "B" + elif self.player.choicerisk == 3: + self.player.choicerisknn = "C" + elif self.player.choicerisk == 4: + self.player.choicerisknn = "D" + else: + self.player.choicerisknn = "E" + + self.player.task_time_risk = time.time() - self.player.task_start_risk ######### count_time + + self.participant.vars['choicerisk'] = self.player.choicerisk + self.participant.vars['choicerisknn'] = self.player.choicerisknn + +####################################################### + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + def before_next_page(self): + + ########################### + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Risk_BinsWanger_result(Page): + form_model = 'player' + form_fields = [] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + +class Jeu2End(Page): + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + +page_sequence = [ + Risk_BinsWanger_qc, + Risk_BinsWanger_qc2, + Risk_BinsWanger, + Jeu2End, +# Risk_BinsWanger_color, +# Risk_BinsWanger_result, +] diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Jeu2End.html b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Jeu2End.html new file mode 100644 index 0000000..e94ed99 --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Jeu2End.html @@ -0,0 +1,44 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Deuxième Partie : Fin + {% endif %} + {% if id_in_group_nn == 2 %} + Première Partie : Fin + {% endif %} + +{% endblock %} + +{% block content %} +
    +
    + + + {% if player.id_in_group == 1 %} +

    + Vous avez terminé la deuxième étape. + +
    Vous allez maintenant commencer la troisième étape. + +

    + {% endif %} + {% if player.id_in_group == 2 %} +

    + Vous avez terminé la première étape. + +
    Vous allez maintenant commencer la deuxième étape. + +

    + {% endif %} + + + +
    +
    + +

    {% next_button %}

    + + +{% endblock %} diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger.html b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger.html new file mode 100644 index 0000000..fedf251 --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger.html @@ -0,0 +1,401 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Jeu 2 : Votre choix + {% endif %} + {% if id_in_group_nn == 2 %} + Jeu 1 : Votre choix + {% endif %} +{% endblock %} + +{% block content %} + + + +
    +
    + + + + +

    +Vous allez maintenant jouer au jeu pour de vrai. Le gain de ce jeu sera pris + en compte dans le gain final. +

    + + + +

    Veuillez maintenant choisir la situation que vous préférez le + plus parmi les choix suivants (A, B, C, D ou E). + +

    + +

    + +

    Merci de faire un choix

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    A
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    B
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    C
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    D
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    E
    (0 ECUs) (24 ECUs)
    + + + + + + + + + +




    + + + + +
    + + + +
    + + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_color.html b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_color.html new file mode 100644 index 0000000..8de9a9e --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Jeu 2 : Choix de votre couleur + {% endif %} + {% if id_in_group_nn == 2 %} + Jeu 1 : Choix de votre couleur + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + +

    +

    + +

    + +

    +

    +

    + + +
    + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc.html b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..f1f7827 --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc.html @@ -0,0 +1,471 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + {% if id_in_group_nn == 1 %} + Jeu 2 + {% endif %} + {% if id_in_group_nn == 2 %} + Jeu 1 + {% endif %} + +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: + +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. + Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles + (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de + ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = {{ Constants.tauxchange}} €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera + enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + + + + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + + +
    (0 ECUs) (24 ECUs)
    + + + + + + + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, + avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc2.html b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc2.html new file mode 100644 index 0000000..73c4137 --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_qc2.html @@ -0,0 +1,1159 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire de compréhension +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Maintenant, nous voulons tester si vous avez compris les instructions du jeu.

    + + +
    + +

    + Exemple 1: + +

    + + +

    Si vous avez choisi la situation B, puis la couleur Verte apparaît. + +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + A + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + + +
    + + C + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + D + +
    (0 ECUs) (24 ECUs)
    + + + + + + +

    + Quels seraient vos gains?

    + + {% formfield player.riskqc_a label="" %} + +

    + + + +

    + Example 2: +

    + + +

    Si vous avez choisi la situation D, puis la couleur Rouge apparaît. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + + + + + + + + +

    + Question 2: Quels seraient vos gains?

    + + {% formfield player.riskqc_b label="" %} + +

    + + + +

    + + Example 3: +

    + + +

    Si vous avez choisi la situation E, puis la couleur Rouge apparaît. + +

    + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + + + +

    + +

    + + + + +

    +
    +

    + + + + +

    + +

    + + + + +

    +
    + + A + +
    (8 ECUs) (8 ECUs)
    B + +
    +

    + + + +

    +

    + + + +

    +
    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    + +
    + + B + +
    (6 ECUs) (12 ECUs)
    C + +

    + + +

    +

    + + +

    + +
    + +

    + + + + +

    + +

    + + + + +

    + +

    + + + + +

    +

    + + + + +

    + +
    + + C + +
    (4 ECUs) (16 ECUs)
    D + +

    + + + +

    + +
    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +

    + + + + + +

    + +
    + + D + +
    (2 ECU) (20 ECUs)
    E + + +

    + + + + + + +

    + + + + + + +

    +

    + + + + + + +

    +

    + + + + + + +

    + + +
    + + E + +
    (0 ECUs) (24 ECUs)
    + + + + + + +

    + Question 3: Quels seraient vos gains?

    + + {% formfield player.riskqc_c label="" %} + +

    + + + + + +




    + + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_result.html b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_result.html new file mode 100644 index 0000000..62a278e --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/templates/v2_exp_e4c_fr_p3_risk_binswanger/Risk_BinsWanger_result.html @@ -0,0 +1,58 @@ +{% extends "global/Page.html" %} +{% load otree %} + + +{% block title %} + + + {% if id_in_group_nn == 1 %} + Gain Jeu 2 : Détails + {% endif %} + {% if id_in_group_nn == 2 %} + Gain Jeu 1 : Détails + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + +

    Votre choix était : {{ player.choicerisknn }}

    + +

    La couleur sélectionné est : {{ player.colorselectnn }}

    + + +

    Votre gain pour ce jeu est : {{ player.gainrisk }} ECU(s)

    + + +

    Votre gain pour ce jeu est : {{ player.gainriskeur }} ECU(s)

    + +

    -----------------------------------------

    + +
    + + + +
    +
    + +

    +

    + Rappel des instructions : +

    +
    +
    + + {% include Constants.instructions_BW_template %} + +
    + +{% endblock %} + + diff --git a/v2_exp_e4c_fr_p3_risk_binswanger/tests.py b/v2_exp_e4c_fr_p3_risk_binswanger/tests.py new file mode 100644 index 0000000..a49c6ce --- /dev/null +++ b/v2_exp_e4c_fr_p3_risk_binswanger/tests.py @@ -0,0 +1,30 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + if self.participant.vars['versionexp'] == 1: + yield (pages.Risk_BinsWanger_qc) + + yield (pages.Risk_BinsWanger_qc2, { + 'riskqc_a': 1, + 'riskqc_b': 3, + 'riskqc_c': 1, + }) + + yield (pages.Risk_BinsWanger, { + 'choicerisk': random.randint(1, 5), + }) + + yield (pages.Jeu2End) + + + diff --git a/v2_exp_e4c_fr_p5_questfin/__init__.py b/v2_exp_e4c_fr_p5_questfin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_fr_p5_questfin/_builtin/__init__.py b/v2_exp_e4c_fr_p5_questfin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_fr_p5_questfin/models.py b/v2_exp_e4c_fr_p5_questfin/models.py new file mode 100644 index 0000000..bbafc9e --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/models.py @@ -0,0 +1,630 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C + +version: FR +""" + + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_fr_p5_questfin' + players_per_group = None + num_rounds = 1 + + showupfee = 5 + + instructions_GP_template = 'v2_exp_e4c_fr_p5_questfin/instructions.html' + instructions_BW_template = 'v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html' + + gainriskAred = 8#4 + gainriskBred = 6#3 + gainriskCred = 4#2 + gainriskDred = 2#1 + gainriskEred = 0#0 + + gainriskAgreen = 8#4 + gainriskBgreen = 12#6 + gainriskCgreen = 16#8 + gainriskDgreen = 20#10 + gainriskEgreen = 24#12 + + tauxchange = 0.8 # 1 ecu = 0.8 € + + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + treatmentname = p.treatmentname, + jeu_tire=p.jeu_tire, + jeuname = p.jeuname, + gainfinal=p.gainfinal, + gaineur=p.gaineur, + gainfinaleur=p.gainfinaleur, + )) + return dict(report=report) + + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + treatment = models.IntegerField() + treatmentname = models.StringField() + + langue = models.StringField() + langue_nn = models.IntegerField() + + # def role(self): + # return {1: 'A', 2: 'B'}[self.id_in_group] + +######### var jeu Binswanger + choicerisk = models.IntegerField( + blank=False, + ) + + choicerisknn = models.StringField() + tc3 = models.StringField() + tiragecolor = models.FloatField() + colorbutton = models.IntegerField() + colorselect = models.IntegerField() + colorselectnn = models.StringField() + gainrisk = models.FloatField() + gainriskeur = models.FloatField() + gainriskeurfinal = models.FloatField() + + q_40_etude = models.IntegerField( + choices=[ + [1, '1- Arts et/ou littérature'], + [2, '2- Economie et/ou gestion'], + [3, '3- Scientifique / ingénierie'], + [4, '4- Autre'], + ], + widget=widgets.RadioSelect, + label="a. Votre domaine d’étude ", + blank=False + ) + + q_41_gender = models.IntegerField( + choices=[ + [1, '1- Femme'], + [2, '2- Homme'], + [3, '3- Non-binaire'], + [4, '4- Ne souhaite pas répondre'], + ], + widget=widgets.RadioSelect, + label="b. Vous êtes ", + blank=False + ) + + q_42_age = models.IntegerField( + label="c. Quel âge avez-vous ?", + blank=False, + min=15, + max=100, + ) + + q_43_nationalite = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + blank=False, + label="d. Pays de nationalité ", + ) + + q_44_revenu = models.IntegerField( + choices=[ + [1, '1- Inférieur à 5 000 Euros'], + [2, '2- Entre 5 000 et 10 000 Euros'], + [3, '3- Entre 10 000 et 15 000 Euros '], + [4, '4- Entre 15 000 et 20 000 Euros '], + [5, '5- Entre 20 000 et 25 000 Euros '], + [6, '6- Supérieur à 25 000 Euros '], + ], + widget=widgets.RadioSelect, + label="e. Veuillez estimer votre revenu annuel brut (y compris vos bourses d'études et votre prêt étudiant) en Euros. ", + blank=False + ) + + # q_45_logement_pays = models.StringField( + # label="Pays - précédent logement ", + # blank=False + # ) + + q3_countries = models.IntegerField( + choices=[ + [1, "Afghanistan"], + [2, "Albania"], + [3, "Algeria"], + [4, "Andorra"], + [5, "Angola"], + [6, "Antigua and Barbuda"], + [7, "Argentina"], + [8, "Armenia"], + [9, "Australia"], + [10, "Austria"], + [11, "Azerbaijan"], + [12, "Bahamas"], + [13, "Bahrain"], + [14, "Bangladesh"], + [15, "Barbados"], + [16, "Belarus"], + [17, "Belgium"], + [18, "Belize"], + [19, "Benin"], + [20, "Bhutan"], + [21, "Bolivia"], + [22, "Bosnia and Herzegovina"], + [23, "Botswana"], + [24, "Brazil"], + [25, "Brunei Darussalam"], + [26, "Bulgaria"], + [27, "Burkina Faso"], + [28, "Burundi"], + [29, "Cambodia"], + [30, "Cameroon"], + [31, "Canada"], + [32, "Cape Verde"], + [33, "Central African Republic"], + [34, "Chad"], + [35, "Chile"], + [36, "China"], + [37, "Colombia"], + [38, "Comoros"], + [39, "Congo, Republic of the..."], + [40, "Costa Rica"], + [41, "Côte d'Ivoire"], + [42, "Croatia"], + [43, "Cuba"], + [44, "Cyprus"], + [45, "Czech Republic"], + [46, "Democratic People's Republic of Korea"], + [47, "Democratic Republic of the Congo"], + [48, "Denmark"], + [49, "Djibouti"], + [50, "Dominica"], + [51, "Dominican Republic"], + [52, "Ecuador"], + [53, "Egypt"], + [54, "El Salvador"], + [55, "Equatorial Guinea"], + [56, "Eritrea"], + [57, "Estonia"], + [58, "Ethiopia"], + [59, "Fiji"], + [60, "Finland"], + [61, "France"], + [62, "Gabon"], + [63, "Gambia"], + [64, "Georgia"], + [65, "Germany"], + [66, "Ghana"], + [67, "Greece"], + [68, "Grenada"], + [69, "Guatemala"], + [70, "Guinea"], + [71, "Guinea-Bissau"], + [72, "Guyana"], + [73, "Haiti"], + [74, "Honduras"], + [75, "Hong Kong (S.A.R.)"], + [76, "Hungary"], + [77, "Iceland"], + [78, "India"], + [79, "Indonesia"], + [80, "Iran, Islamic Republic of..."], + [81, "Iraq"], + [82, "Ireland"], + [83, "Israel"], + [84, "Italy"], + [85, "Jamaica"], + [86, "Japan"], + [87, "Jordan"], + [88, "Kazakhstan"], + [89, "Kenya"], + [90, "Kiribati"], + [91, "Kuwait"], + [92, "Kyrgyzstan"], + [93, "Lao People's Democratic Republic"], + [94, "Latvia"], + [95, "Lebanon"], + [96, "Lesotho"], + [97, "Liberia"], + [98, "Libyan Arab Jamahiriya"], + [99, "Liechtenstein"], + [100, "Lithuania"], + [101, "Luxembourg"], + [102, "Madagascar"], + [103, "Malawi"], + [104, "Malaysia"], + [105, "Maldives"], + [106, "Mali"], + [107, "Malta"], + [108, "Marshall Islands"], + [109, "Mauritania"], + [110, "Mauritius"], + [111, "Mexico"], + [112, "Micronesia, Federated States of..."], + [113, "Monaco"], + [114, "Mongolia"], + [115, "Montenegro"], + [116, "Morocco"], + [117, "Mozambique"], + [118, "Myanmar"], + [119, "Namibia"], + [120, "Nauru"], + [121, "Nepal"], + [122, "Netherlands"], + [123, "New Zealand"], + [124, "Nicaragua"], + [125, "Niger"], + [126, "Nigeria"], + [127, "North Korea"], + [128, "Norway"], + [129, "Oman"], + [130, "Pakistan"], + [131, "Palau"], + [132, "Panama"], + [133, "Papua New Guinea"], + [134, "Paraguay"], + [135, "Peru"], + [136, "Philippines"], + [137, "Poland"], + [138, "Portugal"], + [139, "Qatar"], + [140, "Republic of Korea"], + [141, "Republic of Moldova"], + [142, "Romania"], + [143, "Russian Federation"], + [144, "Rwanda"], + [145, "Saint Kitts and Nevis"], + [146, "Saint Lucia"], + [147, "Saint Vincent and the Grenadines"], + [148, "Samoa"], + [149, "San Marino"], + [150, "Sao Tome and Principe"], + [151, "Saudi Arabia"], + [152, "Senegal"], + [153, "Serbia"], + [154, "Seychelles"], + [155, "Sierra Leone"], + [156, "Singapore"], + [157, "Slovakia"], + [158, "Slovenia"], + [159, "Solomon Islands"], + [160, "Somalia"], + [161, "South Africa"], + [162, "South Korea"], + [163, "Spain"], + [164, "Sri Lanka"], + [165, "Sudan"], + [166, "Suriname"], + [167, "Swaziland"], + [168, "Sweden"], + [169, "Switzerland"], + [170, "Syrian Arab Republic"], + [171, "Tajikistan"], + [172, "Thailand"], + [173, "The former Yugoslav Republic of Macedonia"], + [174, "Timor-Leste"], + [175, "Togo"], + [176, "Tonga"], + [177, "Trinidad and Tobago"], + [178, "Tunisia"], + [179, "Turkey"], + [180, "Turkmenistan"], + [181, "Tuvalu"], + [182, "Uganda"], + [183, "Ukraine"], + [184, "United Arab Emirates"], + [185, "United Kingdom of Great Britain and Northern Ireland"], + [186, "United Republic of Tanzania"], + [187, "United States of America"], + [188, "Uruguay"], + [189, "Uzbekistan"], + [190, "Vanuatu"], + [191, "Venezuela, Bolivarian Republic of..."], + [192, "Viet Nam"], + [193, "Yemen"], + [194, "Zambia"], + [195, "Zimbabwe"], + ], + label="f. Pays - précédent logement ", + blank=False + ) + + q_46_logement_ville = models.StringField( + label="g. Ville - précédent logement ", + blank=False + ) + + q_31 = models.IntegerField() # nbre d'enfant ##### a changer q_31_enfant + + q_47_residence = models.IntegerField( + label="i. Vous habitez actuellement dans :", + choices=[ + [1, 'Le Bâtiment 103'], + [2, 'Une autre résidence'], + ], + widget=widgets.RadioSelect, + blank=False + ) + + q_48_satisfaction = models.IntegerField( + choices=[ + [1, '1 - Très satisfait(e)'], + [2, '2 - Satisfait(e)'], + [3, '3 - Insatisfait(e)'], + [4, '4 - Très insatisfait(e)'], + ], + widget=widgets.RadioSelect, + label="j. Quel est votre niveau de satisfaction concernant votre lieu de résidence ", + blank=True + ) + + + q_49_propositions = models.StringField( + label="k. Avez-vous des idées ou propositions d'améliorations " + "concernant votre lieu de résidence ? ", + + blank=True + ) + + + +### jeu 2 : Gneezy&Potters + tirageriskresult_j1 = models.StringField() + risk11_a_j1 = models.FloatField() + risk11_b_j1 = models.FloatField() + gainrisk_j1 = models.FloatField() + + + tirageausort = models.FloatField() + + jeu_tire = models.IntegerField() + gainfinal = models.FloatField() + + + #gainfinalecu = models.FloatField() + #gainfinalplushowup = models.FloatField() + gaineur = models.FloatField() + gainfinaleur = models.FloatField() + + gainfinaleur_v1 = models.FloatField() + + jeuname = models.StringField() + + lastname = models.StringField( + label="Nom", + blank=False + ) + + firstname = models.StringField( + label="Prénom", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Numéro de logement", + blank=False + ) + + + + + diff --git a/v2_exp_e4c_fr_p5_questfin/pages.py b/v2_exp_e4c_fr_p5_questfin/pages.py new file mode 100644 index 0000000..6853d75 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/pages.py @@ -0,0 +1,191 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + +class Risk_BinsWanger_color(Page): + form_model = 'player' + form_fields = ['tc3'] + + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + + def before_next_page(self): + self.player.treatment = self.player.participant.vars['treatment'] + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + + if self.player.treatment == 1: + self.player.treatmentname ='GP - BW' + elif self.player.treatment == 2: + self.player.treatmentname ='BW - GP' + + + ########################### + + self.player.choicerisk = self.participant.vars['choicerisk'] + self.player.choicerisknn = self.participant.vars['choicerisknn'] + + self.participant.vars['list_modif'] = self.player.tc3.split(';;') + self.player.tiragecolor = float(self.participant.vars['list_modif'][1]) + self.player.colorbutton = int(self.participant.vars['list_modif'][0]) + + if self.player.colorbutton == 1: + if self.player.tiragecolor >= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor < 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + elif self.player.colorbutton == 2: + if self.player.tiragecolor <= 0.5: + self.player.colorselect = 1 + self.player.colorselectnn = "Vert" + + elif self.player.tiragecolor > 0.5: + self.player.colorselect = 0 + self.player.colorselectnn = "Rouge" + + if self.player.colorselect == 0: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAred + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBred + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCred + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDred + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEred + + elif self.player.colorselect == 1: + if self.player.choicerisk == 1: + self.player.gainrisk = Constants.gainriskAgreen + + elif self.player.choicerisk == 2: + self.player.gainrisk = Constants.gainriskBgreen + + elif self.player.choicerisk == 3: + self.player.gainrisk = Constants.gainriskCgreen + + elif self.player.choicerisk == 4: + self.player.gainrisk = Constants.gainriskDgreen + + elif self.player.choicerisk == 5: + self.player.gainrisk = Constants.gainriskEgreen + + self.player.gainriskeur = self.player.gainrisk + + +# self.player.payoff = self.player.gainriskeurfinal * 1000 + + self.participant.vars['choicerisknn'] = self.player.choicerisknn + self.participant.vars['colorselectnn'] = self.player.colorselectnn + self.participant.vars['gainrisk'] = self.player.gainrisk + self.participant.vars['gainriskeur'] = self.player.gainriskeur + +class Questionnaire4(Page): + form_model = 'player' + form_fields = ['q_40_etude', 'q_41_gender', 'q_42_age', + 'q_43_nationalite', 'q_44_revenu', + 'q3_countries', 'q_46_logement_ville', 'q_31', + 'q_47_residence', 'q_48_satisfaction', 'q_49_propositions' + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + def before_next_page(self): + ### jeu 2 : risk Binswanger + self.player.choicerisknn = self.participant.vars['choicerisknn'] + self.player.colorselectnn = self.participant.vars['colorselectnn'] + self.player.gainrisk = self.participant.vars['gainrisk'] + self.player.gainriskeur = self.participant.vars['gainriskeur'] + + ### jeu 1 : Gneezy_Potters + + self.player.tirageriskresult_j1 = self.participant.vars['tirageriskresult_j1'] + self.player.risk11_a_j1 = self.participant.vars['risk11_a_j1'] + self.player.risk11_b_j1 = self.participant.vars['risk11_b_j1'] + self.player.gainrisk_j1 = self.participant.vars['gainrisk_j1'] + + + self.player.tirageausort = round(random.random(), 2) + + if self.player.treatment == 1 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 1 + self.player.jeuname = "GP" + else: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 2 + self.player.jeuname = "BW" + + if self.player.treatment == 2 : + if self.player.tirageausort < 0.5: + self.player.gainfinal = self.player.gainriskeur ############ Jeu 2 + self.player.jeu_tire = 1 + self.player.jeuname = "BW" + else: + self.player.gainfinal = self.player.gainrisk_j1 ############ Jeu 1 + self.player.jeu_tire = 2 + self.player.jeuname = "GP" + + + #self.player.gainfinalplushowup = self.player.gainfinal + Constants.showupfee + + self.player.gaineur = round(self.player.gainfinal * Constants.tauxchange,1) + + self.player.gainfinaleur = round(self.player.gaineur + Constants.showupfee,1) + + if (self.player.gainfinaleur * 100) % 100 <= 50 and (self.player.gainfinaleur * 100) % 100 > 0 : + self.player.gainfinaleur_v1 = ((round(((self.player.gainfinaleur * 100) - ((self.player.gainfinaleur * 100) % 100)), 0) + 50) / 100) * 1000 + else: + self.player.gainfinaleur_v1 = (round((self.player.gainfinaleur), 0))*1000 + + self.player.payoff = self.player.gainfinaleur_v1 + +class Result(Page): + form_model = 'player' + form_fields = [ + 'lastname', + 'firstname', + 'email', + 'room', + ] + def is_displayed(self): + return self.participant.vars['versionexp'] == 1 + + def before_next_page(self): + self.player.participant.vars['treatmentname'] = self.player.treatmentname + self.player.participant.vars['jeu_tire'] = self.player.jeu_tire + self.player.participant.vars['jeuname'] = self.player.jeuname + self.player.participant.vars['gainfinal'] = self.player.gainfinal + self.player.participant.vars['gaineur'] = self.player.gaineur + self.player.participant.vars['gainfinaleur'] = self.player.gainfinaleur + self.player.participant.vars['lastname'] = self.player.lastname + self.player.participant.vars['firstname'] = self.player.firstname + self.player.participant.vars['email'] = self.player.email + self.player.participant.vars['room'] = self.player.room + + + + + + +page_sequence = [ + Risk_BinsWanger_color, + Questionnaire4, + Result, + + +] diff --git a/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/AdminReport.html b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/AdminReport.html new file mode 100644 index 0000000..ac7e0a5 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/AdminReport.html @@ -0,0 +1,35 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label Treatment name Jeu tire Jeu name Gain (Ecus) Gain (€) gain final (gain+bonus) (€)
    {{ row.id }}{{ row.label }} {{row.treatmentname}}{{ row.jeu_tire }} {{row.jeuname}}{{ row.gainfinal }}{{ row.gaineur }}{{ row.gainfinaleur }}
    + diff --git a/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Questionnaire4.html b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Questionnaire4.html new file mode 100644 index 0000000..e27a1c1 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Questionnaire4.html @@ -0,0 +1,102 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Questionnaire Final +{% endblock %} + +{% block content %} + + +
    +
    + +Les réponses aux questions suivantes ne seront pas prises en compte dans le calcul de + vos gains. Nous vous demandons néanmoins de répondre le plus sincèrement possible. + Pour rappel, toutes vos réponses seront traitées de manière anonyme, et personne + n’aura accès à vos réponses. + +
    + +
    +
    + + {% formfield player.q_40_etude %} + {% formfield player.q_41_gender %} + {% formfield player.q_42_age%} + {% formfield player.q_43_nationalite %} + {% formfield player.q_44_revenu %} +
    +

    + + Indiquez la Ville et le Pays où était votre précédent logement : +

    + {% formfield player.q3_countries %} + + + {% formfield player.q_46_logement_ville %} + + + +
    +
    + + +

    +
    + + + {% formfield player.q_47_residence %} + + {% formfield player.q_48_satisfaction %} + + {% formfield player.q_49_propositions %} + + + + + +

    {% next_button %}

    + +
    + +
    + +{% endblock %} + + +{% block scripts %} + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Result.html b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Result.html new file mode 100644 index 0000000..4c2b8d8 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Result.html @@ -0,0 +1,60 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + QUESTIONNAIRE FINAL + +{% endblock %} + +{% block content %} +
    +
    + +
    +
    + Informations Utiles pour recevoir votre gain : + +
    +
    + +
    + +
    +
    + +

    + Merci de bien remplir les champs suivants afin de pouvoir récupérer la somme que vous avez gagnée durant cette expérience. + {% formfield player.lastname %} + {% formfield player.firstname %} + {% formfield player.email %} + {% formfield player.room %} + +

    + +

    + Rappel pour ceux qui ne se sont pas encore inscrits : pour recevoir votre gain vous devez vous inscrire dans la liste + des participants volontaires via le lien : + +

    http://orsee.labeds.fr/public/

    +
    Note : Vos données personnelles sont strictement confidentielles. + Toutes vos réponses seront traitées anonymement. +
    + +

    + +
    +
    + +

    {% next_button %}

    + + + +{% endblock %} + + + diff --git a/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_color.html b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_color.html new file mode 100644 index 0000000..5fb7fc4 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_color.html @@ -0,0 +1,164 @@ + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + {% if player.id_in_group == 1 %} + Choix de votre couleur (pour le jeu 2) + {% endif %} + {% if player.id_in_group == 2 %} + Choix de votre couleur (pour le jeu 1) + {% endif %} + + +{% endblock %} + +{% block content %} + + +
    +
    + + + + + +

    Veuillez choisir entre les deux boutons suivants :

    + +

    Une couleur (rouge ou verte) est cachée derrière chaque bouton. + Lorsque vous cliquez sur l'un des boutons, sa couleur apparaît. + Si la couleur qui apparaît est verte, vous recevrez les gains verts de la sélection que vous avez faite au début. + S'il est rouge, vous recevrez les gains rouges.

    +

    + +
    + + + +
    + + + + +
    + +

    + + + + + + + +{% endblock %} + + +{% block scripts %} + + + + + +{% endblock %} \ No newline at end of file diff --git a/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..98be971 --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = … €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/instructions.html b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/templates/v2_exp_e4c_fr_p5_questfin/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/v2_exp_e4c_fr_p5_questfin/tests.py b/v2_exp_e4c_fr_p5_questfin/tests.py new file mode 100644 index 0000000..551851d --- /dev/null +++ b/v2_exp_e4c_fr_p5_questfin/tests.py @@ -0,0 +1,39 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + if self.participant.vars['versionexp'] == 1: + yield (pages.Risk_BinsWanger_color, { + 'tc3': '1;;0.3', + }) + + yield (pages.Questionnaire4, { + 'q_40_etude': 1, + 'q_41_gender': 1, + 'q_42_age': random.randint(18, 40), + 'q_43_nationalite': 5, + 'q_44_revenu': 1, + 'q3_countries': 1, + 'q_46_logement_ville': 'fr', + 'q_31': 3, + 'q_47_residence': 1, + 'q_48_satisfaction': 2, + 'q_49_propositions': 'sasasadad' + }) + + yield (pages.Result, { + 'lastname': 'a', + 'firstname': 'b', + 'email': '@', + 'room': 'a', + }) + + diff --git a/v2_exp_e4c_x_fr_en_fin/__init__.py b/v2_exp_e4c_x_fr_en_fin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/v2_exp_e4c_x_fr_en_fin/_builtin/__init__.py b/v2_exp_e4c_x_fr_en_fin/_builtin/__init__.py new file mode 100644 index 0000000..3505705 --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/_builtin/__init__.py @@ -0,0 +1,20 @@ +# Don't change anything in this file. +from .. import models +import otree.api + + +class Page(otree.api.Page): + subsession: models.Subsession + group: models.Group + player: models.Player + + +class WaitPage(otree.api.WaitPage): + subsession: models.Subsession + group: models.Group + + +class Bot(otree.api.Bot): + subsession: models.Subsession + group: models.Group + player: models.Player diff --git a/v2_exp_e4c_x_fr_en_fin/models.py b/v2_exp_e4c_x_fr_en_fin/models.py new file mode 100644 index 0000000..bf32530 --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/models.py @@ -0,0 +1,83 @@ +from otree.api import ( + models, + widgets, + BaseConstants, + BaseSubsession, + BaseGroup, + BasePlayer, + Currency as c, + currency_range, +) + +doc = """ +author = 'Wael Bousselmi' +Exp E4C +""" + +class Constants(BaseConstants): + name_in_url = 'v2_exp_e4c_x_fr_en_fin' + players_per_group = None + num_rounds = 1 + +class Subsession(BaseSubsession): + + def vars_for_admin_report(self): + report = list() + for p in self.get_players(): + report.append(dict(id=p.participant.id_in_session, + label=p.participant.label, + lastname = p.lastname, + firstname =p.firstname, + #email =p.email, + room =p.room , + language =p.language, + treatmentname = p.treatmentname, + jeu_tire=p.jeu_tire, + jeuname = p.jeuname, + gainfinal=p.gainfinal, + gaineur=p.gaineur, + gainfinaleur=p.gainfinaleur, + gain_ff = p.gain_ff + )) + return dict(report=report) + + +class Group(BaseGroup): + pass + +class Player(BasePlayer): + id_in_group_nn = models.IntegerField() + + lastname = models.StringField( + label="Nom", + blank=False + ) + + firstname = models.StringField( + label="Prénom", + blank=False + ) + + email = models.StringField( + label="Email", + blank=False + ) + + room = models.StringField( + label="Numéro de logement", + blank=False + ) + language = models.StringField() + treatmentname = models.StringField() + jeu_tire = models.IntegerField() + jeuname = models.StringField() + gainfinal = models.FloatField() + gaineur = models.FloatField() + gainfinaleur = models.FloatField() + + gain_ff = models.FloatField() + + + + + diff --git a/v2_exp_e4c_x_fr_en_fin/pages.py b/v2_exp_e4c_x_fr_en_fin/pages.py new file mode 100644 index 0000000..90f9ca4 --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/pages.py @@ -0,0 +1,49 @@ +from otree.api import Currency as c, currency_range +from ._builtin import Page, WaitPage +from .models import Constants + +import random +import time + + + +class Pass(Page): + timeout_seconds = 0 # WB + + form_model = 'player' + + def before_next_page(self): + self.player.id_in_group_nn = self.player.participant.vars['role_nn'] + self.player.treatmentname = self.player.participant.vars['treatmentname'] + self.player.jeu_tire = self.player.participant.vars['jeu_tire'] + self.player.jeuname = self.player.participant.vars['jeuname'] + self.player.gainfinal = self.player.participant.vars['gainfinal'] + self.player.gaineur = self.player.participant.vars['gaineur'] + self.player.gainfinaleur = self.player.participant.vars['gainfinaleur'] + + + self.player.lastname = self.player.participant.vars['lastname'] + self.player.firstname = self.player.participant.vars['firstname'] + self.player.email = self.player.participant.vars['email'] + self.player.room = self.player.participant.vars['room'] + self.player.language = self.player.participant.vars['language'] + + + + if (self.player.gainfinaleur * 100) % 100 <= 50 and (self.player.gainfinaleur * 100) % 100 > 0 : + self.player.gain_ff = (round(((self.player.gainfinaleur * 100) - ((self.player.gainfinaleur * 100) % 100)), 0) + 50) / 100 + else: + self.player.gain_ff = round((self.player.gainfinaleur), 0) + +class Fin(Page): + timeout_seconds = 300 # WB + + form_model = 'player' + + +page_sequence = [ + Pass, + Fin, + + +] diff --git a/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/AdminReport.html b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/AdminReport.html new file mode 100644 index 0000000..467e6ca --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/AdminReport.html @@ -0,0 +1,47 @@ +{% load otree %} + + + + + + + + + + + + + + + + + + + + + + + {% for row in report %} + + + + + + + + + + + + + + + + + + + + + {% endfor %} + +
    Participant ID Participant Label lastname firstname room language Treatment name Jeu tire Jeu name Gain (Ecus) Gain (€) gain final (gain+bonus) (€) gain_ff (arrondi)
    {{ row.id }}{{ row.label }} {{ row.lastname }} {{ row.firstname }} {{ row.room }} {{ row.language }} {{row.treatmentname }}{{ row.jeu_tire }} {{row.jeuname }}{{ row.gainfinal }}{{ row.gaineur }}{{ row.gainfinaleur }}{{ row.gain_ff }}
    \ No newline at end of file diff --git a/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Fin.html b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Fin.html new file mode 100644 index 0000000..6201dbb --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Fin.html @@ -0,0 +1,113 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + +{% if player.language == "FR"%} + GAIN FINAL +{% endif %} + +{% if player.language == "EN"%} + FINAL GAIN +{% endif %} + +{% endblock %} + +{% block content %} + + + +{% if player.language == "FR"%} + +
    +
    + +
    +
    + NB : Vous devez imprimer ou prendre une capture d'écran de cette page et nous la présenter lors de la récupération de votre rémunération !! +
    +
    + +
    + +
    +
    + +

    Jeu sélectionné : Jeu {{ player.jeu_tire}} +
    + Gain jeu (en ECUs): {{player.gainfinal}} +
    + Gain jeu (en €) : {{player.gaineur}} +

    + Gain jeu + rémunération fixe (en €) : {{player.gainfinaleur}} + +

    +
    -------------------------------------------
    + + +

    Informations sur le participant :

    +

    Nom : {{player.lastname}} +
    Prénom : {{player.firstname}} + + + + +

    Un mail vous sera envoyé dès que possible pour vous indiquer comment récupérer votre gain en cash.

    + + +
    +
    + +{% endif %} + + +{% if player.language == "EN"%} + +
    +
    + +
    +
    +NB: You must print or take a screenshot of this page and present it to us when collecting your compensation !!
    +
    + +
    + +
    +
    + +

    Selected game : Game {{ player.jeu_tire}} +
    + Gain of the game (ECUs): {{player.gainfinal}} +
    + Gain of the game (€) : {{player.gaineur}} +

    + Gain + bonus (€) : {{player.gainfinaleur}} + +

    +
    -------------------------------------------
    + + +

    Participant's information:

    +

    Last name : {{player.lastname}} +
    First name : {{player.firstname}} + + + + +

    An email will be sent to you as soon as possible to tell you how to get your cash winnings.

    + +
    +
    + +{% endif %} + + + + + +

    {% next_button %}

    + + + +{% endblock %} diff --git a/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Pass.html b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Pass.html new file mode 100644 index 0000000..0481f99 --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Pass.html @@ -0,0 +1,22 @@ + + + + + +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + + Please wait! + +{% endblock %} + +{% block content %} + + +{% endblock %} diff --git a/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Risk_BinsWanger_qc.html b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Risk_BinsWanger_qc.html new file mode 100644 index 0000000..98be971 --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/Risk_BinsWanger_qc.html @@ -0,0 +1,393 @@ +{% extends "global/Page.html" %} +{% load otree %} + +{% block title %} + Jeu 2 +{% endblock %} + +{% block content %} + +

    + Ce jeu peut être pris en compte pour le calcul de vos gains. +

    + +
    +
    + + + + + + +

    + Règles du jeu: +

    + +

    + Regardez le tableau ci-dessous. Il présente 5 situations différentes. Regardez-les attentivement. + Les situations A, B, C, D et E contiennent deux gains possibles (en ECUS): les gains rouges à gauche et + les gains verts à droite. Vous recevrez l'un de ces deux montants de ECUS en fonction de la couleur qui + vous sera attribuée à la fin de la partie. +

    + +

    +À la fin du jeu, les ECUS que vous aurez gagnés seront convertis en € via la règle suivante:

    +

    +

    1 ECU = … €
    +

    + +

    +Vous devrez donc d'abord choisir la situation que vous préférez le plus: A, B, C, D ou E.

    + +

    + +

    Avertissement ! L'image ci-dessous est un exemple, votre choix sera enregistré plus tard.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Options Rouge Vert
    A +

    + + +

    + +

    + + +

    +
    +

    + + +

    + +

    + + +

    +
    (4 ECUs) (4 ECUs)
    B + +
    +

    + + + +

    +
    + +
    + +

    + + + +

    + +

    + + + +

    + +
    (3 ECUs) (6 ECUs)
    C + +

    + + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +
    (2 ECUs) (8 ECUs)
    D + +

    + +

    + +
    + +

    + + + +

    + +

    + + +

    + +

    + + + +

    + +

    + + +

    + + + + + +
    (1 ECU) (10 ECUs)
    E + + +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    +

    + + + + +

    + + + +
    (0 ECUs) (12 ECUs)
    + +

    + +

    + + Deuxièmement, votre couleur vous sera révélée, à la fin de l'expérience, avec le processus suivant: + +
    Vous choisirez entre deux boutons qui ressemblent à ceci: + + +

    + +
    + + + + + +
    + + + + + +
    + +
    + +

    Après avoir cliqué sur l'un des boutons, une couleur rouge ou verte apparaîtra. Cette couleur déterminera vos gains.

    +

    Il y a 50% de chance que la couleur rouge soit derrière le bouton gauche ou droite. La même probabilité s'applique + pour la couleur verte.

    + +

    + +




    + + + + + +
    + + + +
    + + + {% next_button %} + +{% endblock %} + + + + + + +{% block scripts %} + + + + + + + +{% endblock %} + diff --git a/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/instructions.html b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/instructions.html new file mode 100644 index 0000000..43d18af --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/templates/v2_exp_e4c_x_fr_en_fin/instructions.html @@ -0,0 +1,30 @@ +{% load otree %} + + + +
    +
    +

    + Règles du jeu : +

    + +

    Vous disposez d'un capital de 10 ECUs, et vous devez décider du montant de votre investissement dans le projet décrit ci-dessous. + Vous pouvez investir n'importe quel montant compris entre 0 ECUs et 10 ECUs (en nombres entiers).

    + +
    Description du projet :
    + +

    Ce projet rapporte 3 fois le montant investi en cas de succès et 0 en cas d'échec. + Succès et échec ont la même probabilité de se réaliser : 1 chance sur 2.

    +

    +

    Votre gain de cette tâche = montant conservé + gain de votre investissement dans le projet.

    +

    +

    Exemple 1 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un succès. Votre gain du projet est + de 3 x 4 ECUs = 12 ECUs. Votre gain de cette tâche est donc 6 ECUs conservés + 12 ECUs de gain du projet = 18 ECUs. +

    + +

    Exemple 2 : Vous décidez d'investir 4 ECUs dans le projet. Le projet est un échec. Votre gain du projet est + de 0 x 4 ECUs = 0 ECUs. Votre gain de ce jeu est donc 6 ECUs conservés + 0 ECUs de gain du projet = 6 ECUs. +

    + +
    + diff --git a/v2_exp_e4c_x_fr_en_fin/tests.py b/v2_exp_e4c_x_fr_en_fin/tests.py new file mode 100644 index 0000000..7aec6b4 --- /dev/null +++ b/v2_exp_e4c_x_fr_en_fin/tests.py @@ -0,0 +1,23 @@ +from otree.api import Currency as c, currency_range, Submission +from . import pages +from ._builtin import Bot +from .models import Constants +import random + + +# ********************************************************************************************************************** +# *** BOT +# ********************************************************************************************************************** +class PlayerBot(Bot): + def play_round(self): + + yield Submission( + pages.Pass, + check_html=False + ) + + yield (pages.Fin) + + + +