آپلودسنتر


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

اپلیکشن account🔗

اپلیکیشن account شامل دو مدل می‌شود که محدودیت‌های کاربران را مشخص می‌کنند. در ادامه فیلدهای هر یک توضیح داده شده است.

مدل User

این مدل شامل فیلدهای زیر است:

  • فیلد account‍ که مشخص کننده نوع حساب کاربری یک User است.
  • فیلد used_storage که مقدار فضای اشغال شده در سرور توسط User را بر حسب بایت نشان می‌دهد.
مدل Account

این مدل شامل فیلدهای زیر است:

  • فیلد title که عنوان اکانت را مشخص می‌کند.
  • فیلد storage که حداکثر فضای مربوط به این نوع حساب کاربری را بر حسب بایت مشخص می‌کند.
  • فیلد max_file_transfer که حداکثر محدودیت حجمی فایل‌های آپلود شده مربوط به این نوع حساب کاربری را بر حسب بایت مشخص می‌کند.

پیاده‌سازی مورد انتظار🔗

اکیدا توصیه می‌شود پیش از حل این بخش سایر قسمت‌های پروژه را مطالعه کنید.

ویو 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!"
}
JSON

در این دیکشنری، کلیدها نام فایل ذخیره شده در سرور و مقدار آن‌ها آدرس دانلود فایل مربوطه می‌باشد. در صورتی که حجم فایل ارسالی از محدودیت مشخص شده (max_file_transfer) بیشتر باشد، کلید دیکشنری اسم فایل ارسالی و مقدار آن باید عبارت زیر باشد:

You can't upload files more than <user_max_file_transfer> Megabytes!
Plain text

و در صورتی که کاربر فضایی برای آپلود فایل جدید نداشت، کلید دیکشنری اسم فایل ارسالی و مقدار آن باید عبارت زیر باشد:

You don't have enough space to upload this file!
Plain text

نکات مهم🔗

  • فایل‌های کاربران باید در root پروژه و در دایرکتوری زیر ذخیره شوند.
.uploaded_files/<username>
Plain text
  • کاربران باید امکان آپلود چندین فایل را به صورت همزمان داشته باشند.
  • در صورتی که یک فایل خالی آپلود شود، استاتوس کد ۴۰۰ را برگردانید.
  • آپلودسنتر حداکثر تعداد فایلی که از کاربر دریافت می‌کند را باید با توجه به محدودیت‌های اکانت کاربر آپلود کند.
  • کاربران باید بتوانند فایل‌هایی تکراری یا با نام یکسان آپلود کنند.
  • برای مدیریت آپلود فایل‌هایی با نام مشابه، فقط به انتهای نام فایل می‌توانید یک شناسه (suffix) اضافه کنید و نام فایل نباید تغییری کند.
  • برای تبدیل کیلوبایت به مگابایت تنها کافیست که عدد موردنظر را بر عدد ۱۰۲۴ تقسیم کنید.
ویو FileManager
متد GET

در این متد، اطلاعات کاربر به صورت یک فایل JSON مانند زیر برمی‌گردد:

{
    "Account": "Pro",
    "Storage": 5.000,
    "Used": 0.916,
    "Files": [
        "a-month-ga3e069e51_640.jpg",
        "city-g948bcbda2_640.jpg"
    ]
}
JSON
  • در صورتی که کاربر فایلی در سرور نداشت، متن زیر را به عنوان مقدار کلید Files قرار دهید:
    <username> doesn't have any files!
    Plain text
متد DELETE

در این متد، نام فایلی که قرار است حذف شود در پارامتر file_name از طریق دیکشنری POST‍‍‍ شئ ریکوئست در دسترس است. در صورتی که فایل موردنظر در سرور وجود داشت، فایل را از سرور حذف کنید، اطلاعات کاربر را به‌روز کنید و پاسخ زیر را در قالب JSON به کاربر نشان دهید:

{
    "detail": "<FILE_NAME> Deleted Successfully."
}
JSON

و در صورتی که فایل در سرور موجود نبود، پاسخ زیر را در قالب JSON و با استاتوس کد ۴۰۴ به کاربر ارائه دهید:

{
    "detail": "<FILE_NAME> hasn't existed!"
}
JSON
ویو DownloadFile

در متد GET‍ این ویو، فایل خواسته شده را به صورت یک FileResponse برگردانید.

  • پارامتر user‍ نام کاربری کاربر آپلودکننده فایل است و پارامتر filename نام فایل را مشخص می‌کند.
  • در صورتی که فایل درخواست شده موجود نباشد، یک دیکشنری به فرمت زیر و با کد وضعیت ۴۰۴ برگردانید:
    {"detail": f"{filename} hasn't existed!"}
    Python

نکات🔗

  • شما تنها مجوز ایجاد تغییرات در فایل‌های upload_center/views.py‍، config/settings.py و upload_center/serializers.py را دارید و تمامی تغییرات دیگر شما در فایل‌های پروژه نادیده گرفته خواهند شد.
  • فراموش نکنید که می‌توانید با مطالعه‌ی testssample.py با روش تست کردن مدل‌ها، فرم‌ها و ویوها آشنا شوید.

نحوه ارسال🔗

یک فایل ZIP حاوی همه‌ی فایل‌های پروژه، آپلود کنید. نام فایل ZIP اهمیتی ندارد.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.