سلام دوست عزیز😃👋

به مسابقه «المپیک فناوری: Python/Django» خوش آمدی!

لینک‌های مفید برای شرکت در مسابقه:

نوع داوری سوالات مسابقه:

  • جمع دو عدد: برای آشنایی با سیستم داوری
  • بی‌عملگر: ورودی/خروجی
  • دیوارهای شرکت:‌ ورودی/خروجی
  • کَش شرطی: پایتون
  • اخبار المپیک: پایتون
  • چالش کوئرا: جنگو

هرگونه ارتباط با سایر شرکت‌کنندگان و یا استفاده از ابزارهای تولید کد، مثل chatGPT و... در مسابقات کوئرا ممنوع است و بعد از شناسایی از لیست شرکت‌کنندگان مسابقه حذف می‌شوید.

در طول مسابقه، می‌توانید سؤالات خود را از قسمت «سوال بپرسید» مطرح کنید.

موفق باشید 😉✌

چالش کوئرا


کوئرا تصمیم دارد تا برای کاربران فعال خود چالشی برگزار کند. فرایند این چالش به این صورت است که هرروزه تعدادی مأموریت توسط کوئرا تعیین می‌شوند و کاربران با انجام دادن‌ آن‌ها، امتیاز و جایزه دریافت خواهند کرد. حال کوئرا برای پیاده‌سازی فرایند این چالش از شما می‌خواهد تا به کمکش بیایید.

پروژه‌ی اولیه🔗

پروژه‌ی اولیه را از این لینک دانلود کنید. ساختار فایل‌های این پروژه به‌صورت زیر است.

quera_challenge/
├── manage.py
├── requirements.txt
├── app
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   ├── __init__.py
│   │   └── 0001_initial.py
│   ├── models
│   │   ├── __init__.py
│   │   ├──  > award.py < 
│   │   ├──  > challenge.py < 
│   │   └──  > user.py < 
│   ├──  > serializers.py< 
│   ├──  > signals.py < 
│   ├── tests.py
│   ├── urls.py
│   └──  > views.py < 
├── prj
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py
│   └── auth.py
Plain text

پایگاه‌داده و مدل‌هایی که باید تکمیل شوند🔗

جایزه (Award)

  • نام (رشته name): نام جایزه
  • شرح (رشته description): توضیحاتی درباره جایزه

تراکنش جایزه (AwardTransaction)

  • جایزه (کلید خارجی به Award): جایزه مرتبط با تراکنش
  • کاربر (کلید خارجی به User): کاربر دریافت کننده جایزه
  • تاریخ ایجاد (تاریخ و زمان created_at): تاریخ و زمان ایجاد تراکنش

چالش (Challenge)

  • عنوان (رشته title): عنوان چالش
  • شرح (رشته description): توضیحات چالش
  • امتیاز (عدد صحیح point): امتیاز چالش
  • جایزه (کلید خارجی به Award): جایزه مرتبط با چالش

مورد چالش (ChallengeItem)

  • چالش (کلید خارجی به Challenge): چالش مرتبط با مورد
  • عنوان (رشته title): عنوان مورد چالش
  • شرح (رشته descritption): توضیحات مورد چالش
  • تاریخ نمایش ( تاریخ و زمان date_to_display): تاریخی که چالش باید به کاربران نمایش داده شود.

تراکنش چالش (ChallengeTransaction)

  • مورد چالش (کلید خارجی به ChallengeItem): مورد چالش مرتبط با تراکنش
  • تاریخ ایجاد (تاریخ و زمان created_at): تاریخ و زمان ایجاد تراکنش
  • تاریخ به‌روزرسانی (تاریخ و زمان updated_at): تاریخ و زمان به‌روزرسانی تراکنش
  • کاربر (کلید خارجی به User): کاربر انجام دهنده تراکنش

کاربر (User)

  • نام کاربری (رشته): نام کاربری کاربر
  • ایمیل (رشته): ایمیل کاربر
  • رمز عبور (رشته): رمز عبور کاربر
  • نام (رشته): نام کوچک کاربر
  • نام خانوادگی (رشته): نام خانوادگی کاربر
  • تاریخ تولد (تاریخ): تاریخ تولد کاربر
  • امتیاز کسب شده (عدد صحیح مثبت point_earned): امتیاز کسب شده توسط کاربر

توضیحات پیاده‌سازی پروژه🔗

۱. لیست چالش‌ها🔗

  • ویو: ChallengeListAPIView
  • هدف: این ویو به کاربران احرازهویت‌شده اجازه می‌دهد تا لیست تمام موارد چالش را مشاهده کنند.
  • نحوه‌ی استفاده: وقتی درخواست GET به اندپوینت مربوط به ChallengeListAPIView ارسال شود، لیستی از چالش‌ها بازگردانده می‌شود.
  • فیلد is_done: به‌طور داینامیک برای هر آیتم چالش تعیین می‌شود. اگر کاربر برای آیتم چالش خاصی، تراکنش داشته باشد، این فیلد True را نشان می‌دهد؛ در غیر این صورت، False است. این ویژگی به کاربران کمک می‌کند تا به‌راحتی ببینند کدام چالش‌ها را قبلاً تکمیل کرده‌اند و کدام‌ها را هنوز باید انجام دهند.
  • تاریخ نمایش jalali_date_to_display: تمامی چالش‌ها براساس این‌که مقدار date_to_display آن‌ها برابر تاریخ امروز باشد فیلتر و به کلاینت ارسال می‌شوند. و دقت کنید که این تاریخ با نام jalali_date_to_display به‌صورت شمسی و فرمت Y/m/d در دیتا قرار می‌گیرد. برای انجام اینکار حتما باید از کتابخانه jdatetime کمک بگیرید.

۲. ایجاد تراکنش چالش🔗

  • ویو: CreateChallengeTransactionView
  • هدف: این ویو مسئول ایجاد تراکنش چالش است و به کاربران احرازهویت‌شده اجازه می‌دهد تا یک یا چند مورد از یک چالش را انجام دهند.
  • فرایند:
    1. درخواست کاربر: کاربر درخواست POST با لیستی از challenge_item_ids در بدنه‌ی درخواست ارسال می‌کند. فرمت کلی دیتای ارسالی به‌صورت {"challenge_item_ids": []} است.
    2. اعتبارسنجی: بررسی می‌کند که آیا challenge_item_ids ارائه شده‌است یا خیر. اگر ارائه نشده باشد، پاسخ HTTP_400_BAD_REQUEST برمی‌گرداند.
    3. اعتبارسنجی: موارد ChallengeItem مربوط به IDهای ارائه‌شده را بازیابی می‌کند و اطمینان حاصل می‌کند که کاربر قبلاً در این چالش‌ها شرکت نکرده‌است.
    4. ایجاد تراکنش: برای هر مورد چالش معتبر، برای کاربر یک ChallengeTransaction ایجاد می‌شود.
    5. رسپانس: اگر تراکنش‌ها با موفقیت ایجاد شوند، پاسخ HTTP_201_CREATED بازگردانده می‌شود.

۳. مدیریت امتیاز و جوایز🔗

برنامه، پس از ذخیره شدن یک ChallengeTransaction بررسی می‌کند که آیا کاربر تمام موارد چالش مربوط به یک چالش خاص را تکمیل کرده‌است یا خیر. در صورتی که کاربر تمام موارد یک چالش را گذرانده باشد به وی جایزه و امتیازی که در آبجکت آن چالش تعیین شده، تعلق خواهد گرفت. اختصاص جایزه و امتیاز به این صورت است که یک AwardTransaction برای کاربر ایجاد می‌شود و امتیازهای کاربر به‌روزرسانی می‌شود.

نکته: استفاده از سیگنال در فرایند مدیریت امتیاز و اختصاص جوایز الزامی‌ست.

نکات مهم🔗

  • شما تنها مجوز ایجاد تغییرات در فایل‌های مدل‌ها، views.py، serializers.py و signals.py را دارید و تمامی تغییرات دیگر شما در فایل‌های پروژه نادیده گرفته خواهند شد.
  • ویو ChallengeListAPIView باید حداکثر دو کوئری به پایگاه داده ارسال کند.
  • سیستم احرازهویت در ویوها حتماً باید مبتنی بر توکن jwt باشد. در این خصوص بخش‌های مرتبط با تنظیمات و urlهای آن از قبل پیاده‌سازی شده‌است.
  • استفاده از سیگنال در فرایند مدیریت امتیاز و اختصاص جوایز الزامی‌ست.
  • برای اطمینان خاطر درباره‌ی فرایند تخصیص جوایز و امتیاز استفاده از transaction.atomic در سیگنال الزامی‌ست.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.