From c0d6718db8fcde34c456aa3bff9f3740bacf50f5 Mon Sep 17 00:00:00 2001 From: Alice Date: Wed, 15 May 2019 19:51:49 +0200 Subject: [PATCH] Add missing downloads app --- .gitignore | 1 - downloads/__init__.py | 0 downloads/admin.py | 12 +++++ downloads/apps.py | 5 +++ downloads/migrations/0001_initial.py | 43 ++++++++++++++++++ downloads/migrations/__init__.py | 0 downloads/models.py | 65 ++++++++++++++++++++++++++++ downloads/templatetags/__init__.py | 0 downloads/templatetags/dltags.py | 21 +++++++++ downloads/tests.py | 3 ++ downloads/views.py | 3 ++ 11 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 downloads/__init__.py create mode 100644 downloads/admin.py create mode 100644 downloads/apps.py create mode 100644 downloads/migrations/0001_initial.py create mode 100644 downloads/migrations/__init__.py create mode 100644 downloads/models.py create mode 100644 downloads/templatetags/__init__.py create mode 100644 downloads/templatetags/dltags.py create mode 100644 downloads/tests.py create mode 100644 downloads/views.py diff --git a/.gitignore b/.gitignore index 3639e2a..f33f250 100644 --- a/.gitignore +++ b/.gitignore @@ -12,7 +12,6 @@ env/ build/ develop-eggs/ dist/ -downloads/ eggs/ .eggs/ lib/ diff --git a/downloads/__init__.py b/downloads/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/downloads/admin.py b/downloads/admin.py new file mode 100644 index 0000000..e06c796 --- /dev/null +++ b/downloads/admin.py @@ -0,0 +1,12 @@ +from django.contrib import admin +from .models import Download, Platform, Version + +# Register your models here. + +class VersionAdmin(admin.ModelAdmin): + list_display = ('download', 'platform', 'version', 'latest', 'available') + list_filter = ('download__name', 'platform__name', 'latest', 'available') + +admin.site.register(Download) +admin.site.register(Platform) +admin.site.register(Version, VersionAdmin) diff --git a/downloads/apps.py b/downloads/apps.py new file mode 100644 index 0000000..a41a850 --- /dev/null +++ b/downloads/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class DownloadsConfig(AppConfig): + name = 'downloads' diff --git a/downloads/migrations/0001_initial.py b/downloads/migrations/0001_initial.py new file mode 100644 index 0000000..c9d2cfa --- /dev/null +++ b/downloads/migrations/0001_initial.py @@ -0,0 +1,43 @@ +# Generated by Django 2.2.1 on 2019-05-14 15:09 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Download', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', models.SlugField()), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Platform', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('slug', models.SlugField()), + ('name', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Version', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('version', models.CharField(max_length=50)), + ('latest', models.BooleanField(blank=True, default=False)), + ('available', models.BooleanField(blank=True, default=True)), + ('url', models.URLField()), + ('download', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='downloads.Download')), + ('platform', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='downloads.Platform')), + ], + ), + ] diff --git a/downloads/migrations/__init__.py b/downloads/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/downloads/models.py b/downloads/models.py new file mode 100644 index 0000000..759cc1a --- /dev/null +++ b/downloads/models.py @@ -0,0 +1,65 @@ +from django.db import models + + +class Platform(models.Model): + slug = models.SlugField() + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + + +class Download(models.Model): + slug = models.SlugField() + name = models.CharField(max_length=100) + + def __str__(self): + return self.name + + +class VersionManager(models.Manager): + def get_latest(self, download, platform): + if isinstance(download, str): + try: + download = Download.objects.get(slug=download) + except Download.DoesNotExist: + return None + + if isinstance(platform, str): + try: + platform = Platform.objects.get(slug=platform) + except Platform.DoesNotExist: + return None + + latest = (Version.objects + .filter(platform=platform, download=download) + .filter(available=True) + .order_by('-latest', '-id') + .first()) + if not latest: + return None + + return latest + +class Version(models.Model): + download = models.ForeignKey(Download, on_delete=models.CASCADE, db_index=True) + platform = models.ForeignKey(Platform, on_delete=models.CASCADE, db_index=True) + version = models.CharField(max_length=50) + latest = models.BooleanField(default=False, blank=True) + available = models.BooleanField(default=True, blank=True) + url = models.URLField() + + objects = VersionManager() + + def save(self, *args, **kwargs): + if self.latest: + # Unmark as latest any other version for this download/platform + latest = Version.objects.filter(platform=self.platform, download=self.download, latest=True) + for k in latest: + k.latest = False + k.save() + + super().save(*args, **kwargs) + + def __str__(self): + return "%s v%s for %s" % (self.download, self.version, self.platform) diff --git a/downloads/templatetags/__init__.py b/downloads/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/downloads/templatetags/dltags.py b/downloads/templatetags/dltags.py new file mode 100644 index 0000000..32701b2 --- /dev/null +++ b/downloads/templatetags/dltags.py @@ -0,0 +1,21 @@ +from django import template +from django.utils.html import format_html +from downloads.models import Version, Platform +from django.utils.translation import ugettext as _ + +register = template.Library() + +BUTTON_HTML = """ +{title} +[(sig)]({url}.asc) +""" + +@register.simple_tag +def download_button(download, platform): + latest = Version.objects.get_latest(download, platform) + if not latest: + return format_html("\ufffc") + + title = _("Download {} v{}").format(latest.download, latest.version) + return format_html(BUTTON_HTML.strip(), url=latest.url, title=title) + diff --git a/downloads/tests.py b/downloads/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/downloads/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/downloads/views.py b/downloads/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/downloads/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.