ساکنان کشور دوبستان علاقهای به رعایت پروتکلهای بهداشتی از خود نشان نمیدهند، برای همین مسئولین این کشور تصمیم به اجرای یک سامانه گرفتهاند. هدف اصلی این سامانه پیدا کردن افرادیست که بدیهیترین پروتکل بهداشتی را رعایت نمیکنند و هدف بعدی آن اطلاعرسانی اخبار از طریق پیامک است.
در این کشور عجیب فقط بیمارستانها و شرکتها وجود دارند. ساکنانش هم مثل کشورشان عجیباند؛ با اینکه پروتکلها را رعایت نمیکنند ولی از مریضی به شدت میترسند، برای همین برای هر مسئلهای به بیمارستان مراجعه میکنند.
برای اجرای این سامانه مدیران بیمارستانها و شرکتها همکاری خود را اعلام کردهاند. این سامانه چند کار را انجام میدهد:
-
با گرفتن اسم بیمارستان، افرادی را که در این بیمارستان بستری هستند، کرونا دارند و در شرکتی کار میکنند را برمیگرداند.
-
با گرفتن اسم شرکت، کارمندانی که بهخاطر کرونا به بیمارستان مراجعه کرده بودهاندرا بر میگرداند.
-
این سامانه برای اطلاعرسانی از سرویس
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 اهمیتی ندارد.
ارسال پاسخ برای این سؤال