فرهاد که به تازگی در کوئرا استخدام شده، تصمیم گرفته برای کمک به بخش Careers کوئرا تعدادی دستور طراحی کند. او که تسلط کمی به خط فرمان دارد و فقط توانسته مدل شرکت را تکمیل کند و به علت همزمان شدن امتحاناتش با زمان تحویل، به کمک شما برای تکمیل دستورات نیاز دارد.
پروژه اولیه
پروژه اولیه را از این لینک دریافت کنید. ساختار فایلهای این پروژه به صورت زیر است.
CLI
├── career
│ ├── admin.py
│ ├── apps.py
│ ├── __init__.py
│ ├── management
│ │ ├── commands
│ │ │ ├── > addCompany.py <
│ │ │ ├── > collectCompany.py <
│ │ │ ├── > editCompany.py <
│ │ │ ├── __init__.py
│ │ │ └── > rmCompany.py <
│ │ └── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ └── __init__.py
│ ├── models.py
│ ├── tests.py
│ ├── utils.py
│ └── views.py
├── config
│ ├── asgi.py
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
└── tests
├── __init__.py
└── testssample.py
برای کمک به فرهاد، دستورات خواسته شده را در فایلهای خواسته شده پیادهسازی کنید.
جزئیات
دستور addCompany
addCompany
میخواهیم درون فایل addCompany.py
، دستوری برای جنگو بنویسیم که با اجرای آن، به ترتیب مقادیر name, email, phone, description (از چپ به راست) را از کاربر دریافت کند و با این مقادیر، یک نمونه از کلاس Company بسازد.
- برای فیلدهايی که دارای ویژگی
null=False
هستند، کاربر حتما باید مقداری را وارد کند. در صورتی که کاربر بدون وارد کردن مقداری Enter زد باید خطایError: This field cannot be blank.
نمایش داده شود و برای فیلدهایی که دارای ویژگیnull=True
هستند، با زدن Enter به مرحله بعد رفته و مقدار آن فیلد None شود.
اعتبارسنجی مخصوص هر فیلد:
name
فیلد name
باید حداکثر ۵۰ کاراکتر باشد؛ در غیر اینصورت، عبارت
Error: Ensure this value has at most 50 characters (it has COUNT).
نمایش داده شود که به جای کلمهی COUNT، تعداد کاراکترهای عبارت شما قرار میگیرد.
همچنین این فیلد باید یکتا باشد؛ در غیر اینصورت، عبارت
Error: That name is already taken.
نمایش داده شود.
email
آدرس وارد شده باید یک ایمیل معتبر باشد، در غیر اینصورت باید عبارت
Error: Enter a valid email address.
نمایش داده شود.
phone
یک شماره موبایل در صورتی معتبر است که یکی از حالتهای زیر را دارا باشد:
- شامل ۱۱ رقم باشد و با 09 آغاز شود.
- شامل ۱۳ رقم باشد و با 98+ آغاز شود.
- شامل ۱۴ رقم باشد و با 0098 آغاز شود.
در غیر این صورت باید عبارت
Error: Phone number format is not valid.
نمایش داده شود.
description
این فیلد محدودیتی ندارد.
نکات مهم
- در صورت وارد شدن مقدار غیر قابل قبول برای هر فیلد، خط فرمان همچنان منتظر وارد شدن مقدار قابل قبول برای همان فیلد میماند.
- برای چاپ خطاها، حتماً از دستور
self.stderr.write(error_msg)
استفاده کنید.
نمونه
دستور editCompany
editCompany
میخواهیم درون فایل editCompany.py
، دستوری برای جنگو بنویسیم که یک positional arguments به عنوان نام شرکت و همچنین چهار optional arguments (--description
,--phone
,--email
,--name
) دریافت و فیلدهای مربوط به آن شرکت را بروز کند.
- برای فیلدهايی که دارای ویژگی
null=False
هستند، اگر آرگومان آنها برابر''
بود؛ استثنای CommandError با پیام Field cannot be blank.
رخ دهد (به جای کلمهیField
، نام فیلد با حرف ابتدای بزرگ قرار میگیرد.) اما برای فیلدهایی که دارای ویژگیnull=True
هستند، میتواند برابر''
باشد؛ ولی مقدار فیلد تغییری نمیکند. - در هر مرحله از اعتبار سنجی که در ادامه اشاره میشود، اگر مقادیر، معتبر نبودند باید استثنای CommandError با پیام خطای مربوط رخ دهد.
- موارد، به ترتیب نوشتهشده باید بررسی شوند.
positional arguments
در صورتی که شرکتی با این نام وجود نداشت؛ باید یک Exception
با پیام
Company matching query does not exist.
رخ دهد.
optional arguments
name
آرگومان name
باید حداکثر ۵۰ کاراکتر باشد؛ در غیر اینصورت، یک Exception
با پیام
Error: Ensure this value has at most 50 characters (it has NUM).
رخ دهد که به جای NUM تعداد کاراکترهای عبارت شما قرار میگیرد.
همچنین این فیلد باید یکتا باشد، در غیر اینصورت، باید یک Exception
با پیام
Error: That name is already taken.
رخ دهد.
email
آدرس وارد شده باید یک ایمیل معتبر باشد در غیر این صورت باید یک Exception
با پیام
Error: Enter a valid email address.
رخ دهد.
phone
یک شماره موبایل در صورتی معتبر است که یکی از حالتهای زیر را دارا باشد:
- شامل ۱۱ رقم باشد و با 09 آغاز شود.
- شامل ۱۳ رقم باشد و با 98+ آغاز شود.
- شامل ۱۴ رقم باشد و با 0098 آغاز شود.
در غیر این صورت باید یک Exception
با پیام
Error: Phone number format is not valid.
رخ دهد.
description
این آرگومان محدودیتی ندارد.
نمونه
دستور rmCompany
rmCompany
میخواهیم درون فایل rmCompany.py
، برای جنگو بنویسیم که نام تعدادی (صفر یا بیشتر) شرکت را دریافت کند و درصورتی که شرکتی با آن نامها وجود داشت آن را از پایگاه داده حذف کند.
positional argument
در صورتی که شرکتی با این نامها وجود نداشت، به ازای هر نام غیرمعتبر باید عبارت
COMPANY matching query does not exist.
نمایش داده شود، که به جای COMPANY نام شرکت وارد شده قرار میگیرد.
optional argument
در صورت وجود --all
در دستور، بدون توجه به نام شرکتهای وارد شده (در صورت وجود)، تمام شرکتها حذف میشوند.
نکات مهم
- برای چاپ خطا، حتماً از دستور
self.stderr.write(error_msg)
استفاده کنید.
نمونه
دستور collectCompany
collectCompany
میخواهیم درون فایل collectCompany.py
، دستوری برای جنگو بنویسیم که با اجرای آن، یک فایل CSV به نام company.csv
شامل اطلاعات تماس شرکتها، در ریشهی پروژه ایجاد شود.
- ستونهای فایل CSV به ترتیب (از چپ به راست) نام، ایمیل و تلفن شرکت است.
تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
python manage.py test
نکات
- توجه کنید که در قسمتهایی که گفته شده عبارت مورد نظر نمایش داده شود، باید از دستور
self.stderr.write(error_msg)
و در قسمتهایی که گفته شده یکException
رخ دهد، از دستورraise
استفاده کنید. - شما تنها مجوز ایجاد تغییرات در فایلهای زیر را دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد.
- فایل
career/management/commands/addCompany.py
- فایل
career/management/commands/collectCompany.py
- فایل
career/management/commands/editCompany.py
- فایل
career/management/commands/rmCompany.py
- فایل
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال