ساکنان کشور دوبستان علاقهای به رعایت پروتکلهای بهداشتی از خود نشان نمیدهند، برای همین مسئولین این کشور تصمیم به اجرای یک سامانه گرفتهاند. هدف اصلی این سامانه پیدا کردن افرادیست که بدیهیترین پروتکل بهداشتی را رعایت نمیکنند و هدف بعدی آن اطلاعرسانی اخبار از طریق پیامک است.
در این کشور عجیب فقط بیمارستانها و شرکتها وجود دارند. ساکنانش هم مثل کشورشان عجیباند؛ با اینکه پروتکلها را رعایت نمیکنند ولی از مریضی به شدت میترسند، برای همین برای هر مسئلهای به بیمارستان مراجعه میکنند.
برای اجرای این سامانه مدیران بیمارستانها و شرکتها همکاری خود را اعلام کردهاند. این سامانه چند کار را انجام میدهد:
- 
با گرفتن اسم بیمارستان، افرادی را که در این بیمارستان بستری هستند، کرونا دارند و در شرکتی کار میکنند را برمیگرداند.
 - 
با گرفتن اسم شرکت، کارمندانی که بهخاطر کرونا به بیمارستان مراجعه کرده بودهاندرا بر میگرداند.
 - 
این سامانه برای اطلاعرسانی از سرویس
smsاستفاده میکند. لیستی از کد ملی اشخاص دریافت میکند و با استفاده از کد ملی شماره تلفنشان را پیدا کرده و برای آنهاsmsمیفرستد. (در این شهر هر کد ملی به یک شماره تلفن اختصاص و هر شماره تلفن به یک کد ملی اختصاص داده شده است.) 
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
doobestan
├── manage.py
├── requirements.txt
│
├───doob
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── serializer.py
│   ├── SMS.py
│   ├── tests.py
│   ├──  > views.py < 
│   ├── __init__.py
│   └── migrations
│       └── __init__.py
│
├───Proj
│   ├── asgi.py
│   ├──  > db_Router.py < 
│   ├── settings.py
│   ├── urls.py
│   ├── wsgi.py
│   ├── __init__.py
│
└───tests
    └── testssample.py
دیتابیسها - پیادهسازی شده است
دیتابیسها
دیتابیس default
در این دیتابیس قرار است گزارشهای مربوط به smsهای داده شده ذخیره شود.
دیتابیس hospitals
در این دیتابیس اطلاعات راجعبه بیمارستانها و مریضهای مربوط به هر بیمارستان را داریم.
دیتابیس companies
در این دیتابیس اطلاعات راجع به شرکتها و کارمندهای مربوط به هر شرکت را داریم.
مدلها - پیادهسازی شده است
مدلها
مدل 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 میباشد.
ویوها - توسط شما پیادهسازی میشود
ویوها
ویو 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 کد استاتوس ۲۰۰ برگردانده میشود..
فایل روتر - توسط شما پیاده میشود
فایل db_Router.py
در این فایل دو کلاس مربوط به لیست DATABASE_ROUTERS (تعریف شده در settings.py) باید توسط شما پیادهسازی شود.
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- توجه کنید که اگر هر 
requestمشکلی داشته باشد، ویوی مربوط به آن باید کداستاتوس ۴۰۰ را برگرداند. - هر کد ملی برای یک نفر است.
 - شما فقط مجاز به تغییر دادن فایلهای 
views.pyوdb_Router.pyهستید. باقی تغییرات در سیستم داوری نادیده گرفته میشود. 
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال