به علت شیوع کرونا شرکت *سجادینه* جلسات خود را به صورت مجازی و در وبسایت [جیتسی](https://meet.jit.si) برگزار میکند.
شرکت *سجادینه* شامل تیمهای مختلفیست و هر عضو این شرکت دقیقا در یک تیم عضو میباشد. برای مدیریت بهتر جلسات این شرکت میخواهیم وبسایتی طراحی کنیم تا هر عضو بتواند وارد تیم خود بشود و هر تیم یک لینک مخصوص در [جیتسی](https://meet.jit.si) داشته باشد.
از شما میخواهیم ویوهای این وبسایت را با توجه به ساختار پروژه برای ما طراحی کنید.
## پروژه اولیه
پروژه اولیه را از [این لینک](/problemset/assignments/4367/download_problem_initial_project/76281/) دانلود کنید.
ساختار فایلهای این پروژه به صورت زیر است:
```
jitsi
├── manage.py
├── requirements.txt
├── account
│ ├── admin.py
│ ├── apps.py
│ ├── forms.py
│ ├── models.py
│ ├── tests.py
│ ├── urls.py
│ ├── <mark class="yellow" title="این فایل را تغییر دهید"> > views.py < </mark>
│ ├── __init__.py
│ ├── migrations
│ │ ├── 0001_initial.py
│ │ ├── 0002_auto_20201117_1120.py
│ │ └── __init__.py
│ │
│ └── templates
│ ├── home.html
│ ├── login.html
│ ├── signup.html
│ └── team.html
│
├── onedjango
│ ├── asgi.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
│ └── __init__.py
│
└── tests
├── tests.py
└── testsample.py
```
<details class="green">
<summary>
مدلها - پیادهسازی شده است
</summary>
### مدل `Team`
این مدل نشاندهندهی تیمها میباشد.
هر تیم شامل دو فیلد زیر میباشد:
+ فیلد `name`: که از نوع *CharField* میباشد و نشاندهندهی نام تیم است.
+ فیلد `jitsi_url_path`: که از نوع *CharField* میباشد و نشاندهنده لینک اختصاصی جیتسی برای آن تیم میباشد.
### مدل `Account`
این مدل از مدل `User` ارثبری میکند و دارای یک فیلد اضافه بر `User` میباشد:
+ فیلد `team`: که از نوع *foreignkey* میباشد و نشاندهندهی شیء تیم مربوط به این فرد میباشد.
</details>
<details class="green">
<summary>
فرمها - پیادهسازی شده است
</summary>
### فرم `SignUpForm`
از این فرم باید در قسمت ثبتنام افراد در سایت استفاده شود.
### فرم `TeamForm`
از این فرم باید برای اضافه کردن یک تیم و یا اضافه شدن به یک تیم استفاده شود.
### فرم `LoginForm`
از این فرم باید برای وارد شدن کاربر به سایت استفاده شود.
</details>
<details class="yellow">
<summary>
ویوها - توسط شما پیادهسازی شود
</summary>
## ویو `home`
به این ویو فقط میتوان ریکوئست `Get` زد و این ویو برای این نوع ریکوئست باید نام تیم کاربر را نشان دهد.
اگر کاربری که به این ویو ریکوئست میزند دارای تیم بود، صفحهی `home.html` را طوری نمایش دهید که در این صفحه، نام تیم این کاربر به نمایش دربیاید.
اگر کاربری که به این ویو ریکوئست میزند تیمی نداشت، صفحهی `home.html` را طوری نمایش دهید که در این صفحه، کلمهی `None` به نمایش دربیاید.
## ویو `signup`
به این ویو میتوان دو نوع ریکوئست `Get` و `Post` زد و کار این ویو ثبتنام کردن کاربر در سایت میباشد.
اگر نوع ریکوئست کاربر `Get` باشد؛ صفحهی `signup.html` را طوری به کاربر نمایش دهید که در این صفحه فرم `SignUpForm` برای کاربر به نمایش دربیاید.
اگر نوع ریکوئست کاربر `Post` باشد؛ بعد از انجام اعتبارسنجی دادههای وارد شده در فرم، اگر فرم به درستی پر شده بود کاربر را در دیتابیس ذخیره کرده و در سایت `login` کنید و کاربر را به آدرس `team` بفرستید؛ اگر هم فرم اشتباه پر شده بود کاربر را دوباره به صفحه `signup` بازگردانید.
## ویو `login_account`
به این ویو میتوان دو نوع ریکوئست `Get` و `Post` زد و کار این ویو وارد کردن کاربر به سایت میباشد.
اگر نوع ریکوئست کاربر `Get` باشد؛ صفحهی `login.html` را طوری به او نمایش دهید که فرم `LoginForm` به نمایش دربیاید.
اگر نوع ریکوئست کاربر `Post` باشد؛ بعد از اعتبارسنجی فرم، اگر کاربر فرم را درست پر کرده بود، بررسی کنید که کاربری با اطلاعات پر شده وجود داشته باشد و اگر وجود داشت کاربر را `login` کنید و او را به صفحهی `home` بفرستید؛ در غیر این صورت او را دوباره به صفحهی `login` بازگردانید.
## ویو `logout_account`
به این ویو فقط میتوان ریکوئست `Get` زد و کار این ویو خارج کردن کاربر از حساب کاربری خود میباشد.
اگر کاربر به این ویو ریکوئست `Get` زد او را از حساب کاربری خود بیرون کنید و به صفحهی `login` منتقل کنید.
## ویو `joinoradd_team`
به این ویو میتوان دو نوع ریکوئست `Get` و `Post` زد.
اگر نوع ریکوئست کاربر `Get` باشد؛ بررسی کنید کاربر در حال حاضر دارای تیم میباشد یا خیر.
اگر کاربر تیمی داشت او را به صفحهی `home` منتقل کنید وگرنه او را طوری به صفحهی `team.html` منتقل کنید که فرم `TeamForm` به او نمایش داده شود.
اگر نوع ریکوئست کاربر `Post` باشد؛ بعد از اعتبارسنجی فرم اگر کاربر فرم را درست پر کرده بود بررسی کنید اگر تیمی با این نام وجود داشت فیلد `team` کاربر را برابر با این تیم قرار دهید؛ و اگر وجود نداشت یک تیم با این نام بسازید. فیلد `jitsi_url_path` این تیم به صورت `http://meet.jit.si/team_name` قرار گیرد که جای `team_name` نام تیم قرار میگیرد. بعد از ساخت تیم فیلد `team` کاربر را برابر با این تیم قرار دهید و کاربر را به صفحهی `home` انتقال دهید.
اگر هم فرم درست پر نشده بود کاربر را به صفحه `home` انتقال دهید.
## ویو `exit_team`
به این ویو فقط میتوان ریکوئست `Get` زد و کار این ویو خارج کردن کاربر از تیم حال حاضر آن میباشد.
اگر کاربر به این ویو ریکوئست `Get` زد فیلد `team` کاربر را برابر با `None` قرار دهید و او را به صفحهی `home` منتقل کنید. اگر هم کاربر از قبل تیمی نداشت صرفا او را به صفحهی `home` منتقل کنید.
</details>
## تست نمونه
در فایلهای اولیهای که دانلود کردید یکسری داده اولیه به عنوان نمونه قرار داده شده است. میتوانید قبل از فرستادن سوال در سایت، این تستها را ببینید تا با نحوه داوری ما آشنا شوید و از پاسخ خود اطمینان حاصل نمایید.
تستها را میتوانید با دستور زیر اجرا کنید:
```shell terminal terminal
python manage.py test
```
## نکات
+ دقت کنید که تمامی ریدایرکتها را با استفاده از تابع `redirect` انجام دهید.
+ شما تنها مجوز ایجاد تغییرات در فایل `account/views.py` را دارید و **تمامی تغییرات دیگر شما** در فایلهای پروژه **نادیده گرفته خواهند شد.**
+ فراموش نکنید که میتوانید با مطالعهی `testsample.py` با روش تست کردن مدلها، فرمها و ادمینها آشنا شوید.
## نحوه ارسال
یک فایل _ZIP_ حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل _ZIP_ اهمیتی ندارد.