فرهاد که به تازگی کتابفروشی آنلاین خود را باز کرده، تصمیم گرفته قابلیت تخفیف را به آن اضافه کند. ولی برای این کار نیاز به کمک شما دارد تا پروژه را طبق توضیحات ادامه تکمیل کنید.
## پروژه اولیه
پروژه اولیه را از [این لینک](/contest/assignments/51094/download_problem_initial_project/174129/) دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
```
Discount
├── accounts
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── authors
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── <mark class="yellow" title="اجازه ایجاد فایل جدیدی در این پوشه را دارید ولی به جز فایلهای مشخص شده اجازه تغییر سایر فایلها را ندارید">> books <</mark>
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── <mark class="blue" title="این فایل را تغییر دهید">> models.py <</mark>
│ ├── <mark class="blue" title="این فایل را تغییر دهید">> serializers.py <</mark>
│ ├── tests.py
│ ├── urls.py
│ └── <mark class="blue" title="این فایل را تغییر دهید">> views.py <</mark>
├── BookStore Quera.postman_collection.json
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── discounts
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── permissions.py
│ ├── serializers.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── fixtures
│ └── postman_sample_fixture.json
├── manage.py
├── requirements.txt
└── tests
├── __init__.py
└── testsample.py
```
### اپلیکشن `discounts`
اپلیکیشن `discounts` شامل مدلهای مختلفی میشود که کتاب میتواند براساس آن شامل تخفیف شود. در ادامه شرایط اعمال آنها را برای کتابها مشخص شده است.
<details class="green">
<summary> **مدل `CountryDiscount`** </summary>
اگر کشور کاربر با کشور مشخص شده در این تخفیف یکسان بود، تمامی کتابهای موجود شامل درصد تخفیف مشخص شده میشوند.
</details>
<details class="green">
<summary> **مدل `AuthorDiscount`** </summary>
تمامی کتابهایی که یکی از نویسندگان آن، نویسنده مشخص شده بود، شامل درصد تخفیف مشخص شده میشوند
</details>
<details class="green">
<summary> **مدل `CategoryDiscount`** </summary>
تمامی کتابهایی که یکی از دستهبندیهای آن، دستهبندی مشخص شده بود، شامل درصد تخفیف مشخص شده میشوند.
</details>
<details class="green">
<summary> **مدل `BookDiscount`** </summary>
در این تخیفیف تنها کتاب مشخص شده، شامل درصد تخفیف مشخص شده میشود.
</details>
## پیادهسازی مورد انتظار
**اکیدا توصیه میشود** پیش از حل این بخش سایر قسمتهای پروژه را مطالعه کنید.
<details class="yellow">
<summary> **تابع `get_discount` در `books/models.py`** </summary>
این تابع باید بهترین تخفیفی که شامل کتاب مورد نظر (`self`) میشود. را انتخاب و قیمت بعد از اعمال شدن آن تخفیف را خروجی دهد.
<details class="purple">
<summary> **نکات** </summary>
\* ممکن است چندین تخفیف مختلف را برای کتاب بتوان اعمال کرد. ولی فقط باید بهترین تخفیف بر روی آن، اعمال شود و در خروجی قیمت پس از اعمال تخفیف برگردانده شود.
\* دقت کنید ممکن است ریکوئست دریافتی از طرف کاربری که احراز هویت نشده فرستاده شود.
</details>
</details>
<details class="yellow">
<summary> **ویو `BookViewSet` در `books/views.py`** </summary>
شما باید با نوشتن سریالایزر یا سریالایزرهایی در `books/serializers.py` برای مدل `Book` و تکمیل ویو `BookViewSet` ریکوئستهایی مشابه نمونههای آورده شده در فایل *BookStore Quera.postman_collection.json* (این فایل را با اپلیکیشن **postman** باز کنید.) مدیریت کنید و پاسخ مشابهی دریافت کنید.
<details class="purple">
<summary> **نکات** </summary>
\* از فیکسچر *postman_sample_fixture.josn* برای ایجاد مثالهای موجود در کالکشن پستمن استفاده شده، در صورتی که مایل باشید میتوانید این فیکسچر را **load** کرده و ریکوئستها را مجدد اجرا کنید.
</details>
</details>
## نکات
+ شما تنها مجوز ایجاد تغییرات در فایلهای `books/views.py`، `books/models.py` و `books/serializers.py` و ایجاد فایل جدیدی در `books/` را دارید و **تمامی تغییرات دیگر شما** در فایلهای پروژه **نادیده گرفته خواهند شد.**
+ فراموش نکنید که میتوانید با مطالعهی `testsample.py` با روش تست کردن مدلها، فرمها و ادمینها آشنا شوید.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.