کوئرا قصد دارد تا آپلودسنتری برای کاربران سامانه LMS اش طراحی کند. بدین ترتیب کاربران میتوانند فایلهای آموزشی موردنیاز خود برای هر کلاس را داخل صفحه کلاس آپلود کنند و لینکش را با بقیه به اشتراک قرار دهند. از آنجایی که همه آپلودسنترها دارای محدودیتهایی برای آپلود فایل هستند و تیم فنی کوئرا وقتی برای پیادهسازی این سامانه ندارند، از شما میخواهیم تا API آپلودسنتر مدنظرشان را طراحی کنید.
پروژه اولیه
پروژه اولیه را از این لینک دانلود کنید. ساختار فایلهای این پروژه به صورت زیر است:
django_upload_center
├── account
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   └── __init__.py
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── config
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── tests
│   └── testssample.py
├── upload_center
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── models.py
│   ├── serializers.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── manage.py
└── requirements.txt
اپلیکشن account
اپلیکیشن account شامل دو مدل میشود که محدودیتهای کاربران را مشخص میکنند.  در ادامه فیلدهای هر یک توضیح داده شده است.
مدل User
Userاین مدل شامل فیلدهای زیر است:
- فیلد 
accountکه مشخص کننده نوع حساب کاربری یکUserاست. - فیلد 
used_storageکه مقدار فضای اشغال شده در سرور توسطUserرا بر حسب بایت نشان میدهد. 
مدل Account
Accountاین مدل شامل فیلدهای زیر است:
- فیلد 
titleکه عنوان اکانت را مشخص میکند. - فیلد 
storageکه حداکثر فضای مربوط به این نوع حساب کاربری را بر حسب بایت مشخص میکند. - فیلد 
max_file_transferکه حداکثر محدودیت حجمی فایلهای آپلود شده مربوط به این نوع حساب کاربری را بر حسب بایت مشخص میکند. 
پیادهسازی مورد انتظار
اکیدا توصیه میشود پیش از حل این بخش سایر قسمتهای پروژه را مطالعه کنید.
ویو UploadFile
UploadFileمتد PUT در این ویو، وظیفه آپلود فایل کاربران را بر عهده دارد و در پاسخ یک دیکشنری به صورت فایل JSON مانند زیر برمیگرداند:
{
    "city-g948bcbda2_640.jpg": "/fm/download/kian/city-g948bcbda2_640.jpg",
    "a-month-ga3e069e51_640.jpg": "/fm/download/kian/a-month-ga3e069e51_640.jpg",
    "Kargah.rar": "You don't have enough space to upload this file!",
    "Tedx_Intro.pdf": "You can't upload files more than 1.000 Megabytes!"
}
در این دیکشنری، کلیدها نام فایل ذخیره شده در سرور و مقدار آنها آدرس دانلود فایل مربوطه میباشد.
در صورتی که حجم فایل ارسالی از محدودیت مشخص شده (max_file_transfer) بیشتر باشد، کلید دیکشنری اسم فایل ارسالی و مقدار آن باید عبارت زیر باشد:
You can't upload files more than <user_max_file_transfer> Megabytes!
و در صورتی که کاربر فضایی برای آپلود فایل جدید نداشت، کلید دیکشنری اسم فایل ارسالی و مقدار آن باید عبارت زیر باشد:
You don't have enough space to upload this file!
نکات مهم
- فایلهای کاربران باید در 
rootپروژه و در دایرکتوری زیر ذخیره شوند. 
.uploaded_files/<username>
- کاربران باید امکان آپلود چندین فایل را به صورت همزمان داشته باشند.
 - در صورتی که یک فایل خالی آپلود شود، استاتوس کد ۴۰۰ را برگردانید.
 - آپلودسنتر حداکثر تعداد فایلی که از کاربر دریافت میکند را باید با توجه به محدودیتهای اکانت کاربر آپلود کند.
 - کاربران باید بتوانند فایلهایی تکراری یا با نام یکسان آپلود کنند.
 - برای مدیریت آپلود فایلهایی با نام مشابه، فقط به انتهای نام فایل میتوانید یک شناسه (suffix) اضافه کنید و نام فایل نباید تغییری کند.
 - برای تبدیل کیلوبایت به مگابایت تنها کافیست که عدد موردنظر را بر عدد ۱۰۲۴ تقسیم کنید.
 
ویو FileManager
FileManager
متد GET
GETدر این متد، اطلاعات کاربر به صورت یک فایل JSON مانند زیر برمیگردد:
{
    "Account": "Pro",
    "Storage": 5.000,
    "Used": 0.916,
    "Files": [
        "a-month-ga3e069e51_640.jpg",
        "city-g948bcbda2_640.jpg"
    ]
}
- در صورتی که کاربر فایلی در سرور نداشت، متن زیر را به عنوان مقدار کلید 
Filesقرار دهید: 
<username> doesn't have any files!
متد DELETE
DELETEدر این متد، نام فایلی که قرار است حذف شود در پارامتر file_name از طریق دیکشنری POST شئ ریکوئست در دسترس است. در صورتی که فایل موردنظر در سرور وجود داشت، فایل را از سرور حذف کنید، اطلاعات کاربر را بهروز کنید و پاسخ زیر را در قالب JSON به کاربر نشان دهید:
{
    "detail": "<FILE_NAME> Deleted Successfully."
}
و در صورتی که فایل در سرور موجود نبود، پاسخ زیر را در قالب JSON و با استاتوس کد ۴۰۴ به کاربر ارائه دهید:
{
    "detail": "<FILE_NAME> hasn't existed!"
}
ویو DownloadFile
DownloadFileدر متد GET این ویو، فایل خواسته شده را به صورت یک FileResponse برگردانید.
- پارامتر 
userنام کاربری کاربر آپلودکننده فایل است و پارامترfilenameنام فایل را مشخص میکند. - در صورتی که فایل درخواست شده موجود نباشد، یک دیکشنری به فرمت زیر و با کد وضعیت ۴۰۴ برگردانید:
 
{"detail": f"{filename} hasn't existed!"}
نکات
- شما تنها مجوز ایجاد تغییرات در فایلهای 
upload_center/views.py،config/settings.pyوupload_center/serializers.pyرا دارید و تمامی تغییرات دیگر شما در فایلهای پروژه نادیده گرفته خواهند شد. - فراموش نکنید که میتوانید با مطالعهی 
testssample.pyبا روش تست کردن مدلها، فرمها و ویوها آشنا شوید. 
نحوه ارسال
یک فایل ZIP حاوی همهی فایلهای پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.
ارسال پاسخ برای این سؤال