mirror of
https://gitlab.science.ru.nl/technicie/MarietjeDjango.git
synced 2025-12-09 22:12:22 +01:00
Do not count irregular requests for upload ratio
This commit is contained in:
@ -258,14 +258,14 @@ def upload(request):
|
|||||||
# - If 3*U < Q: allow upload (otherwise don't)
|
# - If 3*U < Q: allow upload (otherwise don't)
|
||||||
try:
|
try:
|
||||||
stats = upload_stats(request.user)
|
stats = upload_stats(request.user)
|
||||||
ratio = stats['minutes_queued'] / (3.0 * stats['minutes_upload'])
|
ratio = stats['queued_score'] / (3.0 * stats['upload_score'])
|
||||||
ratiostr = '{:.2f}'.format(ratio)
|
ratiostr = '{:.2f}'.format(ratio)
|
||||||
except ZeroDivisionError:
|
except ZeroDivisionError:
|
||||||
ratio = 99999.0 # high enough
|
ratio = 99999.0 # high enough
|
||||||
ratiostr = "∞"
|
ratiostr = "∞"
|
||||||
|
|
||||||
if not request.user.is_superuser and ratio < 1.0:
|
if not request.user.is_superuser and ratio < 1.0:
|
||||||
msg = 'Queue-to-upload ratio too high. Please queue some more before uploading. ({})'
|
msg = 'Queue-to-upload ratio too low. Please queue more <em title="8:00 to 21:00 during weekdays">during regular opening hours</em> to improve the ratio. (Ratio: {} ≱ 1.00)'
|
||||||
return JsonResponse({'success': False, 'errorMessage': msg.format(ratiostr)})
|
return JsonResponse({'success': False, 'errorMessage': msg.format(ratiostr)})
|
||||||
|
|
||||||
for i, file in enumerate(files):
|
for i, file in enumerate(files):
|
||||||
@ -282,7 +282,6 @@ def upload(request):
|
|||||||
upload_counter.inc()
|
upload_counter.inc()
|
||||||
return JsonResponse({'success': True})
|
return JsonResponse({'success': True})
|
||||||
|
|
||||||
|
|
||||||
@require_http_methods(["POST"])
|
@require_http_methods(["POST"])
|
||||||
@api_auth_required
|
@api_auth_required
|
||||||
def volume_down(request):
|
def volume_down(request):
|
||||||
@ -312,10 +311,28 @@ def mute(request):
|
|||||||
command.save()
|
command.save()
|
||||||
return JsonResponse({})
|
return JsonResponse({})
|
||||||
|
|
||||||
@transaction.atomic
|
|
||||||
def upload_stats(user):
|
def upload_stats(user):
|
||||||
q = PlaylistSong.objects.filter(user=user, state=2, song__deleted=False).aggregate(
|
songs_queued = PlaylistSong.objects.select_related('song').filter(
|
||||||
minutes_queued=Coalesce(Sum('song__duration'), Value(0)))
|
user=user, state=2, song__deleted=False)
|
||||||
q.update(Song.objects.filter(user=user, deleted=False).aggregate(
|
queued_score = sum(_request_weight(x) for x in songs_queued)
|
||||||
minutes_upload=Coalesce(Sum('duration'), Value(0))))
|
upload_score = Song.objects.filter(
|
||||||
return q
|
user=user, deleted=False).aggregate(
|
||||||
|
minutes_upload=Coalesce(Sum('duration'), Value(0)))
|
||||||
|
return {'queued_score': queued_score, 'upload_score': upload_score}
|
||||||
|
|
||||||
|
@transaction.atomic
|
||||||
|
def _request_weight(ps):
|
||||||
|
def _is_regular_queue(ps):
|
||||||
|
if not ps.played_at:
|
||||||
|
# Request is from the old times, assume good
|
||||||
|
return True
|
||||||
|
if not 0 < ps.played_at.weekday() <= 4:
|
||||||
|
return False # Queued in the weekend
|
||||||
|
if not 8 <= ps.played_at.hour <= 21:
|
||||||
|
return False # Queued outside of regular opening hours
|
||||||
|
return True
|
||||||
|
|
||||||
|
if _is_regular_queue(ps):
|
||||||
|
return float(ps.song.duration)
|
||||||
|
# Count other requests for 10%
|
||||||
|
return 0.10 * float(ps.song.duration)
|
||||||
|
|||||||
Reference in New Issue
Block a user