همه چی از uber شروع شد. ایده ی خوبی که رانندگان را به مسافران وصل میکرد و هر کسی هر جایی بود به سرعت میتوانست برای خودش تاکسی درخواست دهد. مدتی نگذشت که برنامهنویس های داخل کشور عزیزمان هم از این سرویس ایده گرفتند و شروع به پیاده سازی مشابه آن در ایران کردند. در حال حاضر چندین سرویس درخواست آنلاین تاکسی وجود دارد که در تهران و چند شهر دیگر مشغول سرویس دهی به مسافرین هستند و روز به روز هم گسترش بیشتری میابند و اشتغالزایی زیادی را نیز به وجود آوردهاند. حالا با توجه به بازار داغ این سرویس ما نیز میخواهیم یک سرویس مشابه ایجاد کنیم. اسمش هم `cabin` گذاشتهایم.
شما میتوانید پروژه کابین را از [اینجا](http://s9.picofile.com/file/8339633376/cabin_initial.zip.html) دانلود کنید.
همانطور که در فایل ها میبینید یک app به نام cabin وجو دارد. در فایل models.py هشت مدل به شرح زیر وجود دارد:
+ مدل Account: اکانت که به یک مدل دیگر اعم از راننده یا مسافر یا مدیر سیستم وصل است و شامل فیلد های زیر است
+ first_name: نام شخص
+ last_name: نام خانوادگی شخص
+ email: ایمیل شخص
+ phone: شماره تلفن شخص
+ password: پسورد شخص
+ مدل Admin: مدیر سیستم که دسترسی هایی خاصی به سیستم دارد
+ account: اکانت ادمین که اطلاعات او را نگه میدارد
+ مدل Rider: مسافر
+ account: اکانت مسافر که اطلاعات او را نگه میدارد
+ x: طول جغرافیایی موقعیت مسافر
+ y: عرض جغرافیایی موقعیت مسافر
+ rating: امتیاز مسافر
+ مدل Driver: راننده
+ account: اکانت راننده که اطلاعات او را نگه میدارد
+ x: طول جغرافیایی موقعیت راننده
+ y: عرض جغرافیایی موقعیت راننده
+ rating: امتیاز راننده
+ active: آماده به کار بودن یا نبود راننده را نشان میدهد
+ مدل Car: خودرو
+ owner: صاحب خودرو که یک راننده است
+ car_type: نوع کلاس خودرو
+ model: سال تولید خودرو
+ color: رنگ خودرو
+ مدل RideRequest: درخواست سفر
+ rider: مسافر درخواست دهنده
+ x: طول جغرافیایی نقطه درخواست
+ y: عرض جغرافیایی نقطه درخواست
+ car_type: کلاس خودرو درخواست شده
+ مدل Ride: سفر
+ pickup_time: (زمان شروع سفر(سوار کردن مسافر
+ dropoff_time: زمان پایان سفر
+ *دو زمان بالا از نوع عدد صحیح و نشاندهنده تعداد ثانیه های گذشته از زمان تاسیس شرکت می باشند.*
+ request: درخواست سفری که این سفر به آن مربوط میشود
+ car: خودرویی که این سفر با آن انجام شده است
+ rider_rating: امتیازی که راننده به مسافر داده است
+ driver_rating: امتیازی که مسافر به راننده داده است
+ مدل Payment: پرداخت
+ ride: سفری که پرداخت برای آن انجام شده است
+ amount: مبلغ پرداخت شده برحسب تومان
+ status: وضعیت پرداخت
حال از شما میخواهیم پرس و جو (query) های زیر را روی مدل های بالا بنویسید.
**حتما قبل شروع نوشتن کد، تذکرات انتهای سوال را بخوانید!**
#### ۱. کل مبلغ دریافتی توسط راننده ای با شناسه برابر با x.
+ در این سوال status اهمیتی ندارد و نتیجه را میتوانید به شکل یک dict برگردانید.
```json
{'payment_sum': value }
```
#### ۲. لیست همه سفر های یک مسافر با شناسه x.
#### ۳. تعداد سفر هایی که طول آنها (از نظر زمانی) بیشتر از t بوده است.
+ نتیجه این پرسوجو یک عدد است.
#### ۴. لیست همه راننده هایی که در فاصله کمتر یا مساوی از r حول نقطه (x,y) قرار دارند و فعال (آماده به کار) نیز هستند.
#### ۵. لیست رانندگانی که یک ماشین کلاس A **یا** یک ماشین با رنگ c دارند **و** حداقل n سفر انجام داده اند.
#### ۶. لیست مسافرانی که x سفر یا بیشتر داشته اند و در مجموع بیشتر از t تومان پرداخت کرده اند.
#### ۷. لیست رانندگانی که حداقل یک سفر داشته اند که در آن سفر اسم راننده با اسم مسافر یکسان بوده است.
+ *در این لیست نباید رانندهی تکراری وجود داشته باشد.*
#### ۸. لیست **همه** راننده ها و یک ستون دیگر با نام `n` که نشان دهنده ی تعداد سفر هایی است که در آنها نام خانوادگی راننده با نام خانوادگی مسافر یکسان بوده است.
#### ۹. لیست **همه** راننده ها به همراه یک ستون دیگر به نام `n` که تعداد سفر هاییست که در آن سفر ها ماشین مدل x یا به بالا (توجه کنید که مدل با نوع متفاوت است!) بوده است **و** طول سفر بیشتر از t ثانیه بوده است.
خروجی نمونه:
```
<QuerySet [{'id': 1, 'n': 8}, {'id': 2, 'n': 1},....]>
```
* طول این لیست به تعداد همه راننده ها است که در هر عنصر آن id راننده و n (با تعریف بالا) قرار دارد.*
#### ۱۰. لیست **همه** ماشین ها و یک ستون اضافه شده به آن به نام `extra` از نوع عدد صحیح که مقدار این ستون با توجه به نوع ماشین (`car_type`) به شرح زیر تعریف میشود.
+ اگر نوع ماشین `A` بود تعداد سفر های انجام شده با آن ماشین در ستون extra قرار میگیرد.
+ اگر نوع ماشین `B` بود مجموع طول سفر های انجام شده با آن ماشین در ستون extra قرار میگیرد.
+ اگر نوع ماشین `C` بود مجموع مبلغ سفر های انجام شده با آن ماشین در ستون extra قرار میگیرد.
## **تست نمونه:**
در فایل های اولیه ای که دانلود کردید یک سری داده اولیه به عنوان نمونه قرار داده شده است. همچنین ۵ تست نمونه برای ۵ پرسوجو اول بر اساس داده های اولیه قرار داده شده است که میتوانید قبل از فرستادن سوال در سایت، این تست ها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تست ها را میتوانید با دستور زیر اجرا کنید:
```bash
python manage.py test
```
## **تذکرات:**
+ یک فایل به نام `queries.py` وجود دارد که برای هر سوال یک تابع در نظر گرفته شده است. شما کد های خود را باید در این فایل بنویسید و QuerySet مربوطه را بازگردانید.
+ برای نمونه تابع `query_0` در پاسخ به پرس و جویِ «لیست همه ی رانندگانی که رتبهی آنها بیشتر از x است.» کامل شده است که شما نیز باید مشابه همین تابع بقیه توابع را کامل کنید.
```python
def query_0(x):
q = Driver.objects.filter(rating__gt=x)
return q
```
+ در سوالاتی که در صورت سوال مقداری به صورت متغییر ذکر شده است(مانند x در مثال بالا)، متغییر مورد نظر در آرگومان های ورودی تابع در نظر گرفته شده است. شما خود نباید آرگومان های ورودی تابع را تغییر دهید.
+ در تمام سوالات به جز سوالاتی که خروجی نمونه برای آنها مشخص شده است، همان طور که ذکر شد، خروجی شما یک شیء از نوع QuerySet با المان هایی از جنس گفته شده در اول سوال باید باشد. یعنی در واقع خود query را return کنید.
+ برای مثال اگر سوال گفته باشد «لیست ماشین هایی که....» خروجی شما به شکل زیر باید باشد:
```
<QuerySet [<Car: Car object>, <Car: Car object>,.....]>
```
+ در سوالات دیگر نیز که خروجی مشخص شده است، باز نتیجه یک QuerySet است ولی شامل همه فیلد های مدل مورد نظر نمیشود و فقط فیلد های خواسته شده با نام خواسته شده باید در آن قرار داشته باشد.
+ در هیچ کدام از پرس و جوی های خواسته شده ترتیب مهم نیست.
### فایل آپلودی
پس از نوشتن کد، کل پروژه را *zip* کرده و ارسال کنید. توجه کنید که هر کدی که خارج از فایل `queries.py` باشد، در هنگام داوری حذف خواهند شد.
ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.