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")