Files
MarietjeDjango/marietje/songs/views.py

90 lines
3.3 KiB
Python

from django.shortcuts import render, get_object_or_404, redirect
from .counters import upload_counter
from .models import Song
from django.views.generic import TemplateView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib import messages
from .services import check_upload_stats, get_reputation, upload_file, UploadException
class UploadView(LoginRequiredMixin, TemplateView):
template_name = "songs/upload.html"
def post(self, request, **kwargs):
files = request.FILES.getlist("file[]")
artists = request.POST.getlist("artist[]")
titles = request.POST.getlist("title[]")
for artist in artists:
if not artist:
messages.add_message(
request, messages.ERROR, "Please enter artists which are not empty.", extra_tags="danger"
)
return render(request, self.template_name)
for title in titles:
if not title:
messages.add_message(
request, messages.ERROR, "Please enter titles which are not empty.", extra_tags="danger"
)
return render(request, self.template_name)
if not check_upload_stats(request.user):
reputation = get_reputation(request.user)
msg = (
"Queue-to-upload ratio too low. Please queue more during regular opening hours to improve the "
"ratio. (Ratio: {} ≱ 1.00)"
)
messages.add_message(request, messages.ERROR, msg.format(reputation), extra_tags="danger")
return render(request, self.template_name)
uploaded_correctly = 0
for i, file in enumerate(files):
try:
upload_file(file, artists[i], titles[i], request.user)
uploaded_correctly += 1
except UploadException:
messages.add_message(
request,
messages.ERROR,
"File {} could not be uploaded due to an exception that "
"occurred while contacting the file server, please try "
"again.".format(titles[i]),
extra_tags="danger",
)
if uploaded_correctly > 0:
messages.add_message(
request,
messages.SUCCESS,
"{}/{} files uploaded.".format(uploaded_correctly, len(files)),
extra_tags="success",
)
upload_counter.inc()
return render(request, self.template_name)
class ManageView(LoginRequiredMixin, TemplateView):
template_name = "songs/manage.html"
class EditView(LoginRequiredMixin, TemplateView):
template_name = "songs/edit.html"
def get(self, request, **kwargs):
song_id = kwargs.get("song_id")
song = get_object_or_404(Song, pk=song_id, user=request.user)
return render(request, self.template_name, {"song": song})
def post(self, request, **kwargs):
song_id = kwargs.get("song_id")
song = get_object_or_404(Song, pk=song_id, user=request.user)
artist = request.POST.get("artist")
title = request.POST.get("title")
song.artist = artist
song.title = title
song.save()
return redirect("songs:manage")