در این سوال قصد داریم تا مهارت خواندن و تغییر کدهای موجود را بسنجیم. بدین منظور یک پروژه موجود را از Github درنظر گرفتهایم. شما میتوانید از [این لینک](/problemset/assignments/4367/download_problem_initial_project/14747/) پروژه را دانلود کنید و از آن به عنوان مبنای توسعه کد استفاده کنید. این فایل یک ورژن خاص از [این پروژه در گیت هاب](https://github.com/vitorfs/bootcamp/) است.
ابتدا کدها را خوانده و به فهم نسبی از پروژه برسید.
مشاورین برندیگ کوئرا پیشنهاد دادند که کاربران را مجبور کنیم در نام کاربری خود از کلمه `quera` استفاده کنند. بنابراین ما از شما میخواهیم پس از خواندن کدهای پروژه تغییرات زیر را در آن اعمال کنید.
۱. تمام کاربران جدید، هنگام ثبتنام باید ازین امر مطلع شوند. بنابراین رشتهی `Usernames must contain the word "Quera"` را عیناً در کنار فیلد مربوط به *username* نمایش دهید تا کاربر قبل از وارد کردن نام کاربری برای خود، از این امر مطلع شود.
۲. اگر کاربری *username*ی را وارد کرد که شرط مورد نظر راجع به آن صدق نمیکرد، بعد از ارسال فرم، یک خطا با رنگ قرمز و با متن دقیقا `Username does not contain quera` به کاربر نمایش داده شود.
۳. در تمام حالتهایی که برای فیلد *username* خطا گرفته میشود باید **به شکل زیر** یک نام کاربری معتبر جدید به کاربر پیشنهاد دهید. یک نام کاربری در صورتی معتبر است که شامل کلمه `quera` باشد، در سیستم موجود نباشد و فقط شامل کاراکترهای مجاز (حروف A تا Z انگلیسی به صورت بزرگ و کوچک، اعداد، نقطه و underline) باشد.
برای بدستآوردن نام کاربری برای پیشنهاد باید مراحل الگوریتم زیر را به ترتیب انجام دهید:
* اگر نام کاربری وارد شده توسط کاربر شامل یک یا بیشتر کاراکتر غیر مجاز بود، کاراکترهای غیر مجاز را از رشته ورودی حذف کنید. برای مثال رشتهی 'ab+bas' یک نام کاربری با کاراکتر غیرمجاز `'+'` است که خروجی این مرحله، رشته `abbas` است.
* اگر نام کاربری بدست آمده از مرحله قبل شامل کلمه `quera` نبود، کلمه `quera_` را **به اول** نام کاربری پیشنهادی اضافه کنید. برای مثال خروجی این مرحله، رشته `quera_abbas` خواهد شد.
* اگر نام کاربری که هماکنون حتما شامل کلمه `quera` است، **در سیستم از قبل وجود داشت**، کارهای زیر را انجام دهید:
* اگر در انتهای نام underline **یا** underline و یک عدد وجود داشت آن ها را حذف کنید. (توجه کنید که تنها یک underline **یا** یک underline عدد را حذف کنید. به مثال های زیر توجه کنید.)
* به **انتهای نام** پیشنهادی یک underline و یک عدد اضافه کنید. به این صورت که در ابتدا `_1` را به انتهای نام اضافه کنید. اگر در سیستم وجود داشت، `_2` را اضافه کنید و به همین ترتیب تا نامی یافت شود که معتبر باشد.
**نکته مهم:** توجه کنید که اگر در انتهای نامی که کاربر وارد کرده است یک underline و عدد وجود داشت ولی در سیستم موجود بود، شما نباید یک underline و عدد دیگر به آن اضافه کنید، بلکه باید تنها عدد را تغییر دهید و کوچکترین عددی را بگذارید که در سیستم موجود نیست! الگوریتم بالا این نکته را تضمین میکند.
* نام پیشنهادی بدست آمده باید بعد از کلمهی `Suggest: ` و در بین دو کارکتر `'*'` در فرم ثبتنام زیر فیلد مربوطه نشان داده شود.
## نمونه
* اگر کاربر نام کاربری را `Ali` وارد کرد که دارای Quera نیست، سیستم نام `quera_Ali` را در صورتی که قبلا در سیستم وجود نداشت به کاربر پیشنهاد دهد.
* اگر کاربر `Quera10` وارد کرد که قبلا وجود داشت سیستم میتواند کلمه `Quera10_1` را پیشنهاد دهد ولی اگر کاربر رشته `Quera_10` را وارد کرد و در سیستم موجود بود شما نباید نام `Quera_10_1` را پیشنهاد دهید، بلکه باید نام `Quera_1` را در صورت معتبر بودن پیشنهاد دهید.
* اگر کاربر رشته `Quera__` را وارد کرد که از قبل در سیستم موجود بود، سیستم باید نام `Quera__1` را پیشنهاد دهد. همچنین برای رشته `Quera__1` نیز رشته `Quera__2` را پیشنهاد دهید.
* همچنین اگر کاربر کلمه ای مانند `ab+bas` وارد کرد که شامل کاراکتر غیر مجاز است، سیستم ممکن است نام `quera_abbas_1` را در صورت معتبر بودن پیشنهاد دهد. به تصویر زیر توجه کنید:
![توضیح تصویر](https://quera.org/qbox/view/LrVW2XDCAK/14747_2.png)
* برنامه نباید به بزرگی و کوچکی کلمه `quera` حساس باشد. یعنی اگر کلمه `QuErA` نیز در نامکابری بود نباید خطایی گرفته شود.
## نکات
* **تذکر: کارایی فعلی سایت نباید تغییری کند!** برای مثال در صورت موجود بودن نام کاربری فعلی در سیستم، رشته `User with this Username already exists` یا برای نام کاربریهایی که کاراکترهای غیر مجاز دارند رشته `Enter a valid username` نشان داده میشود که این کارایی نباید از بین برود.
* از اهداف این سوال این است که بتوانید یک پروژه را با توجه به توضیحات ارائه دهندهی پروژه اجرا کنید. بنابراین اجرا نشدن پروژه به معنای اشتباه بودن کد نیست.
## نحوه ارسال
کل پروژه را _zip_ کرده و ارسال کنید. فقط توجه کنید که فایل `manage.py` باید مستقیما در ریشهی فایل zip باشد و در هیچ پوشه دیگری نباشد. یعنی ساختار فایل zip ارسالی شما باید مانند زیر باشد:
```
<Your-zip-name>.zip
├── bootcamp
│ ├── activities
│ │ ├── __init__.py
│ │ ├── migrations
│ │ ├── models.py
│ │ ├── static
│ │ ├── templates
│ │ ├── tests
│ │ └── views.py
│ ├── articles
│ │ ├── forms.py
│ │ ├── __init__.py
│ │ └── ...
│ ├── authentication
│ │ ├── forms.py
│ │ └── ...
│ ├── core
│ │ └── ...
│ ├── decorators.py
│ ├── feeds
│ │ └── ...
│ ├── __init__.py
│ ├── locale
│ │ ├── es
│ │ └── ...
│ ├── messenger
│ │ └── ...
│ ├── questions
│ │ └── ...
│ ├── search
│ │ ├── __init__.py
│ │ ├── migrations
│ │ └── ...
│ ├── settings.py
│ ├── static
│ │ ├── css
│ │ ├── img
│ │ └── js
│ ├── templates
│ │ ├── 400.html
│ │ ├── 403.html
│ │ └── ...
│ ├── urls.py
│ └── wsgi.py
├── LICENSE
├── manage.py
├── README.md
├── requirements.txt
├── runtime.txt
└── setup.cfg
```