میخواهیم یک سایت خرید اینترنتی محصولات مختلف بزنیم. در این سایت کاربران میتوانند محصولات مختلف را مشاهده کرده و پس از انتخاب چند محصول فاکتور نهایی خرید خود را بینند.
بخشی از این پروژه نوشته شده است. از شما میخواهیم این پروژه را تکمیل کنید.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار این پروژه به شرح زیر است:
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 اهمیتی ندارد.
ارسال پاسخ برای این سؤال