کوئرا قصد دارد تا آپلودسنتری برای کاربران سامانه 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 اهمیتی ندارد.
ارسال پاسخ برای این سؤال