Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -888,26 +888,22 @@ def save_to_sheet(data):
|
|
| 888 |
return False
|
| 889 |
|
| 890 |
def create_likert_question(question, key, scale_type="5point"):
|
| 891 |
-
"""نمایش سوال لیکرت با اسلایدر نقطهای
|
| 892 |
-
|
| 893 |
-
|
| 894 |
-
if scale_type == "
|
| 895 |
-
left_label = "کاملاً مخالفم"
|
| 896 |
-
right_label = "کاملاً موافقم"
|
| 897 |
-
else: # 7-point scale
|
| 898 |
-
left_label = "کاملاً مخالفم"
|
| 899 |
-
right_label = "کاملاً موافقم"
|
| 900 |
|
| 901 |
-
st.markdown(f"<p style='font-size:16px; margin-bottom:
|
| 902 |
|
| 903 |
-
# ایجاد اسلایدر
|
|
|
|
| 904 |
value = st.slider(
|
| 905 |
-
|
| 906 |
min_value=1,
|
| 907 |
-
max_value=
|
| 908 |
-
value=
|
| 909 |
step=1,
|
| 910 |
-
key=f"slider_{key}"
|
| 911 |
)
|
| 912 |
|
| 913 |
# نمایش متن دو طرف اسلایدر
|
|
@@ -917,6 +913,9 @@ def create_likert_question(question, key, scale_type="5point"):
|
|
| 917 |
<span>{left_label}</span>
|
| 918 |
<span>{right_label}</span>
|
| 919 |
</div>
|
|
|
|
|
|
|
|
|
|
| 920 |
""",
|
| 921 |
unsafe_allow_html=True
|
| 922 |
)
|
|
@@ -1098,41 +1097,83 @@ def attention_check1():
|
|
| 1098 |
st.warning("لطفاً یک گزینه را انتخاب کنید")
|
| 1099 |
|
| 1100 |
def random_likert_questions():
|
| 1101 |
-
"""نمایش
|
| 1102 |
-
|
| 1103 |
-
|
| 1104 |
-
|
| 1105 |
-
|
| 1106 |
-
|
| 1107 |
-
|
| 1108 |
-
|
| 1109 |
-
|
| 1110 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1111 |
|
| 1112 |
-
# نمایش
|
| 1113 |
-
|
| 1114 |
|
| 1115 |
-
|
| 1116 |
-
|
| 1117 |
-
|
| 1118 |
-
q["question"],
|
| 1119 |
-
["1", "13", "15", "17", "دیگر"],
|
| 1120 |
-
index=None
|
| 1121 |
-
)
|
| 1122 |
-
else:
|
| 1123 |
-
# سوالات لیکرت
|
| 1124 |
answer = create_likert_question(q["question"], q["key"], q["scale"])
|
| 1125 |
-
|
| 1126 |
-
|
| 1127 |
-
|
| 1128 |
-
|
| 1129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1130 |
|
| 1131 |
-
if st.
|
| 1132 |
-
|
| 1133 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1134 |
else:
|
| 1135 |
-
|
|
|
|
|
|
|
| 1136 |
|
| 1137 |
def explanation_questions():
|
| 1138 |
"""سوالات درباره توضیحات قیمت"""
|
|
@@ -1337,33 +1378,18 @@ def thank_you_page():
|
|
| 1337 |
st.balloons()
|
| 1338 |
|
| 1339 |
# ========== مدیریت وضعیت و صفحهبندی ==========
|
| 1340 |
-
def main():
|
| 1341 |
-
# تشخیص دستگاه
|
| 1342 |
-
user_agent = st.query_params.get("user_agent", [""])[0]
|
| 1343 |
-
st.session_state.is_desktop = "mobile" not in user_agent.lower()
|
| 1344 |
|
| 1345 |
-
|
|
|
|
| 1346 |
if 'current_page' not in st.session_state:
|
| 1347 |
st.session_state.current_page = "welcome"
|
|
|
|
|
|
|
|
|
|
| 1348 |
st.session_state.scenario_type = random.choice(["control", "input", "counterfactual"])
|
| 1349 |
st.session_state.price = 200000
|
| 1350 |
-
st.session_state.user_contact = None
|
| 1351 |
-
st.session_state.demographic_data = None
|
| 1352 |
-
st.session_state.price_accepted = 0
|
| 1353 |
-
st.session_state.attention_check1 = None
|
| 1354 |
-
st.session_state.attention_check2 = None
|
| 1355 |
-
st.session_state.all_questions = []
|
| 1356 |
-
st.session_state.current_question_index = 0
|
| 1357 |
-
|
| 1358 |
-
# مقداردهی اولیه برای تمام سوالات لیکرت
|
| 1359 |
-
likert_questions = [
|
| 1360 |
-
"informational_1", "informational_2", "informational_3", "informational_4", "informational_5",
|
| 1361 |
-
"distributive_1", "distributive_2", "distributive_3",
|
| 1362 |
-
"procedural_1", "procedural_2", "procedural_3"
|
| 1363 |
-
]
|
| 1364 |
-
for q in likert_questions:
|
| 1365 |
-
st.session_state[q] = None
|
| 1366 |
|
|
|
|
| 1367 |
pages = {
|
| 1368 |
"welcome": welcome_page,
|
| 1369 |
"scenario_explanation": scenario_explanation,
|
|
@@ -1377,8 +1403,13 @@ def main():
|
|
| 1377 |
}
|
| 1378 |
|
| 1379 |
# نمایش صفحه جاری
|
| 1380 |
-
|
| 1381 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1382 |
|
| 1383 |
if __name__ == "__main__":
|
| 1384 |
main()
|
|
|
|
| 888 |
return False
|
| 889 |
|
| 890 |
def create_likert_question(question, key, scale_type="5point"):
|
| 891 |
+
"""نمایش سوال لیکرت با اسلایدر نقطهای"""
|
| 892 |
+
# تعریف لیبلهای دو طرف
|
| 893 |
+
left_label = "کاملاً مخالفم" if scale_type == "7point" else "کاملاً مخالفم"
|
| 894 |
+
right_label = "کاملاً موافقم" if scale_type == "7point" else "کاملاً موافقم"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 895 |
|
| 896 |
+
st.markdown(f"<p style='font-size:16px; margin-bottom:5px;'>{question}</p>", unsafe_allow_html=True)
|
| 897 |
|
| 898 |
+
# ایجاد اسلایدر
|
| 899 |
+
max_value = 7 if scale_type == "7point" else 5
|
| 900 |
value = st.slider(
|
| 901 |
+
"",
|
| 902 |
min_value=1,
|
| 903 |
+
max_value=max_value,
|
| 904 |
+
value=(max_value+1)//2, # مقدار میانی
|
| 905 |
step=1,
|
| 906 |
+
key=f"slider_{key}"
|
| 907 |
)
|
| 908 |
|
| 909 |
# نمایش متن دو طرف اسلایدر
|
|
|
|
| 913 |
<span>{left_label}</span>
|
| 914 |
<span>{right_label}</span>
|
| 915 |
</div>
|
| 916 |
+
<p style='text-align:center; color:#6a0dad; font-weight:bold;'>
|
| 917 |
+
پاسخ شما: {value}
|
| 918 |
+
</p>
|
| 919 |
""",
|
| 920 |
unsafe_allow_html=True
|
| 921 |
)
|
|
|
|
| 1097 |
st.warning("لطفاً یک گزینه را انتخاب کنید")
|
| 1098 |
|
| 1099 |
def random_likert_questions():
|
| 1100 |
+
"""نمایش سوالات لیکرت به ترتیب مشخص"""
|
| 1101 |
+
# تعریف گروههای سوالات
|
| 1102 |
+
question_groups = [
|
| 1103 |
+
{
|
| 1104 |
+
"title": "سوالات عدالت توزیعی",
|
| 1105 |
+
"questions": [
|
| 1106 |
+
{"key": "distributive_1", "question": "قیمتی که به شما ارائه شد، منصفانه است.", "scale": "7point"},
|
| 1107 |
+
{"key": "distributive_2", "question": "قیمتی که به شما ارائه شد، معقول است.", "scale": "7point"},
|
| 1108 |
+
{"key": "distributive_3", "question": "قیمتی که به شما ارائه شد، قابل قبول است.", "scale": "7point"}
|
| 1109 |
+
],
|
| 1110 |
+
"attention_check": "من با دقت به این سوالات پاسخ میدهم."
|
| 1111 |
+
},
|
| 1112 |
+
{
|
| 1113 |
+
"title": "سوالات عدالت رویهای",
|
| 1114 |
+
"questions": [
|
| 1115 |
+
{"key": "procedural_1", "question": "فرآیند و رویه قیمتگذاری پلتفرم قابل قبول است.", "scale": "7point"},
|
| 1116 |
+
{"key": "procedural_2", "question": "فرآیند و رویه قیمتگذاری پلتفرم منصفانه است.", "scale": "7point"},
|
| 1117 |
+
{"key": "procedural_3", "question": "فرآیند و رویه قیمتگذاری پلتفرم معقول است.", "scale": "7point"}
|
| 1118 |
+
],
|
| 1119 |
+
"attention_check": "من با دقت به این سوالات پاسخ میدهم."
|
| 1120 |
+
},
|
| 1121 |
+
{
|
| 1122 |
+
"title": "سوالات اطلاعاتی",
|
| 1123 |
+
"questions": [
|
| 1124 |
+
{"key": "informational_1", "question": "پلتفرم به صورت صادقانه دلایل تعیین قیمت را توضیح داد.", "scale": "5point"},
|
| 1125 |
+
{"key": "informational_2", "question": "پلتفرم به طور کامل عوامل مؤثر بر تعیین قیمت را شرح داد.", "scale": "5point"},
|
| 1126 |
+
{"key": "informational_3", "question": "دلایل ارائهشده برای تعیین قیمت منطقی و قابل قبول بود.", "scale": "5point"},
|
| 1127 |
+
{"key": "informational_4", "question": "توضیحات درباره تعیین قیمت بلافاصله و در زمان مناسب نمایش داده شد.", "scale": "5point"},
|
| 1128 |
+
{"key": "informational_5", "question": "توضیحات پلتفرم درباره تعیین قیمت، متناسب با شرایط سفر من بود.", "scale": "5point"}
|
| 1129 |
+
]
|
| 1130 |
+
}
|
| 1131 |
+
]
|
| 1132 |
+
|
| 1133 |
+
# مقداردهی اولیه
|
| 1134 |
+
if 'current_group' not in st.session_state:
|
| 1135 |
+
st.session_state.current_group = 0
|
| 1136 |
+
st.session_state.current_question = 0
|
| 1137 |
+
st.session_state.answers = {}
|
| 1138 |
+
|
| 1139 |
+
current_group = question_groups[st.session_state.current_group]
|
| 1140 |
|
| 1141 |
+
# نمایش عنوان گروه
|
| 1142 |
+
st.markdown(f"## {current_group['title']}")
|
| 1143 |
|
| 1144 |
+
# نمایش سوالات گروه جاری
|
| 1145 |
+
if st.session_state.current_question < len(current_group['questions']):
|
| 1146 |
+
q = current_group['questions'][st.session_state.current_question]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1147 |
answer = create_likert_question(q["question"], q["key"], q["scale"])
|
| 1148 |
+
|
| 1149 |
+
if st.button("ادامه", key=f"btn_{q['key']}"):
|
| 1150 |
+
if answer:
|
| 1151 |
+
st.session_state.answers[q["key"]] = answer
|
| 1152 |
+
st.session_state.current_question += 1
|
| 1153 |
+
st.rerun()
|
| 1154 |
+
else:
|
| 1155 |
+
st.warning("لطفاً پاسخ خود را مشخص کنید")
|
| 1156 |
+
else:
|
| 1157 |
+
# بررسی سوال توجه بین گروهها
|
| 1158 |
+
if 'attention_check' in current_group and st.session_state.current_group < len(question_groups) - 1:
|
| 1159 |
+
st.markdown("### سوال توجه")
|
| 1160 |
+
attention = st.radio(
|
| 1161 |
+
current_group['attention_check'],
|
| 1162 |
+
["کاملاً موافقم", "موافقم", "نظری ندارم", "مخالفم", "کاملاً مخالفم"],
|
| 1163 |
+
index=None
|
| 1164 |
+
)
|
| 1165 |
|
| 1166 |
+
if st.button("تأیید و ادامه", key="attention_btn"):
|
| 1167 |
+
if attention:
|
| 1168 |
+
st.session_state.current_group += 1
|
| 1169 |
+
st.session_state.current_question = 0
|
| 1170 |
+
st.rerun()
|
| 1171 |
+
else:
|
| 1172 |
+
st.warning("لطفاً به سوال توجه پاسخ دهید")
|
| 1173 |
else:
|
| 1174 |
+
# اتمام همه سوالات
|
| 1175 |
+
st.session_state.current_page = "explanation_questions"
|
| 1176 |
+
st.rerun()
|
| 1177 |
|
| 1178 |
def explanation_questions():
|
| 1179 |
"""سوالات درباره توضیحات قیمت"""
|
|
|
|
| 1378 |
st.balloons()
|
| 1379 |
|
| 1380 |
# ========== مدیریت وضعیت و صفحهبندی ==========
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1381 |
|
| 1382 |
+
def main():
|
| 1383 |
+
# مقداردهی اولیه session_state
|
| 1384 |
if 'current_page' not in st.session_state:
|
| 1385 |
st.session_state.current_page = "welcome"
|
| 1386 |
+
st.session_state.current_group = 0
|
| 1387 |
+
st.session_state.current_question = 0
|
| 1388 |
+
st.session_state.answers = {}
|
| 1389 |
st.session_state.scenario_type = random.choice(["control", "input", "counterfactual"])
|
| 1390 |
st.session_state.price = 200000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1391 |
|
| 1392 |
+
# تعریف صفحات
|
| 1393 |
pages = {
|
| 1394 |
"welcome": welcome_page,
|
| 1395 |
"scenario_explanation": scenario_explanation,
|
|
|
|
| 1403 |
}
|
| 1404 |
|
| 1405 |
# نمایش صفحه جاری
|
| 1406 |
+
try:
|
| 1407 |
+
current_page = pages.get(st.session_state.current_page, welcome_page)
|
| 1408 |
+
current_page()
|
| 1409 |
+
except Exception as e:
|
| 1410 |
+
st.error(f"خطای سیستمی: {str(e)}")
|
| 1411 |
+
st.session_state.current_page = "welcome"
|
| 1412 |
+
st.rerun()
|
| 1413 |
|
| 1414 |
if __name__ == "__main__":
|
| 1415 |
main()
|