|
1 | 1 | import re |
2 | 2 | import datetime |
3 | 3 | import html |
| 4 | +from datetime import date, timedelta |
| 5 | +from django.db.models import Case, When, IntegerField |
| 6 | +from django.db.models import Sum |
| 7 | +from download.models import ReleaseDownloadsByDate |
4 | 8 | from urllib.parse import unquote |
5 | 9 | from django.contrib.auth.models import User |
6 | 10 | from django.contrib.auth.decorators import login_required |
@@ -79,10 +83,41 @@ def _flush_tag_caches(): |
79 | 83 | class _DefaultConfig: |
80 | 84 | num_of_top_apps = 6 |
81 | 85 |
|
| 86 | +def get_top_downloaded_apps(limit=None): |
| 87 | + two_years_ago = date.today() - timedelta(days=730) |
| 88 | + |
| 89 | + top_download_data = ( |
| 90 | + ReleaseDownloadsByDate.objects |
| 91 | + .filter( |
| 92 | + when__gte=two_years_ago, |
| 93 | + release__app__active=True, |
| 94 | + release__active=True |
| 95 | + ) |
| 96 | + .values('release__app') |
| 97 | + .annotate(total_downloads=Sum('count')) |
| 98 | + .order_by('-total_downloads') |
| 99 | + ) |
| 100 | + |
| 101 | + if limit is not None: |
| 102 | + top_download_data = top_download_data[:limit] |
| 103 | + |
| 104 | + app_ids = [item['release__app'] for item in top_download_data] |
| 105 | + |
| 106 | + if not app_ids: |
| 107 | + return App.objects.none() |
| 108 | + |
| 109 | + preserved_order = Case( |
| 110 | + *[When(id=pk, then=pos) for pos, pk in enumerate(app_ids)], |
| 111 | + output_field=IntegerField() |
| 112 | + ) |
| 113 | + |
| 114 | + return App.objects.filter(id__in=app_ids).order_by(preserved_order) |
| 115 | + |
| 116 | + |
82 | 117 | def apps_default(request): |
83 | 118 | latest_apps = App.objects.filter(active=True).order_by('-latest_release_date')[:_DefaultConfig.num_of_top_apps] |
84 | | - downloaded_apps = App.objects.filter(active=True).order_by('downloads').reverse()[:_DefaultConfig.num_of_top_apps] |
85 | | - |
| 119 | + # downloaded_apps = App.objects.filter(active=True).order_by('downloads').reverse()[:_DefaultConfig.num_of_top_apps] |
| 120 | + downloaded_apps = get_top_downloaded_apps(_DefaultConfig.num_of_top_apps) |
86 | 121 | c = { |
87 | 122 | 'latest_apps': latest_apps, |
88 | 123 | 'downloaded_apps': downloaded_apps, |
@@ -110,7 +145,8 @@ def all_apps_newest(request): |
110 | 145 |
|
111 | 146 |
|
112 | 147 | def all_apps_downloads(request): |
113 | | - apps = App.objects.filter(active=True).order_by('downloads').reverse() |
| 148 | + # apps = App.objects.filter(active=True).order_by('downloads').reverse() |
| 149 | + apps = get_top_downloaded_apps() |
114 | 150 | c = { |
115 | 151 | 'apps': apps, |
116 | 152 | 'navbar_selected_link': 'all', |
|
0 commit comments