Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 49 additions & 1 deletion apps/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
from PIL import Image, ImageDraw

from django.conf import settings
from datetime import date, timedelta
from apps.views import get_top_downloaded_apps
from download.models import ReleaseDownloadsByDate
from django.core.files.uploadedfile import SimpleUploadedFile
from django.contrib.auth.models import User
from django.test import TestCase
Expand Down Expand Up @@ -676,4 +679,49 @@ def test_app_button_by_name_found_app(self):
active=True)
appobj.save()
res = app_buttons.app_button_by_name('myapp')
self.assertEqual('myapp', res['app'].name)
self.assertEqual('myapp', res['app'].name)


class TopDownloadedAppsTestCase(TestCase):

def setUp(self):
self.app1 = App.objects.create(name="app1", fullname="App One", active=True)
self.app2 = App.objects.create(name="app2", fullname="App Two", active=True)

uploaded = SimpleUploadedFile("file.jar", b"hello", content_type="text/plain")

self.rel1 = Release.objects.create(
app=self.app1,
version="1.0",
release_file=uploaded,
active=True
)

self.rel2 = Release.objects.create(
app=self.app2,
version="1.0",
release_file=uploaded,
active=True
)

today = date.today()

# within 24 months
ReleaseDownloadsByDate.objects.create(
release=self.rel1,
when=today - timedelta(days=100),
count=100
)

# older than 24 months (ignored)
ReleaseDownloadsByDate.objects.create(
release=self.rel2,
when=today - timedelta(days=900),
count=500
)

def test_top_downloads_returns_apps(self):
apps = list(get_top_downloaded_apps())

self.assertIn(self.app1, apps)
self.assertNotIn(self.app2, apps)
42 changes: 39 additions & 3 deletions apps/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import re
import datetime
import html
from datetime import date, timedelta
from django.db.models import Case, When, IntegerField
from django.db.models import Sum
from download.models import ReleaseDownloadsByDate
from urllib.parse import unquote
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
Expand Down Expand Up @@ -79,10 +83,41 @@ def _flush_tag_caches():
class _DefaultConfig:
num_of_top_apps = 6

def get_top_downloaded_apps(limit=None):
two_years_ago = date.today() - timedelta(days=730)

top_download_data = (
ReleaseDownloadsByDate.objects
.filter(
when__gte=two_years_ago,
release__app__active=True,
release__active=True
)
.values('release__app')
.annotate(total_downloads=Sum('count'))
.order_by('-total_downloads')
)

if limit is not None:
top_download_data = top_download_data[:limit]

app_ids = [item['release__app'] for item in top_download_data]

if not app_ids:
return App.objects.none()

preserved_order = Case(
*[When(id=pk, then=pos) for pos, pk in enumerate(app_ids)],
output_field=IntegerField()
)

return App.objects.filter(id__in=app_ids).order_by(preserved_order)


def apps_default(request):
latest_apps = App.objects.filter(active=True).order_by('-latest_release_date')[:_DefaultConfig.num_of_top_apps]
downloaded_apps = App.objects.filter(active=True).order_by('downloads').reverse()[:_DefaultConfig.num_of_top_apps]

# downloaded_apps = App.objects.filter(active=True).order_by('downloads').reverse()[:_DefaultConfig.num_of_top_apps]
downloaded_apps = get_top_downloaded_apps(_DefaultConfig.num_of_top_apps)
c = {
'latest_apps': latest_apps,
'downloaded_apps': downloaded_apps,
Expand Down Expand Up @@ -110,7 +145,8 @@ def all_apps_newest(request):


def all_apps_downloads(request):
apps = App.objects.filter(active=True).order_by('downloads').reverse()
# apps = App.objects.filter(active=True).order_by('downloads').reverse()
apps = get_top_downloaded_apps()
c = {
'apps': apps,
'navbar_selected_link': 'all',
Expand Down