Add custom file upload
This commit is contained in:
parent
680de724ba
commit
44c4795282
3 changed files with 61 additions and 0 deletions
|
@ -60,6 +60,7 @@ from judge.views import (
|
|||
resolver,
|
||||
course,
|
||||
email,
|
||||
custom_file_upload,
|
||||
)
|
||||
from judge import authentication
|
||||
|
||||
|
@ -1193,6 +1194,7 @@ urlpatterns = [
|
|||
),
|
||||
),
|
||||
url(r"^resolver/(?P<contest>\w+)", resolver.Resolver.as_view(), name="resolver"),
|
||||
url(r"^upload/$", custom_file_upload.file_upload, name="custom_file_upload"),
|
||||
] + url_static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
# if hasattr(settings, "INTERNAL_IPS"):
|
||||
|
|
43
judge/views/custom_file_upload.py
Normal file
43
judge/views/custom_file_upload.py
Normal file
|
@ -0,0 +1,43 @@
|
|||
from django.shortcuts import render
|
||||
from django.core.files.storage import FileSystemStorage
|
||||
from django import forms
|
||||
from django.utils.translation import gettext as _
|
||||
from django.conf import settings
|
||||
from django.http import Http404
|
||||
|
||||
import os
|
||||
import secrets
|
||||
from urllib.parse import urljoin
|
||||
|
||||
MEDIA_PATH = "uploads"
|
||||
|
||||
|
||||
class FileUploadForm(forms.Form):
|
||||
file = forms.FileField()
|
||||
|
||||
|
||||
def file_upload(request):
|
||||
if not request.user.is_superuser:
|
||||
raise Http404()
|
||||
file_url = None
|
||||
if request.method == "POST":
|
||||
form = FileUploadForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
file = request.FILES["file"]
|
||||
random_str = secrets.token_urlsafe(5)
|
||||
file_name, file_extension = os.path.splitext(file.name)
|
||||
new_filename = f"{file_name}_{random_str}{file_extension}"
|
||||
|
||||
fs = FileSystemStorage(
|
||||
location=os.path.join(settings.MEDIA_ROOT, MEDIA_PATH)
|
||||
)
|
||||
filename = fs.save(new_filename, file)
|
||||
file_url = urljoin(settings.MEDIA_URL, os.path.join(MEDIA_PATH, filename))
|
||||
else:
|
||||
form = FileUploadForm()
|
||||
|
||||
return render(
|
||||
request,
|
||||
"custom_file_upload.html",
|
||||
{"form": form, "file_url": file_url, "title": _("File Upload")},
|
||||
)
|
16
templates/custom_file_upload.html
Normal file
16
templates/custom_file_upload.html
Normal file
|
@ -0,0 +1,16 @@
|
|||
{% extends "base.html" %}
|
||||
|
||||
{% block body %}
|
||||
<center>
|
||||
{% if file_url %}
|
||||
<p>{{_('Your file has been uploaded successfully')}}: <a href="{{ file_url }}" target="_blank">{{ file_url }}</a></p>
|
||||
<a href="{{ url('custom_file_upload') }}" class="button small" style="width: fit-content;">{{_('Upload another file')}}</a>
|
||||
{% else %}
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p() }}
|
||||
<button type="submit">{{_('Upload file')}}</button>
|
||||
</form>
|
||||
{% endif %}
|
||||
</center>
|
||||
{% endblock %}
|
Loading…
Reference in a new issue