کوئرا تصمیم دارد تا برای کاربران فعال خود چالشی برگزار کند. فرایند این چالش به این صورت است که هرروزه تعدادی مأموریت توسط کوئرا تعیین میشوند و کاربران با انجام دادن آنها، امتیاز و جایزه دریافت خواهند کرد. حال کوئرا برای پیادهسازی فرایند این چالش از شما میخواهد تا به کمکش بیایید.
پروژهی اولیه
پروژهی اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه بهصورت زیر است.
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
پایگاهداده و مدلهایی که باید تکمیل شوند
جایزه (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
- هدف: این ویو مسئول ایجاد تراکنش چالش است و به کاربران احرازهویتشده اجازه میدهد تا یک یا چند مورد از یک چالش را انجام دهند.
- فرایند:
- درخواست کاربر: کاربر درخواست POST با لیستی از
challenge_item_ids
در بدنهی درخواست ارسال میکند. فرمت کلی دیتای ارسالی بهصورت{"challenge_item_ids": []}
است. - اعتبارسنجی: بررسی میکند که آیا
challenge_item_ids
ارائه شدهاست یا خیر. اگر ارائه نشده باشد، پاسخHTTP_400_BAD_REQUEST
برمیگرداند. - اعتبارسنجی: موارد
ChallengeItem
مربوط بهID
های ارائهشده را بازیابی میکند و اطمینان حاصل میکند که کاربر قبلاً در این چالشها شرکت نکردهاست. - ایجاد تراکنش: برای هر مورد چالش معتبر، برای کاربر یک
ChallengeTransaction
ایجاد میشود. - رسپانس: اگر تراکنشها با موفقیت ایجاد شوند، پاسخ
HTTP_201_CREATED
بازگردانده میشود.
- درخواست کاربر: کاربر درخواست POST با لیستی از
۳. مدیریت امتیاز و جوایز
برنامه، پس از ذخیره شدن یک ChallengeTransaction
بررسی میکند که آیا کاربر تمام موارد چالش مربوط به یک چالش خاص را تکمیل کردهاست یا خیر. در صورتی که کاربر تمام موارد یک چالش را گذرانده باشد به وی جایزه و امتیازی که در آبجکت آن چالش تعیین شده، تعلق خواهد گرفت.
اختصاص جایزه و امتیاز به این صورت است که یک AwardTransaction
برای کاربر ایجاد میشود و امتیازهای کاربر بهروزرسانی میشود.
نکته: استفاده از سیگنال در فرایند مدیریت امتیاز و اختصاص جوایز الزامیست.
نکات مهم
- شما تنها مجوز ایجاد تغییرات در فایلهای مدلها،
views.py
،serializers.py
وsignals.py
را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد. - ویو
ChallengeListAPIView
باید حداکثر دو کوئری به پایگاه داده ارسال کند. - سیستم احرازهویت در ویوها حتماً باید مبتنی بر توکن jwt باشد. در این خصوص بخشهای مرتبط با تنظیمات و
url
های آن از قبل پیادهسازی شدهاست. - استفاده از سیگنال در فرایند مدیریت امتیاز و اختصاص جوایز الزامیست.
- برای اطمینان خاطر دربارهی فرایند تخصیص جوایز و امتیاز استفاده از
transaction.atomic
در سیگنال الزامیست.
ارسال پاسخ برای این سؤال