ساکنان کشور دوبستان علاقهای به رعایت پروتکلهای بهداشتی از خود نشان نمیدهند، برای همین مسئولین این کشور تصمیم به اجرای یک سامانه گرفتهاند. هدف اصلی این سامانه پیدا کردن افرادیست که بدیهیترین پروتکل بهداشتی را رعایت نمیکنند و هدف بعدی آن اطلاعرسانی اخبار از طریق پیامک است.
در این کشور عجیب فقط بیمارستانها و شرکتها وجود دارند. ساکنانش هم مثل کشورشان عجیباند؛ با اینکه پروتکلها را رعایت نمیکنند ولی از مریضی به شدت میترسند، برای همین برای هر مسئلهای به بیمارستان مراجعه میکنند.
برای اجرای این سامانه مدیران بیمارستانها و شرکتها همکاری خود را اعلام کردهاند. این سامانه چند کار را انجام میدهد:
1. با گرفتن اسم بیمارستان، افرادی را که در این بیمارستان بستری هستند، کرونا دارند و در شرکتی کار میکنند را برمیگرداند.
2. با گرفتن اسم شرکت، کارمندانی که بهخاطر کرونا به بیمارستان مراجعه کرده بودهاندرا بر میگرداند.
3. این سامانه برای اطلاعرسانی از سرویس `sms` استفاده میکند. لیستی از کد ملی اشخاص دریافت میکند و با استفاده از کد ملی شماره تلفنشان را پیدا کرده و برای آنها`sms` میفرستد. (در این شهر هر کد ملی به یک شماره تلفن اختصاص و هر شماره تلفن به یک کد ملی اختصاص داده شده است.)
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/76282/) دانلود کنید.
ساختار فایلهای این پروژه به صورت زیر است:
```
doobestan
├── manage.py
├── requirements.txt
│
├───doob
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── serializer.py
│ ├── SMS.py
│ ├── tests.py
│ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > views.py < </mark>
│ ├── __init__.py
│ └── migrations
│ └── __init__.py
│
├───Proj
│ ├── asgi.py
│ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > db_Router.py < </mark>
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ ├── __init__.py
│
└───tests
└── testssample.py
```
<details class="green">
<summary>
دیتابیسها - پیادهسازی شده است
</summary>
## دیتابیسها
### دیتابیس `default`
در این دیتابیس قرار است گزارشهای مربوط به `sms`های داده شده ذخیره شود.
### دیتابیس `hospitals`
در این دیتابیس اطلاعات راجعبه بیمارستانها و مریضهای مربوط به هر بیمارستان را داریم.
### دیتابیس `companies`
در این دیتابیس اطلاعات راجع به شرکتها و کارمندهای مربوط به هر شرکت را داریم.
</details>
<details class="green">
<summary>
مدلها - پیادهسازی شده است
</summary>
## مدلها
### مدل `DeliveryReport`
این مدل فقط شامل یک فیلد میباشد:
فیلد `phone_number` : شمارهی شهروندی که به او از طریق این سرویس `sms` داده شده در آن ذخیره میشود. این فیلد از نوع `CharField` میباشد.
این مدل مربوط به دیتابیس `default` میباشد.
### مدل `Hospital`
این مدل شامل سه فیلد میباشد:
فیلد `name`: نشاندهندهی نام بیمارستان میباشد و `unique` است. این فیلد از نوع `CharField` میباشد.
فیلد `manager_name`: نشاندهندهی نام مدیر بیمارستان است. این فیلد از نوع `CharField` میباشد.
فیلد `manager_id`: نشاندهندهی کد ملی مدیر بیمارستان است. این فیلد از نوع `CharField` میباشد.
این مدل مربوط به دیتابیس `hospitals` میباشد.
### مدل `Company`
این مدل شامل سه فیلد میباشد:
فیلد `name`: نشاندهندهی نام شرکت میباشد و `unique` است. این فیلد از نوع `CharField` میباشد.
فیلد `manager_name`: نشاندهندهی نام مدیر شرکت است. این فیلد از نوع `CharField` میباشد.
فیلد `manager_id`: نشاندهندهی کد ملی مدیر شرکت است. این فیلد از نوع `CharField` میباشد.
این مدل مربوط به دیتابیس `companies` میباشد.
### مدل `Sick`
این مدل شامل چهار فیلد میباشد:
فیلد `name`: نشاندهندهی نام بیمار است. این فیلد از نوع `CharField` میباشد.
فیلد `nationalID`: نشاندهندهی کدملی بیمار است. این فیلد از نوع `CharField` میباشد
فیلد `illName`: نشاندهندهی نام بیماری بیمار مورد نظر است. این فیلد از نوع `CharField` میباشد.
فیلد `hospital`: نشاندهندهی بیمارستانیست که این بیمار در آن بستری شده است. این فیلد از نوع `ForeignKey` به مدل `hospital` میباشد.
این مدل مربوط به دیتابیس `hospital` میباشد.
### مدل `employee`
این مدل شامل سه فیلد میباشد:
فیلد `name`: نشاندهندهی نام کارمند است. این فیلد از نوع `CharField` میباشد.
فیلد `nationalID`: نشاندهندهی کد ملی کارمند است. این فیلد از نوع `CharField` میباشد.
فیلد `company`: نشاندهندهی شرکتیست که این کارمند در آن کار میکند. این فیلد از نوع `ForeignKey` به مدل `company` میباشد.
این مدل مربوط به دیتابیس `companies` میباشد.
</details>
<details class="yellow">
<summary>
ویوها - توسط شما پیادهسازی میشود
</summary>
## ویوها
### ویو `get_sick_employee_by_hospital`
این ویو یک `request` میپذیرد که از نوع `POST` میباشد.
در `request` اسم بیمارستان به صورت `json` داده میشود. (`NameSerializer` سریالایزر مربوط به این ریکوئست میباشد.) به عنوان `response` یک دیکشنری داده میشود؛ به این صورت که در قسمت `key` اعداد ۱ تا n قرار دارند و در قسمت `value` یک رشته به صورت زیر ذخیره میشود:
"(name, nationalID)"
در واقع نام و کد ملی شخصیست که به آن بیمارستان برای کرونا مراجعه کرده و کارمند است.
دقت کنید که اهمیتی ندارد کدام `value` به کدام `key` نسبت داده شده است.
کسانی که کرونا دارند فیلد `illName` آنها به صورت `Covid19` ذخیره شده است.
### ویو `get_sick_employee_by_company`
این ویو یک `request` میپذیرد که از نوع `POST` میباشد.
در `request` اسم شرکت به صورت `json` داده میشود. (`NameSerializer` سریالایزر مربوط به این ریکوئست میباشد.) به عنوان `response` یک دیکشنری داده میشود؛ به این صورت که در قسمت `key` اعداد ۱ تا n قرار دارد و در قسمت `value` یک **رشته** به این صورت ذخیره میشود:
`(name, nationalID)`(دقت کنید که این **رشته** است و نه تاپل.)
در واقع نام و کدملی شخصیست که در آن شرکت کار میکند و برای کرونا به بیمارستان مراجعه کرده است.
دقت کنید که اهمیتی ندارد کدام `value` به کدام `key` نسبت داده شده است.
کسانی که کرونا دارند فیلد `illName` آنها به صورت `Covid19` ذخیره شده است.
### ویو `sms_link`
این ویو یک `request` میپذیرد که از نوع `POST` میباشد.
در `request` کد ملی کسانی که قرار است برای آنها *sms* فرستاده شود به صورت `json` داده میشود.(`NationalIDSerializer` سریالایزر مربوط به این ریکوئست میباشد.)
در فایل `SMS.py` دو تابع داریم:
تابع `sms`: به عنوان ورودی یک شماره تلفن میگیرد(*phone_number*) و برای آن `sms` میفرستد.
تابع `get_phone_number`: به عنوان ورودی کد ملی میگیرد(*number*) و به عنوان خروجی شماره تلفن اختصاص داده شده به آن را میدهد.
ویو `sms_link` با استفاده از توابع فایل `SMS.py` برای شمارههای اختصاص داده شده به کدهای ملی دریافتی *sms* میفرستد و در دیتابیس به ازای هر *sms* فرستاده شده، یک شیء`DeliveryReport` با شمارهی شخص را ذخیره میکند.
دقت کنید که تابع `sms` از نوع `async` میباشد.
در نهایت به عنوان `response` کد استاتوس ۲۰۰ برگردانده میشود..
</details>
<details class="yellow">
<summary>
فایل روتر - توسط شما پیاده میشود
</summary>
### فایل `db_Router.py`
در این فایل دو کلاس مربوط به لیست `DATABASE_ROUTERS` (تعریف شده در `settings.py`) باید توسط شما پیادهسازی شود.
</details>
## تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
```shell terminal terminal
python manage.py test
```
## نکات
+ توجه کنید که اگر هر `request` مشکلی داشته باشد، ویوی مربوط به آن باید کداستاتوس ۴۰۰ را برگرداند.
+ هر کد ملی برای یک نفر است.
+ شما فقط مجاز به تغییر دادن فایلهای `views.py` و `db_Router.py` هستید. باقی تغییرات در سیستم داوری نادیده گرفته میشود.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.