Added better upload model

This commit is contained in:
2020-05-04 21:36:09 +02:00
parent 297a16a0b3
commit 2b5785444f
2 changed files with 36 additions and 4 deletions

View File

@@ -1,10 +1,26 @@
from django import forms
from django.contrib import admin from django.contrib import admin
from django.core.exceptions import ValidationError
from . import models from . import models
class TranscodingsInline(admin.TabularInline): class TranscodingsForm(forms.ModelForm):
def clean(self):
cleaned_data = super().clean()
if not cleaned_data['url'] and not cleaned_data['upload']:
validation_error = ValidationError('Either url or upload must be given', code='invalid')
self.add_error('url', validation_error)
self.add_error('upload', validation_error)
if cleaned_data['url'] and cleaned_data['upload']:
validation_error = ValidationError('Cannot fill both url and upload', code='invalid')
self.add_error('url', validation_error)
self.add_error('upload', validation_error)
return cleaned_data
class TranscodingsInline(admin.StackedInline):
model = models.Transcoding model = models.Transcoding
fields = ['quality', 'file'] form = TranscodingsForm
fields = ['quality', 'url', 'upload']
extra = 0 extra = 0
class VideoAdmin(admin.ModelAdmin): class VideoAdmin(admin.ModelAdmin):
@@ -12,4 +28,5 @@ class VideoAdmin(admin.ModelAdmin):
fields = ['title', 'description', 'slug'] fields = ['title', 'description', 'slug']
inlines = [TranscodingsInline] inlines = [TranscodingsInline]
admin.site.register(models.Video, VideoAdmin) admin.site.register(models.Video, VideoAdmin)
admin.site.register(models.Upload)

View File

@@ -1,7 +1,10 @@
import os
from datetime import datetime from datetime import datetime
from typing import NamedTuple, Optional from typing import NamedTuple, Optional
from django.db import models from django.db import models
from django.db.models import constraints
from django.db.models.query_utils import Q
class Quality(NamedTuple): class Quality(NamedTuple):
name: str name: str
@@ -32,12 +35,19 @@ class Video(models.Model):
def __str__(self): def __str__(self):
return self.title return self.title
class Upload(models.Model):
id = models.AutoField(primary_key=True)
file = models.FileField()
def __str__(self):
return os.path.basename(self.file.path)
class Transcoding(models.Model): class Transcoding(models.Model):
id = models.AutoField(primary_key=True) id = models.AutoField(primary_key=True)
video = models.ForeignKey(Video, on_delete=models.CASCADE, related_name='transcodings') video = models.ForeignKey(Video, on_delete=models.CASCADE, related_name='transcodings')
quality = models.CharField(choices=((quality.name, quality.name) for quality in qualities), max_length=128) quality = models.CharField(choices=((quality.name, quality.name) for quality in qualities), max_length=128)
file = models.FileField() upload = models.OneToOneField(Upload, on_delete=models.PROTECT, blank=True, null=True)
url = models.CharField(max_length=256, null=True, blank=True, unique=True)
def __str__(self): def __str__(self):
return self.quality return self.quality
@@ -48,6 +58,11 @@ class Transcoding(models.Model):
class Meta: class Meta:
unique_together = ('video', 'quality') unique_together = ('video', 'quality')
constraints = [constraints.CheckConstraint(check=Q(upload__isnull=False) | Q(url__isnull=False),
name='upload_or_url_is_filled'),
constraints.CheckConstraint(check=~(Q(upload__isnull=False) & Q(url__isnull=False)),
name='upload_and_url_cannot_both_be_filled'),
]
def get_quality_by_name(name: str) -> Optional[Quality]: def get_quality_by_name(name: str) -> Optional[Quality]:
for quality in qualities: for quality in qualities: