You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.9 KiB
Python
66 lines
1.9 KiB
Python
6 years ago
|
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)
|