added descriptions to stats and userstats

This commit is contained in:
oslomp
2019-01-10 20:56:37 +01:00
parent 274949c519
commit 1cf4378316
3 changed files with 106 additions and 44 deletions

View File

@ -18,8 +18,8 @@
</div>
<div class="col-md-6">
<h2>Uploads</h2>
<h4>Total: {{ stats.total_uploads }}</h4>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>In total <strong> {{ stats.total_uploads }} </strong> songs have been uploaded.
These are the {{ stats.stats_top_count }} people who have uploaded the most.</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>
@ -43,8 +43,8 @@
</div>
<div class="col-md-6">
<h2>Requests</h2>
<h4>Total: {{ stats.total_requests }}</h4>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>In total <strong> {{ stats.total_requests }} </strong> songs have been requested.
These are the {{ stats.stats_top_count }} people who have requested the most songs.</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>
@ -68,8 +68,9 @@
</div>
<div class="col-md-6">
<h2>Time requested</h2>
<h4>Total: {{stats.total_time_requested}}</h4>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>In total <strong> {{ stats.total_time_requested }} </strong> of music have been requested, with an
average song length of <strong>{{ stats.total_average }}</strong>.
These are the {{ stats.stats_top_count }} people with the longest total time queued</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>
@ -95,8 +96,9 @@
</div>
<div class="col-md-6">
<h2>Unique requests</h2>
<h4>Total: {{stats.total_unique_requests.total}}</h4>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>In total <strong> {{stats.total_unique_requests.total}}</strong> different songs
have been requested. The {{ stats.stats_top_count }} people that have requested the largest number of
different songs are shown below.
<div class="table-responsive">
<table class="table table-striped">
<thead>
@ -120,7 +122,7 @@
</div>
<div class="col-md-6">
<h2>Most played songs</h2>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>These are the {{ stats.stats_top_count }} most played songs ever.</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>
@ -146,22 +148,25 @@
</div>
<div class="col-md-6">
<h2>Most played uploaders</h2>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>The left column shows the {{ stats.stats_top_count }} people whose songs are requested most often by other people
people. The right column shows how many times that person has queued his own songs.</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>
<tr>
<th>#</th>
<th>User</th>
<th># Songs</th>
<th># Others</th>
<th># Own</th>
</tr>
</thead>
<tbody>
{% for stat in stats.most_requested_uploaders %}
<tr>
<th>{{ forloop.counter }}</th>
<td>{{ stat.song__user__name }}</td>
<td>{{ stat.total }} ({% widthratio stat.total stats.total_requests 100 %}%)</td>
<td>{{ stat.name }}</td>
<td>{{ stat.total }}</td>
<td>{{ stat.own_total}}</td>
</tr>
{% endfor %}
</tbody>
@ -170,7 +175,7 @@
</div>
<div class="col-md-6">
<h2>Most played songs last 14 days</h2>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p>These songs are played the {{ stats.stats_top_count }} most in the last two weeks.</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>

View File

@ -19,11 +19,11 @@
{% endif %}
</div>
</div>
<h4>Total uploads: {{ stats.total_uploads }}</h4>
<h4>Unique requests: {{ stats.unique_requests }} ({% widthratio stats.unique_requests stats.total_requests 100 %}%)</h4>
<div class="col-md-6">
<h2>Most played songs</h2>
<h4>Total: {{ stats.total_requests }}</h4>
<p>You have requested <strong> {{ stats.unique_requests }} </strong> different
songs a total of <strong> {{ stats.total_requests }} </strong> times. This
means <strong> {% widthratio stats.unique_requests stats.total_requests 100 %}% </strong> of your requests have been unique. </p>
<h4>Top {{ stats.stats_top_count }}:</h4>
<div class="table-responsive">
<table class="table table-striped">
@ -51,8 +51,11 @@
<div class="row">
<div class="col-md-6">
<h2>Uploads requested</h2>
<h4>Total played by you: {{stats.total_played_user_uploads}}</h4>
<h4>Total played by others: {{stats.total_played_uploads}}</h4>
<p> You have uploaded a total of <strong> {{stats.total_uploads }} </strong> songs. The left column
shows how many times these have been requested by other people. The right column shows
how many times you requested your own songs. In total your songs
have been queued <strong> {{stats.total_played_uploads }} </strong> times by others and
<strong> {{stats.total_played_user_uploads }} </strong> by yourself.
<h4>Top {{ stats.stats_top_count }}:</h4>
<div class="table-responsive">
<table class="table table-striped">
@ -81,7 +84,7 @@
</div>
<div class="col-md-6">
<h2>Most played uploaders</h2>
<h4>Top {{ stats.stats_top_count }}:</h4>
<p> The people whose songs you have queued the most are:</p>
<div class="table-responsive">
<table class="table table-striped">
<thead>

View File

@ -16,9 +16,11 @@ def recache_stats():
caches['default'].delete('stats')
caches['default'].set('stats', new_stats, 2 * 3600)
return new_stats
def recache_user_stats():
users = User.objects.exclude(Q(id=None)
users = User.objects.exclude(
Q(id=None)
| Q(id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).values('id')
for user in users:
new_stats = user_stats(user['id'])
@ -27,13 +29,51 @@ def recache_user_stats():
caches['userstats'].set(cacheloc, new_stats, 48 * 3600)
return new_stats
def time_convert(time):
for tr in time:
tr['duration'] = str(round(tr['total'] / 86400, 2)) + ' days'
avg_dur_sec = tr['avg_dur']%60
avg_dur_min = int((tr['avg_dur']-avg_dur_sec)/60)
tr['avg_dur'] = '{}:{}'.format(avg_dur_min, avg_dur_sec)
return time
try:
for tr in time:
tr['duration'] = str(round(tr['total'] / 86400, 2)) + ' days'
avg_dur_sec = tr['avg_dur'] % 60
avg_dur_min = int((tr['avg_dur'] - avg_dur_sec) / 60)
tr['avg_dur'] = '{}:{}'.format(avg_dur_min, avg_dur_sec)
return time
except:
avg_dur_sec = round(time % 60)
avg_dur_min = int(round((time - avg_dur_sec) / 60))
return ('{} minutes and {} seconds'.format(avg_dur_min, avg_dur_sec))
def calculate_uploaders(requests_uploader, most_requested_uploaders):
for x in requests_uploader:
a = len(most_requested_uploaders)
b = 0
while b <= a:
if b == a:
adding_list_item(most_requested_uploaders, x)
elif x['song__user__id'] == most_requested_uploaders[b]['id']:
if x['song__user__name'] == x['user__name']:
most_requested_uploaders[b]['own_total'] = x['total']
else:
most_requested_uploaders[b]['total'] += x['total']
break
b += 1
return
def adding_list_item(list, x):
list.append({
'id': x['song__user__id'],
'name': x['song__user__name'],
'total': 0,
'own_total': 0
})
if x['song__user__id'] == x['user__id']:
list[-1]['own_total']: x['total']
else:
list[-1]['_total']: x['total']
return
def compute_stats():
# We want to grab the time now, because otherwise we would be reporting a minute too late
@ -78,28 +118,41 @@ def compute_stats():
'-total', 'song__artist')[:settings.STATS_TOP_COUNT]
most_played_songs_14_days = PlaylistSong.objects.filter(
state=2, played_at__gte=timezone.now() -
timedelta(days=14)).exclude(user_id=None).values(
'song__artist',
'song__title').annotate(total=Count('id')).order_by(
'-total', 'song__artist')[:settings.STATS_TOP_COUNT]
state=2, played_at__gte=timezone.now() - timedelta(days=14)).exclude(
user_id=None).values(
'song__artist',
'song__title').annotate(total=Count('id')).order_by(
'-total', 'song__artist')[:settings.STATS_TOP_COUNT]
time_requested = PlaylistSong.objects.filter(state=2).exclude(
Q(user_id=None)
| Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).values(
'user__id', 'user__name').annotate(total=Sum('song__duration'), avg_dur=Sum('song__duration')/Count('id')).order_by(
'-total')[:settings.STATS_TOP_COUNT]
'user__id', 'user__name').annotate(
total=Sum('song__duration'),
avg_dur=Sum('song__duration') /
Count('id')).order_by('-total')[:settings.STATS_TOP_COUNT]
total_time_requested = PlaylistSong.objects.all().filter(state=2).exclude(
Q(user_id=None)
| Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).aggregate(
total=Sum('song__duration'))
most_requested_uploaders = PlaylistSong.objects.filter(state=2).exclude(
total_time_overall = 0
count = 0
for x in list(time_requested):
total_time_overall += x['avg_dur']
count += 1
total_average = total_time_overall / count
total_average = time_convert(total_average)
requests_uploader = PlaylistSong.objects.filter(state=2).exclude(
Q(user_id=None)
| Q(user_id__in=settings.STATS_REQUEST_IGNORE_USER_IDS)).values(
'song__user__id', 'song__user__name').annotate(total=Count(
'song__user__id')).order_by('-total')[:settings.STATS_TOP_COUNT]
'song__user__id', 'song__user__name', 'user__name',
'user__id').annotate(total=Count('song__user__name'))
most_requested_uploaders = []
calculate_uploaders(list(requests_uploader), most_requested_uploaders)
return {
'last_updated': last_updated,
@ -117,6 +170,7 @@ def compute_stats():
'most_requested_uploaders': list(most_requested_uploaders),
}
def user_stats(request):
last_updated = datetime.now()
@ -148,11 +202,12 @@ def user_stats(request):
'-total')[:settings.STATS_TOP_COUNT]
most_played_uploads = PlaylistSong.objects.filter(
state=2, song_id__in=Song.objects.filter(user__id=request)).exclude(user__id=None).values(
'song__artist',
'song__title').annotate(total=Count('id', filter=~Q(user__id=request)), user_total=Count('id', filter=Q(user__id=request))).order_by(
'-total', 'song__artist',
'song__title')[:settings.STATS_TOP_COUNT]
state=2, song_id__in=Song.objects.filter(user__id=request)).exclude(
user__id=None).values('song__artist', 'song__title').annotate(
total=Count('id', filter=~Q(user__id=request)),
user_total=Count('id', filter=Q(user__id=request))).order_by(
'-total', 'song__artist',
'song__title')[:settings.STATS_TOP_COUNT]
most_played = list(most_played_uploads)
total_played_uploads = 0
@ -173,4 +228,3 @@ def user_stats(request):
'total_played_uploads': total_played_uploads,
'total_played_user_uploads': total_played_user_uploads,
}