Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -738,25 +738,28 @@ h3 {
|
|
| 738 |
""", unsafe_allow_html=True)
|
| 739 |
|
| 740 |
# ========== توابع اصلی ==========
|
| 741 |
-
|
| 742 |
def enhanced_likert_scale(question_data):
|
| 743 |
-
"""لیکرت اسکیل با
|
| 744 |
question = question_data["question"]
|
| 745 |
key = question_data["key"]
|
| 746 |
scale = question_data["scale"]
|
| 747 |
-
labels = question_data.get("labels",
|
| 748 |
|
| 749 |
-
|
| 750 |
if key not in st.session_state:
|
| 751 |
-
st.session_state[key] =
|
| 752 |
-
|
| 753 |
# نمایش سوال
|
| 754 |
st.markdown(f"<div style='text-align:center; font-weight:bold; margin-bottom:15px;'>{question}</div>",
|
| 755 |
unsafe_allow_html=True)
|
| 756 |
-
|
| 757 |
# ایجاد خط و نقاط با HTML/CSS
|
| 758 |
scale_html = f"""
|
| 759 |
<style>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 760 |
.likert-line {{
|
| 761 |
width: 80%;
|
| 762 |
height: 2px;
|
|
@@ -765,43 +768,36 @@ def enhanced_likert_scale(question_data):
|
|
| 765 |
position: relative;
|
| 766 |
display: flex;
|
| 767 |
justify-content: space-between;
|
| 768 |
-
direction: rtl;
|
| 769 |
}}
|
| 770 |
.likert-dot {{
|
| 771 |
-
width: 18px;
|
| 772 |
-
height: 18px;
|
| 773 |
border-radius: 50%;
|
| 774 |
background: white;
|
| 775 |
border: 2px solid #6a0dad;
|
| 776 |
position: relative;
|
| 777 |
top: -9px;
|
| 778 |
-
cursor: pointer;
|
| 779 |
-
display: flex;
|
| 780 |
-
align-items: center;
|
| 781 |
-
justify-content: center;
|
| 782 |
}}
|
| 783 |
-
.likert-dot.
|
| 784 |
background: #6a0dad;
|
| 785 |
}}
|
| 786 |
.likert-labels {{
|
| 787 |
width: 80%;
|
| 788 |
-
margin: 5px auto
|
| 789 |
display: flex;
|
| 790 |
justify-content: space-between;
|
| 791 |
-
direction: rtl;
|
| 792 |
-
|
| 793 |
-
|
| 794 |
-
text-align: center;
|
| 795 |
-
margin-top: 10px;
|
| 796 |
-
color: #6a0dad;
|
| 797 |
font-weight: bold;
|
|
|
|
| 798 |
}}
|
| 799 |
-
|
| 800 |
-
|
| 801 |
-
|
| 802 |
-
|
| 803 |
-
|
| 804 |
-
margin: 2px; /* فاصله کم بین دکمهها */
|
| 805 |
}}
|
| 806 |
@media (max-width: 768px) {{
|
| 807 |
.likert-line {{
|
|
@@ -813,57 +809,42 @@ def enhanced_likert_scale(question_data):
|
|
| 813 |
}}
|
| 814 |
</style>
|
| 815 |
|
| 816 |
-
<div
|
| 817 |
-
<div class=
|
| 818 |
<span>{labels[1]}</span>
|
| 819 |
<span>{labels[0]}</span>
|
| 820 |
</div>
|
| 821 |
-
<div class=
|
| 822 |
"""
|
| 823 |
|
| 824 |
-
# اضافه کردن نقاط
|
| 825 |
-
|
| 826 |
-
|
| 827 |
-
|
| 828 |
-
|
| 829 |
-
|
| 830 |
-
scale_html += "</div>"
|
| 831 |
-
|
| 832 |
-
# نمایش مقدار انتخاب شده
|
| 833 |
-
if st.session_state.get(key):
|
| 834 |
-
scale_html += f"<div class='likert-value'>پاسخ شما: {st.session_state[key]}</div>"
|
| 835 |
|
| 836 |
-
scale_html += "</div>"
|
| 837 |
-
|
| 838 |
-
# تزریق JavaScript برای مدیریت کلیک
|
| 839 |
-
components.html(scale_html + """
|
| 840 |
-
<script>
|
| 841 |
-
function setLikertValue(value) {
|
| 842 |
-
const streamlitDoc = window.parent.document;
|
| 843 |
-
const buttons = streamlitDoc.querySelectorAll('button[data-testid="stButton"]'); // جستجوی دکمهها در DOM
|
| 844 |
-
buttons.forEach(btn => {
|
| 845 |
-
if (btn.textContent.trim() === String(value)) {
|
| 846 |
-
btn.click(); // کلیک روی دکمه مورد نظر برای انتخاب مقدار
|
| 847 |
-
}
|
| 848 |
-
});
|
| 849 |
-
}
|
| 850 |
-
</script>
|
| 851 |
-
""", height=80)
|
| 852 |
-
|
| 853 |
-
# دکمههای واقعی (مخفی و کوچک)
|
| 854 |
-
btn_cols = st.columns(scale)
|
| 855 |
-
for i in range(scale):
|
| 856 |
-
with btn_cols[i]:
|
| 857 |
-
value = scale - i
|
| 858 |
-
if st.button(
|
| 859 |
-
str(value),
|
| 860 |
-
key=f"{key}_btn_{value}",
|
| 861 |
-
type="primary" if st.session_state.get(key) == value else "secondary",
|
| 862 |
-
help="این دکمهها مخفی هستند" # پیام راهنما
|
| 863 |
-
):
|
| 864 |
-
st.session_state[key] = value
|
| 865 |
-
st.rerun()
|
| 866 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 867 |
return st.session_state.get(key)
|
| 868 |
|
| 869 |
def create_ride_map():
|
|
@@ -940,46 +921,6 @@ def show_explanation(exp_type):
|
|
| 940 |
for item in explanations.get(exp_type, []):
|
| 941 |
st.markdown(f"<p class='explanation-item'>• {item}</p>", unsafe_allow_html=True)
|
| 942 |
|
| 943 |
-
|
| 944 |
-
|
| 945 |
-
|
| 946 |
-
def create_likert_question(question, key, scale_type="5point"):
|
| 947 |
-
"""نمایش سوال لیکرت با اسلایدر نقطهای"""
|
| 948 |
-
left_label = "کاملاً مخالفم" if scale_type == "7point" else "کاملاً مخالفم"
|
| 949 |
-
right_label = "کاملاً موافقم" if scale_type == "7point" else "کاملاً موافقم"
|
| 950 |
-
|
| 951 |
-
st.markdown(f"<p style='font-size:16px; margin-bottom:5px;'>{question}</p>", unsafe_allow_html=True)
|
| 952 |
-
|
| 953 |
-
max_value = 7 if scale_type == "7point" else 5
|
| 954 |
-
|
| 955 |
-
# اضافه کردن attribute برای انتخاب استایل مناسب
|
| 956 |
-
slider_container = st.empty()
|
| 957 |
-
with slider_container:
|
| 958 |
-
st.markdown(f'<div data-testid="stSlider" data-discrete="{"seven-point" if scale_type=="7point" else "five-point"}">', unsafe_allow_html=True)
|
| 959 |
-
value = st.slider(
|
| 960 |
-
"",
|
| 961 |
-
min_value=1,
|
| 962 |
-
max_value=max_value,
|
| 963 |
-
value=(max_value+1)//2,
|
| 964 |
-
step=1,
|
| 965 |
-
key=f"slider_{key}"
|
| 966 |
-
)
|
| 967 |
-
st.markdown('</div>', unsafe_allow_html=True)
|
| 968 |
-
|
| 969 |
-
st.markdown(
|
| 970 |
-
f"""
|
| 971 |
-
<div class="slider-labels">
|
| 972 |
-
<span>{left_label}</span>
|
| 973 |
-
<span>{right_label}</span>
|
| 974 |
-
</div>
|
| 975 |
-
<p style='text-align:center; color:#6a0dad; font-weight:bold;'>
|
| 976 |
-
پاسخ شما: {value} ({'کاملاً مخالفم' if value==1 else 'کاملاً موافقم' if value==max_value else 'خنثی' if value==((max_value+1)//2) else 'موافقم' if value>((max_value+1)//2) else 'مخالفم'})
|
| 977 |
-
</p>
|
| 978 |
-
""",
|
| 979 |
-
unsafe_allow_html=True
|
| 980 |
-
)
|
| 981 |
-
return value
|
| 982 |
-
|
| 983 |
# ========== توابع مدیریت دادهها ==========
|
| 984 |
|
| 985 |
def get_credentials():
|
|
@@ -1119,7 +1060,7 @@ def scenario_explanation():
|
|
| 1119 |
<p> گوشیتان را از کیف درمیآورید. چشمتان به آیکون جدیدی میافتد؛ اپلیکیشنی به نام <strong>رهیار</strong> — نه اسنپ است و نه تپسی، اما خیلی شبیه آنهاست. رنگ بنفش جذابی دارد و شعارش توی ذهنتان مینشیند:
|
| 1120 |
<br>«همراه سفرهای شما، راهی مطمئن، راهی روشن، رهیار»</p>
|
| 1121 |
<p>با کنجکاوی اپ را باز میکنید. ظاهر ساده و روانی دارد. فعلاً فقط گزینهی «سفر معمولی» فعال است. خبری از امکانات اضافه مثل «سفر دومسیـره»، «توقف در مسیر»، «اکوپلاس» یا «موتورسوار» نیست — اما خب، رهیار تازهکار است و قرار است توسعه پیدا کند!.</p>
|
| 1122 |
-
<p>مبدأ و مقصد را انتخاب میکنید و با قیمت مواجه میشوید.</p>
|
| 1123 |
<p>با کلیک روی «ادامه»، اطلاعات سفر را مشاهده کنید 👇🏻</p>
|
| 1124 |
</div>
|
| 1125 |
""", unsafe_allow_html=True)
|
|
@@ -1245,7 +1186,7 @@ def random_likert_questions():
|
|
| 1245 |
"""نمایش سوالات لیکرت با دکمههای دایرهای"""
|
| 1246 |
question_groups = [
|
| 1247 |
{
|
| 1248 |
-
"title": "
|
| 1249 |
"key": "distributive",
|
| 1250 |
"questions": [
|
| 1251 |
{
|
|
@@ -1269,14 +1210,14 @@ def random_likert_questions():
|
|
| 1269 |
]
|
| 1270 |
},
|
| 1271 |
{
|
| 1272 |
-
"title": "سوال
|
| 1273 |
"key": "attention_check",
|
| 1274 |
"questions": [
|
| 1275 |
{"key": "attention_check2", "question": "تا چه مقدار با دقت به سوالات پاسخ میدهید؟", "scale": 7, "labels": ["خیلی کم", "خیلی زیاد"]}
|
| 1276 |
]
|
| 1277 |
},
|
| 1278 |
{
|
| 1279 |
-
"title": "
|
| 1280 |
"key": "procedural",
|
| 1281 |
"questions": [
|
| 1282 |
{"key": "procedural_1", "question": "فرآیند و رویه قیمتگذاری پلتفرم قابل قبول است", "scale": 7, "labels": ["کاملاً مخالفم", "کاملاً موافقم"]},
|
|
@@ -1285,7 +1226,7 @@ def random_likert_questions():
|
|
| 1285 |
]
|
| 1286 |
},
|
| 1287 |
{
|
| 1288 |
-
"title": "
|
| 1289 |
"key": "informational",
|
| 1290 |
"questions": [
|
| 1291 |
{"key": "informational_1", "question": "تا چه حد رهیار دلایل تعیین قیمت را به صورت صادقانه توضیح داد؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]},
|
|
@@ -1303,7 +1244,20 @@ def random_likert_questions():
|
|
| 1303 |
|
| 1304 |
current_group = question_groups[st.session_state.current_likert_group]
|
| 1305 |
|
| 1306 |
-
st.markdown(f"##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1307 |
|
| 1308 |
# نمایش تمام سوالات این گروه
|
| 1309 |
for question in current_group['questions']:
|
|
@@ -1311,18 +1265,23 @@ def random_likert_questions():
|
|
| 1311 |
st.session_state.answers[question["key"]] = answer
|
| 1312 |
|
| 1313 |
# دکمه ادامه/اتمام
|
| 1314 |
-
button_label = "ادامه
|
| 1315 |
|
| 1316 |
if st.button(button_label):
|
| 1317 |
-
# بررسی آیا همه سوالات این گروه پاسخ داده شدهاند
|
| 1318 |
all_answered = all(
|
| 1319 |
question["key"] in st.session_state.answers and
|
| 1320 |
st.session_state.answers[question["key"]] is not None
|
| 1321 |
for question in current_group['questions']
|
| 1322 |
)
|
| 1323 |
|
| 1324 |
-
|
| 1325 |
-
st.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1326 |
else:
|
| 1327 |
if st.session_state.current_likert_group < len(question_groups) - 1:
|
| 1328 |
st.session_state.current_likert_group += 1
|
|
@@ -1338,16 +1297,16 @@ def explanation_questions():
|
|
| 1338 |
# لیست سوالات به ترتیب نمایش
|
| 1339 |
questions = [
|
| 1340 |
{
|
| 1341 |
-
"key": "
|
| 1342 |
-
"label": "
|
| 1343 |
-
"options": ["بله", "خیر", "ن
|
| 1344 |
"required": True
|
| 1345 |
},
|
| 1346 |
{
|
| 1347 |
"key": "pricing_method",
|
| 1348 |
-
"label": "به نظر شما
|
| 1349 |
"options": [
|
| 1350 |
-
"به صورت دستی توسط تیم
|
| 1351 |
"به صورت خودکار توسط هوش مصنوعی و الگوریتمها",
|
| 1352 |
"ترکیبی از هر دو روش",
|
| 1353 |
"نظری ندارم"
|
|
@@ -1355,9 +1314,9 @@ def explanation_questions():
|
|
| 1355 |
"required": True
|
| 1356 |
},
|
| 1357 |
{
|
| 1358 |
-
"key": "
|
| 1359 |
-
"label": "
|
| 1360 |
-
"options": ["بله", "خیر", "
|
| 1361 |
"required": True
|
| 1362 |
},
|
| 1363 |
{
|
|
@@ -1370,8 +1329,8 @@ def explanation_questions():
|
|
| 1370 |
"key": "explanation_type",
|
| 1371 |
"label": "اگر توضیحی دریافت کردید، این توضیح بیشتر به کدام مورد شباهت داشت؟",
|
| 1372 |
"options": [
|
| 1373 |
-
"ب
|
| 1374 |
-
"
|
| 1375 |
"توضیحی دریافت نکردم"
|
| 1376 |
],
|
| 1377 |
"required": False,
|
|
@@ -1426,7 +1385,7 @@ def demographic_form():
|
|
| 1426 |
st.markdown("### 📝 اطلاعات دموگرافیک")
|
| 1427 |
st.markdown("""
|
| 1428 |
<div>
|
| 1429 |
-
<p>لطفاً اطلاعات زیر را صادقانه و
|
| 1430 |
<p>همانطور که گفته شد،این اطلاعات کاملاً محرمانه نزد محقق خواهد ماند و در جهت اهداف پژوهشی استفاده خواهد شد.</p>
|
| 1431 |
</div>
|
| 1432 |
""", unsafe_allow_html=True)
|
|
@@ -1518,7 +1477,7 @@ def thank_you_page():
|
|
| 1518 |
|
| 1519 |
در صورت وجود هرگونه سوال، ابهام یا پیشنهاد میتوانید با محقق تماس بگیرید:
|
| 1520 |
|
| 1521 |
-
✉
|
| 1522 |
""")
|
| 1523 |
st.balloons()
|
| 1524 |
|
|
|
|
| 738 |
""", unsafe_allow_html=True)
|
| 739 |
|
| 740 |
# ========== توابع اصلی ==========
|
|
|
|
| 741 |
def enhanced_likert_scale(question_data):
|
| 742 |
+
"""لیکرت اسکیل با محدوده 0 تا scale و عدم نمایش نقطه برای 0"""
|
| 743 |
question = question_data["question"]
|
| 744 |
key = question_data["key"]
|
| 745 |
scale = question_data["scale"]
|
| 746 |
+
labels = question_data.get("labels", ["کاملاً مخالفم", "کاملاً موافقم"])
|
| 747 |
|
| 748 |
+
# مقداردهی اولیه
|
| 749 |
if key not in st.session_state:
|
| 750 |
+
st.session_state[key] = 0
|
| 751 |
+
|
| 752 |
# نمایش سوال
|
| 753 |
st.markdown(f"<div style='text-align:center; font-weight:bold; margin-bottom:15px;'>{question}</div>",
|
| 754 |
unsafe_allow_html=True)
|
| 755 |
+
|
| 756 |
# ایجاد خط و نقاط با HTML/CSS
|
| 757 |
scale_html = f"""
|
| 758 |
<style>
|
| 759 |
+
@font-face {{
|
| 760 |
+
font-family: 'Vazir';
|
| 761 |
+
src: url('https://cdn.fontcdn.ir/Font/Persian/Vazir/Vazir-Bold.woff2') format('woff2');
|
| 762 |
+
}}
|
| 763 |
.likert-line {{
|
| 764 |
width: 80%;
|
| 765 |
height: 2px;
|
|
|
|
| 768 |
position: relative;
|
| 769 |
display: flex;
|
| 770 |
justify-content: space-between;
|
| 771 |
+
direction: rtl;
|
| 772 |
}}
|
| 773 |
.likert-dot {{
|
| 774 |
+
width: 18px;
|
| 775 |
+
height: 18px;
|
| 776 |
border-radius: 50%;
|
| 777 |
background: white;
|
| 778 |
border: 2px solid #6a0dad;
|
| 779 |
position: relative;
|
| 780 |
top: -9px;
|
|
|
|
|
|
|
|
|
|
|
|
|
| 781 |
}}
|
| 782 |
+
.likert-dot.active {{
|
| 783 |
background: #6a0dad;
|
| 784 |
}}
|
| 785 |
.likert-labels {{
|
| 786 |
width: 80%;
|
| 787 |
+
margin: 5px auto 15px;
|
| 788 |
display: flex;
|
| 789 |
justify-content: space-between;
|
| 790 |
+
direction: rtl;
|
| 791 |
+
font-size: 14px;
|
| 792 |
+
font-family: 'Vazir', sans-serif;
|
|
|
|
|
|
|
|
|
|
| 793 |
font-weight: bold;
|
| 794 |
+
color: #6a0dad;
|
| 795 |
}}
|
| 796 |
+
.separator-line {{
|
| 797 |
+
width: 80%;
|
| 798 |
+
height: 2px;
|
| 799 |
+
background: #6a0dad;
|
| 800 |
+
margin: 20px auto;
|
|
|
|
| 801 |
}}
|
| 802 |
@media (max-width: 768px) {{
|
| 803 |
.likert-line {{
|
|
|
|
| 809 |
}}
|
| 810 |
</style>
|
| 811 |
|
| 812 |
+
<div>
|
| 813 |
+
<div class="likert-labels">
|
| 814 |
<span>{labels[1]}</span>
|
| 815 |
<span>{labels[0]}</span>
|
| 816 |
</div>
|
| 817 |
+
<div class="likert-line">
|
| 818 |
"""
|
| 819 |
|
| 820 |
+
# اضافه کردن نقاط فقط برای مقادیر 1 تا scale
|
| 821 |
+
current_value = st.session_state.get(key, 0)
|
| 822 |
+
for i in range(1, scale+1):
|
| 823 |
+
value = scale-i+1 # مقادیر از 1 تا scale
|
| 824 |
+
active_class = "active" if current_value == value else ""
|
| 825 |
+
scale_html += f"<div class='likert-dot {active_class}'></div>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 826 |
|
| 827 |
+
scale_html += "</div></div>"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 828 |
|
| 829 |
+
# نمایش کامپوننت HTML
|
| 830 |
+
components.html(scale_html, height=60)
|
| 831 |
+
|
| 832 |
+
# ورودی عددی با محدوده 0 تا scale (0 قابل انتخاب است)
|
| 833 |
+
value = st.number_input(
|
| 834 |
+
"پاسخ شما (0 برای پاسخ ندادن، 1 تا 7 برای پاسخ):",
|
| 835 |
+
min_value=0, # 0 مجاز است
|
| 836 |
+
max_value=scale,
|
| 837 |
+
value=st.session_state.get(key, 0),
|
| 838 |
+
step=1,
|
| 839 |
+
key=f"{key}_input",
|
| 840 |
+
placeholder="0 (پاسخ نداده) یا 1-7",
|
| 841 |
+
format="%d",
|
| 842 |
+
on_change=lambda: st.session_state.update({key: st.session_state[f"{key}_input"]})
|
| 843 |
+
)
|
| 844 |
+
|
| 845 |
+
# خط جداکننده بنفش
|
| 846 |
+
st.markdown('<div class="separator-line"></div>', unsafe_allow_html=True)
|
| 847 |
+
|
| 848 |
return st.session_state.get(key)
|
| 849 |
|
| 850 |
def create_ride_map():
|
|
|
|
| 921 |
for item in explanations.get(exp_type, []):
|
| 922 |
st.markdown(f"<p class='explanation-item'>• {item}</p>", unsafe_allow_html=True)
|
| 923 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 924 |
# ========== توابع مدیریت دادهها ==========
|
| 925 |
|
| 926 |
def get_credentials():
|
|
|
|
| 1060 |
<p> گوشیتان را از کیف درمیآورید. چشمتان به آیکون جدیدی میافتد؛ اپلیکیشنی به نام <strong>رهیار</strong> — نه اسنپ است و نه تپسی، اما خیلی شبیه آنهاست. رنگ بنفش جذابی دارد و شعارش توی ذهنتان مینشیند:
|
| 1061 |
<br>«همراه سفرهای شما، راهی مطمئن، راهی روشن، رهیار»</p>
|
| 1062 |
<p>با کنجکاوی اپ را باز میکنید. ظاهر ساده و روانی دارد. فعلاً فقط گزینهی «سفر معمولی» فعال است. خبری از امکانات اضافه مثل «سفر دومسیـره»، «توقف در مسیر»، «اکوپلاس» یا «موتورسوار» نیست — اما خب، رهیار تازهکار است و قرار است توسعه پیدا کند!.</p>
|
| 1063 |
+
<p>مبدأ و مقصد را انتخاب میکنید و با قیمت <strong>200 هزار تومان</strong> مواجه میشوید.</p>
|
| 1064 |
<p>با کلیک روی «ادامه»، اطلاعات سفر را مشاهده کنید 👇🏻</p>
|
| 1065 |
</div>
|
| 1066 |
""", unsafe_allow_html=True)
|
|
|
|
| 1186 |
"""نمایش سوالات لیکرت با دکمههای دایرهای"""
|
| 1187 |
question_groups = [
|
| 1188 |
{
|
| 1189 |
+
"title": "سری اول سوالات",
|
| 1190 |
"key": "distributive",
|
| 1191 |
"questions": [
|
| 1192 |
{
|
|
|
|
| 1210 |
]
|
| 1211 |
},
|
| 1212 |
{
|
| 1213 |
+
"title": "سری دوم سوالات",
|
| 1214 |
"key": "attention_check",
|
| 1215 |
"questions": [
|
| 1216 |
{"key": "attention_check2", "question": "تا چه مقدار با دقت به سوالات پاسخ میدهید؟", "scale": 7, "labels": ["خیلی کم", "خیلی زیاد"]}
|
| 1217 |
]
|
| 1218 |
},
|
| 1219 |
{
|
| 1220 |
+
"title": "سری سوم سوالات",
|
| 1221 |
"key": "procedural",
|
| 1222 |
"questions": [
|
| 1223 |
{"key": "procedural_1", "question": "فرآیند و رویه قیمتگذاری پلتفرم قابل قبول است", "scale": 7, "labels": ["کاملاً مخالفم", "کاملاً موافقم"]},
|
|
|
|
| 1226 |
]
|
| 1227 |
},
|
| 1228 |
{
|
| 1229 |
+
"title": "سری چهارم سوالات",
|
| 1230 |
"key": "informational",
|
| 1231 |
"questions": [
|
| 1232 |
{"key": "informational_1", "question": "تا چه حد رهیار دلایل تعیین قیمت را به صورت صادقانه توضیح داد؟", "scale": 7, "labels": ["هیچ", "خیلی زیاد"]},
|
|
|
|
| 1244 |
|
| 1245 |
current_group = question_groups[st.session_state.current_likert_group]
|
| 1246 |
|
| 1247 |
+
st.markdown(f"## {current_group['title']}")
|
| 1248 |
+
st.markdown("""
|
| 1249 |
+
<div class="guide-text" style="display: flex; flex-direction: column; align-items: center; background-color: #f0f2f6; border-radius: 10px; padding: 20px; gap: 15px;">
|
| 1250 |
+
<div style="flex: 1;">
|
| 1251 |
+
<h3>راهنمای پاسخ:</h3>
|
| 1252 |
+
<p>برای پاسخ به سوالات، با با هفت نقطه بین دو سر طیف مواجه خواهید شد.</p>
|
| 1253 |
+
<br>- سمت چپ: کمترین مقدار
|
| 1254 |
+
<br>- سمت راست: بیشترین مقدار
|
| 1255 |
+
</p>
|
| 1256 |
+
<p>زیر طیف جعبهای وجود دارد که مقدار پیشفرض آن صفر است. با زدن دکمه مثبت ومنفی کنار جعبه، این عدد را بین یک تا هفت تنظیم کنید تا میزان موافقت خود با جملات یا نزدیکی به دو سر طیف را انتخاب کنید.</p>
|
| 1257 |
+
<p>اگر از پاسخهایتان مطمئن هستید، روی دکمه «ادامه» کلیک کنید.</p>
|
| 1258 |
+
</div>
|
| 1259 |
+
</div>
|
| 1260 |
+
""", unsafe_allow_html=True)
|
| 1261 |
|
| 1262 |
# نمایش تمام سوالات این گروه
|
| 1263 |
for question in current_group['questions']:
|
|
|
|
| 1265 |
st.session_state.answers[question["key"]] = answer
|
| 1266 |
|
| 1267 |
# دکمه ادامه/اتمام
|
| 1268 |
+
button_label = "ادامه" if st.session_state.current_likert_group < len(question_groups)-1 else "ادامه"
|
| 1269 |
|
| 1270 |
if st.button(button_label):
|
| 1271 |
+
# بررسی آیا همه سوالات این گروه پاسخ داده شدهاند و هیچ کدام صفر نیستند
|
| 1272 |
all_answered = all(
|
| 1273 |
question["key"] in st.session_state.answers and
|
| 1274 |
st.session_state.answers[question["key"]] is not None
|
| 1275 |
for question in current_group['questions']
|
| 1276 |
)
|
| 1277 |
|
| 1278 |
+
has_zero = any(
|
| 1279 |
+
st.session_state.answers.get(question["key"]) == 0
|
| 1280 |
+
for question in current_group['questions']
|
| 1281 |
+
)
|
| 1282 |
+
|
| 1283 |
+
if not all_answered or has_zero:
|
| 1284 |
+
st.error("لطفاً به تمام سوالات این بخش پاسخ دهید")
|
| 1285 |
else:
|
| 1286 |
if st.session_state.current_likert_group < len(question_groups) - 1:
|
| 1287 |
st.session_state.current_likert_group += 1
|
|
|
|
| 1297 |
# لیست سوالات به ترتیب نمایش
|
| 1298 |
questions = [
|
| 1299 |
{
|
| 1300 |
+
"key": "price_increase",
|
| 1301 |
+
"label": "در سناریوی کیس رهیار، آ��ا به نظر شما قیمت ارائهشده برای مسیر موردنظر، در مقایسه با قیمتهای معمول برای همان مسیر یا مسیرهای مشابه، افزایش غیرمعمول یا نامتعارفی داشته است یا خیر؟ (با صرفنظر از تغییرات قیمتی ناشی از تورم یا نوسانات عمومی قیمت)",
|
| 1302 |
+
"options": ["بله", "خیر", "مطمئن نیستم"],
|
| 1303 |
"required": True
|
| 1304 |
},
|
| 1305 |
{
|
| 1306 |
"key": "pricing_method",
|
| 1307 |
+
"label": "به نظر شما رهیار چگونه قیمتهای پویا و متغیر را اعمال میکند؟",
|
| 1308 |
"options": [
|
| 1309 |
+
"به صورت دستی توسط تیم رهیار",
|
| 1310 |
"به صورت خودکار توسط هوش مصنوعی و الگوریتمها",
|
| 1311 |
"ترکیبی از هر دو روش",
|
| 1312 |
"نظری ندارم"
|
|
|
|
| 1314 |
"required": True
|
| 1315 |
},
|
| 1316 |
{
|
| 1317 |
+
"key": "trust",
|
| 1318 |
+
"label": "در زندگی روزمره ممکن است با تصمیمات هوش مصنوعی مواجه شوید، مانند پیشنهاد مسیر برای اجتناب از ترافیک، ارائه دستور پخت بر اساس مواد غذایی، توصیه پوشش یا نکات ارائه برای جلسات کاری، پیشنهاد سهام برای سرمایهگذاری، یا معرفی افراد در برنامههای دوستیابی. فارغ از تصمیمات حیاتی (مثل تشخیص پزشکی یا احکام قضایی)، آیا به تصمیمگیریهای هوش مصنوعی در این موارد روزمره اعتماد دارید؟",
|
| 1319 |
+
"options": ["بله", "تا حدودی", "خیر", "نظری ندارم"],
|
| 1320 |
"required": True
|
| 1321 |
},
|
| 1322 |
{
|
|
|
|
| 1329 |
"key": "explanation_type",
|
| 1330 |
"label": "اگر توضیحی دریافت کردید، این توضیح بیشتر به کدام مورد شباهت داشت؟",
|
| 1331 |
"options": [
|
| 1332 |
+
"با توجه به عوامل مؤثر در تعیین قیمت و شدت تأثیر آنها",
|
| 1333 |
+
"به من اطلاع دادند که در صورت انتظار و درخواست سفر در شرایط متفاوتِ زمانی دیگر، ممکن است قیمت دیگری دریافت کنم",
|
| 1334 |
"توضیحی دریافت نکردم"
|
| 1335 |
],
|
| 1336 |
"required": False,
|
|
|
|
| 1385 |
st.markdown("### 📝 اطلاعات دموگرافیک")
|
| 1386 |
st.markdown("""
|
| 1387 |
<div>
|
| 1388 |
+
<p>لطفاً اطلاعات زیر را صادقانه وارد نمایید.</p>
|
| 1389 |
<p>همانطور که گفته شد،این اطلاعات کاملاً محرمانه نزد محقق خواهد ماند و در جهت اهداف پژوهشی استفاده خواهد شد.</p>
|
| 1390 |
</div>
|
| 1391 |
""", unsafe_allow_html=True)
|
|
|
|
| 1477 |
|
| 1478 |
در صورت وجود هرگونه سوال، ابهام یا پیشنهاد میتوانید با محقق تماس بگیرید:
|
| 1479 |
|
| 1480 |
+
✉ایمیل: maryam.ilka2000@gmail.com
|
| 1481 |
""")
|
| 1482 |
st.balloons()
|
| 1483 |
|