کوئرا تصمیم دارد تا برای کاربران فعال خود چالشی برگزار کند.
فرایند این چالش به این صورت است که هرروزه تعدادی مأموریت توسط کوئرا تعیین میشوند و کاربران با انجام دادن آنها، امتیاز و جایزه دریافت خواهند کرد. حال کوئرا برای پیادهسازی فرایند این چالش از شما میخواهد تا به کمکش بیایید.
# پروژهی اولیه
پروژهی اولیه را از [این لینک](/contest/assignments/71157/download_problem_initial_project/251415/) دانلود کنید. ساختار فایلهای این پروژه بهصورت زیر است.
```
quera_challenge/
├── manage.py
├── requirements.txt
├── app
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
│ ├── models
│ │ ├── __init__.py
│ │ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > award.py < </mark>
│ │ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > challenge.py < </mark>
│ │ └── <mark class="yellow" title="این فایل را تغییر دهید"> > user.py < </mark>
│ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > serializers.py< </mark>
│ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > signals.py < </mark>
│ ├── tests.py
│ ├── urls.py
│ └── <mark class="yellow" title="این فایل را تغییر دهید"> > views.py < </mark>
├── 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`
- **هدف**: این ویو مسئول ایجاد تراکنش چالش است و به کاربران احرازهویتشده اجازه میدهد تا یک یا چند مورد از یک چالش را انجام دهند.
- **فرایند**:
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` در سیگنال الزامیست.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.