### کارها:
* نوشتن Manager
* نوشتن ModelForm
* نوشتن view محاسبه قیمت نهایی سفارش
می خواهیم یک سایت خرید اینترنتی محصولات مختلف بزنیم.
در این سایت کاربران می توانند محصولات مختلف را مشاهده کرده و پس از انتخاب چند محصول فاکتور نهایی خرید خود را بینند.
بخشی از این پروژه نوشته شده است. از شما میخواهیم این پروژه را تکمیل کنید.
# پروژه اولیه
پروژه اولیه را از [اینجا](http://s9.picofile.com/file/8339632626/shop_initial.zip.html) دانلود کنید. ساختار این پروژه به شرح زیر است:
```
shop
├── app
│ ├── migrations
│ │ ├── __init__.py
│ │ └── 0001_initial.py
| ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── urls.py
│ └── views.py
| └── forms.py
├── Shop
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
└── requirements.txt
```
# جزئیات
در این سؤال تنها لازم است تغییراتی در `app/views.py` و `app/models.py` و `app/forms.py` ایجاد کنید.
در فایل `models.py` چهار مدل به شرح زیر وجود دارد:
۱. مدل `Category` شامل فیلدهای زیر:
* نام : `name`
۲. مدل `Product` شامل فیلدهای زیر:
* نام محصول : `name`
* دسته محصول : `category`
* توضیحات : `description`
* قیمت محصول : `price`
* موجودی انبار : `stock`
۳. مدل `Order` شامل فیلدهای زیر:
* ایمیل سفارش دهنده : `email`
* آدرس سفارش دهنده : `address`
۴. مدل `OrderItem` شامل فیلدهای زیر:
* سفارش مربوطه : `order`
* محصول سفارش داده شده : `product`
* تعداد : `quantity`
مواردی که باید انجام دهید:
### ۱.نوشتن منیجر
یک منیجر جدید به نام `available` برای مدل `Product` بنویسید به طوری که فقط کالاهایی را که در انبار موجودند برگرداند.
##### توجه
منیجر (objects) باید همانند سابق منیجر پیش فرض باقی بماند.
```
>>> Product.objects.all()
<QuerySet [<Product: pc>, <Product: mouse>, ...]>
>>> Product.available.all()
<QuerySet [<Product: pc>, ...]>
>>> Product.available.filter(price__gt=20)
<QuerySet [<Product: pc>, <Product: keyboard>, ...>
```
### ۲.نوشتن فرم
در این قسمت باید یک مدل فرم برای مدل `Product` بنویسید. برای این کار، فایل `apps/forms.py` دارای یک کلاس `ProductForm` است که باید آن را پیادهسازی کنید. کالاهایی که به وسیلهی این فرم ساخته میشوند باید ویژگیهای زیر را دارا باشند:
* قیمت کالا از 1000 نباید بیشتر باید. در صورت بیشتر بود این قیمت از 1000، باید یک `ValidationError` با پیام `Product is too expensive` پرتاب شود.
* طول توضیحات کالا باید از 20 کاراکتر بیشتر باشد. در صورتی که این طول کمتر یا مساوی 20 باشد، باید یک `ValidationError` با پیام `Product must have a good description` پرتاب شود.
### ۳.نمایش قیمت نهایی یک `order`
در این قسمت باید view محاسبه قیمت نهایی `order` را (`checkout`) طوری تغییر دهید که قیمت نهایی یک `order` مشخص (`int:pk`) را به صورت یک خروجی JSON به شکل زیر برگرداند.
```json
{"total_price": "12.31"}
```
##### توجه
+ این مقدار از نوع `Decimal` می باشد و باید تا دو رقم اعشار مقدار آن حفظ شود.
+ نیازی به تغییر stock پس از checkout نمی باشد و تضمین می شود که در تست ها تعداد کالای سفارش داده شده برابر و یا کمتر از موجودی کالا باشد.
+ اگر فاکتوری با ID مورد نظر موجود نبود خطای `404` برگردانید.
# نکات
+ شما تنها مجاز به تغییر در `app/views.py` و `app/models.py` و `app/forms.py` هستید.
اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد.
+ پس از اعمال تغییرات، کل پروژه را Zip کرده و ارسال کنید.
+ نام فایل Zip اهمیت ندارد.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.