Skip to content

إدارة المستخدمين

إدارة الموسِّمين في Potato عبر قوائم الوصول في user_config، وتسجيل الدخول المباشر عبر URL، وأدوار RBAC وصلاحياته، وحصص العمل لكل موسِّم، ومراحل التدريب.

يحسم Potato ثلاثة أمور منفصلة بشأن كل شخص: هل يحق له التسجيل، وما المسموح له فعله بعد الدخول، وما مقدار العمل الذي يُسند إليه. لكل أمر منها كتلة إعدادات مختلفة، والخلط بينها هو السبب المعتاد لموسِّم يستطيع تسجيل الدخول لكنه لا يتلقى أي عنصر.

أنماط الوصول

الوصول المفتوح

يسمح Potato بالتسجيل الذاتي افتراضيًا، فينشئ الموسِّم الجديد حسابه بنفسه من صفحة تسجيل الدخول:

yaml
user_config:
  allow_all_users: true

الوصول المقيد

اضبط allow_all_users: false وأدرج العناوين المسموح لها بالتسجيل. لا يستطيع أحد غيرها إنشاء حساب:

yaml
user_config:
  allow_all_users: false
  users:
    - alice@example.com
    - bob@example.com
    - researcher@university.edu

يقع المفتاحان كلاهما تحت user_config. وإذا كُتبا في المستوى الأعلى فإنهما يُتجاهَلان دون أي تنبيه، فتبدو قائمة الوصول موجودة وهي لا تفعل شيئًا.

المصادقة

تسجيل الدخول بكلمة مرور

هذا هو الخيار الافتراضي. يسجل الموسِّمون ببريد إلكتروني وكلمة مرور، ويخزّنها Potato في صورة تجزئة PBKDF2 مملّحة بملح خاص بكل مستخدم.

yaml
login:
  type: password

تسجيل الدخول المباشر بوسيط في URL

يأخذ url_direct اسم المستخدم مباشرة من معامل في URL ولا يطلب كلمة مرور، وهكذا يُتعامل مع المشاركين القادمين من منصات التعهيد الجماعي:

yaml
login:
  type: url_direct
  url_argument: PROLIFIC_PID

يصل الموسِّمون عندئذ إلى http://your-server:8000/?PROLIFIC_PID=abc123 ويُسجَّل دخولهم باسم abc123.

يقبل url_argument أيضًا قائمة، وفي هذه الحالة يُسمّى مجلد مخرجات الموسِّم بضم القيم معًا:

yaml
login:
  type: url_direct
  url_argument:
    - PROLIFIC_PID
    - STUDY_ID
    - SESSION_ID

أنواع تسجيل الدخول الثلاثة هي password وurl_direct وprolific، ويضيف الأخير تكاملًا مع واجهة Prolific البرمجية فوق تسجيل الدخول المباشر عبر URL. راجع تكامل التعهيد الجماعي للجانب الخاص بالمنصة.

تعطيل كلمة المرور أو نموذج تسجيل الدخول

يسجّل كل موسِّم دخوله باسم مستخدم، لأن Potato يحفظ تسميات كل موسِّم في مجلد يحمل اسمه داخل output_annotation_dir. لا يوجد إعداد يُلغي هذه الخطوة. يُسقط إعدادان كلمة المرور منها، والثاني يُلغي النموذج أيضًا.

عند ضبط require_password: false في المستوى الأعلى من الإعدادات، لا يطلب نموذج تسجيل الدخول إلا اسم المستخدم. يسجّل Potato في الحال أي اسم لم يره من قبل، ويعيد الاسم الذي رآه إلى عمل ذلك الموسِّم:

yaml
require_password: false

لذلك فإن من يكتب اسم مستخدم موجودًا يواصل جلسة ذلك الموسِّم، فلا تعطّل كلمة المرور إلا حين يثق الموسِّمون ببعضهم أو يكون رابط المهمة خاصًا. تظل قائمة المستخدمين سارية في هذا الوضع، ومع user_config.allow_all_users: false يُرفض أي اسم غير موجود في users. ولإلغاء النموذج أيضًا، استخدم تسجيل الدخول url_direct وأرسل إلى كل موسِّم رابطًا يحمل اسم المستخدم الخاص به. تسرد صفحة تسجيل الدخول بدون كلمة مرور واجهات المصادقة الخلفية التي تعمل بدون كلمة مرور.

الأدوار والصلاحيات

مفتاح الإدارة المشترك

admin_api_key مفتاح واحد مشترك يُرسل في الترويسة X-API-Key، ويتجاوز كل فحوص الصلاحيات. وإذا لم يُضبط، يولّد Potato مفتاحًا ويكتبه في {task_dir}/admin_api_key.txt.

yaml
admin_api_key: "your-shared-key"

التحكم في الوصول القائم على الأدوار

مع كتلة rbac، يصل أشخاص محددون بالاسم إلى لوحة الإدارة بتسجيل الدخول المعتاد، دون أن يحملوا المفتاح المشترك:

yaml
rbac:
  enabled: true
 
  # Custom roles, merged over the built-in ones
  roles:
    lead: [view_admin_dashboard, export_data, annotate]
 
  # Assign roles to specific users
  user_role_assignments:
    carol@example.com: admin
    dave@example.com: lead
 
  # Map an SSO claim to a role
  sso_role_mapping:
    "org:my-github-org": adjudicator

الصلاحيات هي view_admin_dashboard وmanage_assignment وadjudicate وexport_data وannotate. يملك الدور المدمج admin الخمس كلها، ويملك adjudicator كلًا من adjudicate وexport_data وannotate، ويملك annotator الصلاحية annotate.

صلاحيات المستخدم هي اتحاد صلاحيات كل الأدوار التي يحملها. وفي غياب كتلة rbac تمامًا، لا يمنح وصولًا مرتفعًا سوى المفتاح المشترك وقائمة adjudication.adjudicator_users، وبهذا تظل المشاريع المكتوبة قبل RBAC تعمل.

عبء العمل

الحد الأقصى لكل موسِّم

يضبط max_annotations_per_user رقمًا واحدًا للجميع:

yaml
max_annotations_per_user: 100

ويضبط per_annotator_quota أرقامًا مختلفة لأشخاص مختلفين. يقبل default وby_user وby_user_role، ويرفض أي مفتاح فرعي آخر عند التحميل بدلًا من تجاهله:

yaml
per_annotator_quota:
  default: 50
  by_user:
    alice@example.com: 200
  by_user_role:
    expert: 150
    novice: 40

يُحدَّد الحد بالرجوع أولًا إلى by_user، ثم إلى by_user_role، ثم إلى default. وتأتي تسميات الأدوار من user_roles:

yaml
user_roles:
  alice@example.com: expert
  bob@example.com: novice

التسمية هنا تسمية لعبء العمل فقط، ولا تمنح صلاحيات إلا إذا كانت تسمّي أيضًا دورًا في rbac.roles. لذلك يبقى expert وnovice مجرد تسميات للحصص لا أكثر.

عدد الموسِّمين لكل عنصر

يحدد num_annotators_per_item عدد الأشخاص الذين يرون كل عنصر، وهذا ما يقرر إن كان بإمكانك الإبلاغ عن الاتفاق في النهاية:

yaml
num_annotators_per_item: 3
min_annotators_per_instance: 2

max_annotations_per_item اسم بديل مهمل للحد نفسه. وإذا ضُبط الاثنان على قيمتين مختلفتين، تُرفض الإعدادات عند التحميل بدلًا من حسم التعارض دون تنبيه.

استراتيجية الإسناد

yaml
assignment_strategy: random
random_seed: 1234

الاستراتيجيات هي random وfixed_order وleast_annotated وmax_diversity وdiversity_clustering وcategory_based وbatch وpriority وmodel_review وllm_confidence وpsychometric وactive_learning. القيمة الافتراضية لـ random_seed هي 1234، لذا ثبّتها حين يجب أن يكون التشغيل قابلًا لإعادة الإنتاج. راجع إسناد المهام لمعرفة ما تفعله كل استراتيجية.

تأهيل الموسِّمين

تعرض مرحلة التدريب على الموسِّمين عناصر تدريبية معروفة الإجابات قبل المهمة الفعلية، ويقرر passing_criteria من يواصل:

yaml
training:
  enabled: true
  data_file: data/training.json
  passing_criteria:
    min_correct: 8
    max_mistakes: 2
    max_mistakes_per_question: 1
  allow_retry: true
  failure_action: block

راجع مرحلة التدريب لصيغة العناصر وخيارات التغذية الراجعة.

فحص الانتباه أثناء المهمة

يصفّي التدريب الأشخاص في البداية، أما فحوص الانتباه فتواصل القياس بعد أن يبدأ العمل الفعلي:

yaml
attention_checks:
  enabled: true
  items_file: data/attention_checks.json
  frequency: 10
  min_response_time: 3.0
  failure_handling:
    warn_threshold: 2
    warn_message: "Please read items carefully before answering."
    block_threshold: 5
    block_message: "You have been blocked due to too many incorrect responses."

راجع ضبط الجودة للمعايير الذهبية وتقارير الاتفاق.

الجلسات

yaml
secret_key: "a-long-random-string"
session_timeout_minutes: 60
persist_sessions: true
session_lifetime_days: 7

يوقّع secret_key ملف تعريف الارتباط الخاص بالجلسة، ويمكن أن يأتي بدلًا من ذلك من متغير البيئة POTATO_SECRET_KEY. ومن دونه يولّد Potato مفتاحًا جديدًا عند كل تشغيل، فيُسجَّل خروج الجميع مع كل إعادة تشغيل.

يمسح session_timeout_minutes الجلسة التي بقيت خاملة هذه المدة، ويبدأ العدّ من جديد مع كل طلب. وPotato 2.11 هو أول إصدار يطبّقه فعليًا، بقيمة افتراضية قدرها 480 دقيقة. وعند 60، كما في هذا المثال، يتعيّن على المعلّق الذي يبتعد ساعة أن يسجّل الدخول من جديد حين يعود.

مثال: إعداد لفريق بحثي

yaml
annotation_task_name: "Sentiment Annotation"
task_dir: .
 
user_config:
  allow_all_users: false
  users:
    - researcher1@university.edu
    - researcher2@university.edu
    - student1@university.edu
    - student2@university.edu
 
rbac:
  enabled: true
  user_role_assignments:
    researcher1@university.edu: admin
 
user_roles:
  researcher1@university.edu: expert
  student1@university.edu: novice
 
per_annotator_quota:
  default: 200
  by_user_role:
    expert: 300
    novice: 120
 
num_annotators_per_item: 2
assignment_strategy: least_annotated
 
data_files:
  - data/main.json
 
item_properties:
  id_key: id
  text_key: text
 
annotation_schemes:
  - annotation_type: radio
    name: sentiment
    description: "What is the sentiment of this text?"
    labels:
      - Positive
      - Negative
      - Neutral
    sequential_key_binding: true
 
output_annotation_dir: annotation_output/

مثال: إعداد للتعهيد الجماعي

yaml
annotation_task_name: "Sentiment Annotation Study"
task_dir: .
 
login:
  type: url_direct
  url_argument: PROLIFIC_PID
 
completion_code: "POTATO2024"
 
user_config:
  allow_all_users: true
 
max_annotations_per_user: 50
num_annotators_per_item: 3
assignment_strategy: random
 
hide_navbar: true
jumping_to_id_disabled: true
 
attention_checks:
  enabled: true
  items_file: data/attention_checks.json
  frequency: 10
  failure_handling:
    warn_threshold: 2
    block_threshold: 5
 
data_files:
  - data/main.json
 
item_properties:
  id_key: id
  text_key: text
 
output_annotation_dir: annotation_output/

قراءات إضافية

لتفاصيل التنفيذ، راجع الوثائق المصدرية ومرجع الأدوار والصلاحيات.