میخواهیم یک سایت برای خودکار کردن فرایند فروش بلیتهای سینما بنویسیم. در این سایت امکان مشاهده فیلمهای در حال اکران وجود دارد. کاربران میتوانند عضو سایت شوند و پس از ورود به سایت برای هر فیلم صندلی موردنظر را رزرو کند.
بخشی از این پروژه نوشته شده است. از شما میخواهیم این پروژه را تکمیل کنید.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است.
Cinema
├── app
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── app
│ │ ├── movies.html
│ │ └── seats.html
│ ├── urls.py
│ └── views.py
├── Cinema
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
├── templates
│ └── registration
│ ├── login.html
│ └── signup.html
└── tests
├── __init__.py
└── testsample.py
جزئیات
در این سؤال تنها لازم است تغییراتی در app/views.py
و app/fixtures
ایجاد کنید.
در فایل models.py
سه مدل به شرح زیر وجود دارد:
۱. مدل Movie
شامل فیلدهای زیر:
title
: نام فیلمrelease_year
: سال انتشار فیلمplay_time
: زمان اکران فیلم در سالن
۲. مدل Seat
شامل فیلد زیر:
number
: شماره صندلی
۳. مدل Ticket
شامل فیلدهای زیر:
movie
: فیلمی که این بلیت برای آن فروخته شده استuser
: کاربری که این بلیت را خریده استseat
: صندلی مربوط به این بلیتdate_bought
: تاریخی که بلیت خریده شده است
قرار است همه صندلیهای سالن و لیست فیلمها در ابتدا با استفاده از fixture
به پایگاه داده اضافه شود. سپس به ازای هر بلیتی که فروخته میشود
یک شیٔ از مدل Ticket
ساخته میشود.
مواردی که باید انجام دهید:
۱. نوشتن fixture
از شما میخواهیم دو فایل fixture با نامهای
movies
و seats
در مسیر app/fixtures
بنویسید. این fixture ها را میتوانید به فرمت
.json
یا .yaml
بنویسید.
- فایل
movies
باید شامل دادههای زیر باشد. زمان اکران را به صورت naive (بدون TimeZone) تعریف کنید.
id | نام فیلم | سال انتشار | تاریخ اکران | ساعت اکران |
---|---|---|---|---|
1 | Children of heaven | 1997 | 2018/4/20 | 22:00 |
2 | About Elly | 2009 | 2018/4/20 | 20:00 |
3 | A separation | 2011 | 2018/4/22 | 18:00 |
4 | The salesman | 2016 | 2018/4/21 | 18:00 |
5 | The Elephant king | 2017 | 2018/4/21 | 20:00 |
- فایل
seats
نیز باید شامل ۱۰ صندلی باid
های ۱ تا ۱۰ و با شماره صندلیهای ۳۱ تا ۴۰ (به ترتیبid
ها) باشد.
۲. نمایش صندلیها
در این قسمت باید view نمایش صندلیها (list_seats
) را به گونهای تغییر دهید
که فقط صندلیهایی که برای فیلم موردنظر رزرو نشدهاند نمایش داده شوند.
۳. رزرو صندلی
با توجه به توضیحات زیر، view ها را تکمیل کنید.
برای رزرو صندلی، کاربر مراحل زیر را انجام میدهد:
-
ابتدا از آدرس
/movie
بازدید میکند که لیست فیلمهایی که در حال اکران هستند را نمایش میدهد. سپس روی فیلم مورد نظر خود کلیک کرده و صفحهی بعدی صندلیهای رزرو نشده برای آن فیلم را نمایش میدهد. تا این مرحله کاربر نیازی به login بودن ندارد. -
وقتی کاربر روی یکی از صندلیها کلیک کرد:
- اگر کاربر login است، صندلی برای کاربر رزرو شده و دوباره به صفحهی صندلیهای همان فیلم redirect میشود تا بتواند صندلیهای دیگری را نیز رزرو کند.
- اگر کاربر login نیست، به صفحهی login هدایت میشود و پس از وارد شدن به سایت، بلافاصله به صفحهی قبلی (صفحه لیست صندلیها) redirect میشود، بدون این که صندلی رزرو شود.
- در صفحهی login اگر کاربر روی لینک signup کلیک کرد و در سایت عضو شد، باید بلافاصله پس از عضویت به طور خودکار در سایت login شود و به صفحه لیست فیلمها redirect شود.
۴. گزارش گیری سایت
در این قسمت شما باید view مربوط به آدرس stats
را به نحوی کامل کنید
که در پاسخ برای همه صندلیهای که حداقل
برای یک فیلم رزرو شدهاند (به ترتیب id
صندلی)،
یک خروجی JSON به شکل زیر بازگردد:
{
"stats": [
{"seat__number": 31, "total": 3},
{"seat__number": 32, "total": 1},
...
]
}
- مقدار total، تعداد رزروهای صندلی مشخص شده است.
- این view تنها باید برای مدیران (superuser ها) فعال باشد و برای سایر افراد خطای ۴۰۳ (Forbidden) برگرداند.
نکات
- شما تنها مجاز به تغییر در
app/views.py
وapp/fixtures
هستید. اگر تغییری در سایر فایلها ایجاد کنید، این تغییرات نادیده گرفته خواهد شد. - پس از اعمال تغییرات، کل پروژه را Zip کرده و ارسال کنید.
- نام فایل Zip اهمیت ندارد.
ارسال پاسخ برای این سؤال