Skip to content

Commit e49c04a

Browse files
committed
Use downloads from last 24 months for top apps ranking and add tests
1 parent d5cd5a0 commit e49c04a

2 files changed

Lines changed: 88 additions & 4 deletions

File tree

apps/tests.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
from PIL import Image, ImageDraw
1414

1515
from django.conf import settings
16+
from datetime import date, timedelta
17+
from apps.views import get_top_downloaded_apps
18+
from download.models import ReleaseDownloadsByDate
1619
from django.core.files.uploadedfile import SimpleUploadedFile
1720
from django.contrib.auth.models import User
1821
from django.test import TestCase
@@ -676,4 +679,49 @@ def test_app_button_by_name_found_app(self):
676679
active=True)
677680
appobj.save()
678681
res = app_buttons.app_button_by_name('myapp')
679-
self.assertEqual('myapp', res['app'].name)
682+
self.assertEqual('myapp', res['app'].name)
683+
684+
685+
class TopDownloadedAppsTestCase(TestCase):
686+
687+
def setUp(self):
688+
self.app1 = App.objects.create(name="app1", fullname="App One", active=True)
689+
self.app2 = App.objects.create(name="app2", fullname="App Two", active=True)
690+
691+
uploaded = SimpleUploadedFile("file.jar", b"hello", content_type="text/plain")
692+
693+
self.rel1 = Release.objects.create(
694+
app=self.app1,
695+
version="1.0",
696+
release_file=uploaded,
697+
active=True
698+
)
699+
700+
self.rel2 = Release.objects.create(
701+
app=self.app2,
702+
version="1.0",
703+
release_file=uploaded,
704+
active=True
705+
)
706+
707+
today = date.today()
708+
709+
# within 24 months
710+
ReleaseDownloadsByDate.objects.create(
711+
release=self.rel1,
712+
when=today - timedelta(days=100),
713+
count=100
714+
)
715+
716+
# older than 24 months (ignored)
717+
ReleaseDownloadsByDate.objects.create(
718+
release=self.rel2,
719+
when=today - timedelta(days=900),
720+
count=500
721+
)
722+
723+
def test_top_downloads_returns_apps(self):
724+
apps = list(get_top_downloaded_apps())
725+
726+
self.assertIn(self.app1, apps)
727+
self.assertNotIn(self.app2, apps)

apps/views.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
import re
22
import datetime
33
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
48
from urllib.parse import unquote
59
from django.contrib.auth.models import User
610
from django.contrib.auth.decorators import login_required
@@ -79,10 +83,41 @@ def _flush_tag_caches():
7983
class _DefaultConfig:
8084
num_of_top_apps = 6
8185

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+
82117
def apps_default(request):
83118
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)
86121
c = {
87122
'latest_apps': latest_apps,
88123
'downloaded_apps': downloaded_apps,
@@ -110,7 +145,8 @@ def all_apps_newest(request):
110145

111146

112147
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()
114150
c = {
115151
'apps': apps,
116152
'navbar_selected_link': 'all',

0 commit comments

Comments
 (0)