Add missing downloads app
parent
64a4f96db4
commit
c0d6718db8
@ -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)
|
@ -0,0 +1,5 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class DownloadsConfig(AppConfig):
|
||||||
|
name = 'downloads'
|
@ -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')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
@ -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)
|
@ -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 = """
|
||||||
|
<a class="pure-button pure-button-primary download-button" href="{url}">{title}</a>
|
||||||
|
[(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)
|
||||||
|
|
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
Loading…
Reference in New Issue