میخواهیم یک سایت خرید اینترنتی محصولات مختلف بزنیم. در این سایت کاربران میتوانند محصولات مختلف را مشاهده کرده و پس از انتخاب چند محصول فاکتور نهایی خرید خود را بینند.
بخشی از این پروژه نوشته شده است. از شما میخواهیم این پروژه را تکمیل کنید.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:
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
جزئیات
در فایل models.py چهار مدل به شرح زیر وجود دارد:
۱. مدل Category
Categoryاین مدل شامل فیلد زیر است:
- نام :
name
۲. مدل Product
Productاین مدل شامل فیلدهای زیر است:
- نام محصول :
name - دسته محصول :
category - توضیحات :
description - قیمت محصول :
price - موجودی انبار :
stock
۳. مدل Order
Orderاین مدل شامل فیلدهای زیر است:
- ایمیل سفارشدهنده :
email - آدرس سفارشدهنده :
address
۴. مدل OrderItem
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
orderدر این قسمت باید view محاسبه قیمت نهایی order را (checkout) طوری تغییر دهید که قیمت نهایی یک order مشخص (int:pk) را به صورت یک خروجی JSON به شکل زیر برگرداند.
{"total_price": "12.31"}
- این مقدار از نوع
Decimalمی باشد و باید تا دو رقم اعشار مقدار آن حفظ شود. - نیازی به تغییر stock پس از checkout نمیباشد و تضمین میشود که در تستها تعداد کالای سفارشداده شده برابر و یا کمتر از موجودی کالا باشد.
- اگر فاکتوری با ID مورد نظر موجود نبود، خطایی با استاتوسکد
404برگردانید.
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- شما تنها مجاز به تغییر در
app/views.py،app/models.pyوapp/forms.pyهستید. اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد. - فراموش نکنید که میتوانید با مطالعهی
testsample.pyبا روش تست کردن آشنا شوید.
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال