Commit 301f1af6 authored by Seb's avatar Seb
Browse files

rework the model structure to avoide migration errors

parent 837d5e96
...@@ -116,6 +116,7 @@ Same as Wagtail Images, a custom model can be used to replace the built in Video ...@@ -116,6 +116,7 @@ Same as Wagtail Images, a custom model can be used to replace the built in Video
# app.videos.models # app.videos.models
from django.db import models from django.db import models
from modelcluster.fields import ParentalKey
from wagtailvideos.models import AbstractVideo, AbstractVideoTranscode from wagtailvideos.models import AbstractVideo, AbstractVideoTranscode
class AttributedVideo(AbstractVideo): class AttributedVideo(AbstractVideo):
...@@ -137,6 +138,13 @@ Same as Wagtail Images, a custom model can be used to replace the built in Video ...@@ -137,6 +138,13 @@ Same as Wagtail Images, a custom model can be used to replace the built in Video
unique_together = ( unique_together = (
('video', 'media_format') ('video', 'media_format')
) )
# Only needed if you are using the text tracks feature
class CustomTrackListing(AbstractTrackListing):
video = models.OneToOneField(AttributedVideo, related_name='track_listing', on_delete=models.CASCADE)
class CustomVideoTrack(AbstractVideoTrack):
listing = ParentalKey(CustomTrackListing, related_name='tracks', on_delete=models.CASCADE)
Video text tracks: Video text tracks:
......
This diff is collapsed.
from django.db import models from django.db import models
from wagtail.core.models import Page from modelcluster.fields import ParentalKey
from wagtail.core.fields import StreamField
from wagtail.admin.edit_handlers import StreamFieldPanel from wagtail.admin.edit_handlers import StreamFieldPanel
from wagtail.core.fields import StreamField
from wagtail.core.models import Page
from wagtailvideos.edit_handlers import VideoChooserPanel
from wagtailvideos.blocks import VideoChooserBlock from wagtailvideos.blocks import VideoChooserBlock
from wagtailvideos.models import AbstractVideo, AbstractVideoTranscode from wagtailvideos.edit_handlers import VideoChooserPanel
from modelcluster.fields import ParentalKey from wagtailvideos.models import (
AbstractTrackListing, AbstractVideo, AbstractVideoTrack,
AbstractVideoTranscode)
class CustomVideoModel(AbstractVideo): class CustomVideoModel(AbstractVideo):
...@@ -31,6 +33,14 @@ class CustomVideoTranscode(AbstractVideoTranscode): ...@@ -31,6 +33,14 @@ class CustomVideoTranscode(AbstractVideoTranscode):
) )
class CustomTrackListing(AbstractTrackListing):
video = models.OneToOneField(CustomVideoModel, related_name='track_listing', on_delete=models.CASCADE)
class CustomVideoTrack(AbstractVideoTrack):
listing = ParentalKey(CustomTrackListing, related_name='tracks', on_delete=models.CASCADE)
class TestPage(Page): class TestPage(Page):
video_field = models.ForeignKey( video_field = models.ForeignKey(
CustomVideoModel, related_name='+', null=True, blank=True, on_delete=models.SET_NULL) CustomVideoModel, related_name='+', null=True, blank=True, on_delete=models.SET_NULL)
......
...@@ -16,7 +16,7 @@ INSTALLED_APPS = [ ...@@ -16,7 +16,7 @@ INSTALLED_APPS = [
'wagtail.snippets', 'wagtail.snippets',
'wagtail.images', 'wagtail.images',
'wagtail.documents', 'wagtail.documents',
'wagtail.contrib.modeladmin', # 'wagtail.contrib.modeladmin',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
......
...@@ -15,6 +15,7 @@ from django.core.exceptions import SuspiciousFileOperation ...@@ -15,6 +15,7 @@ from django.core.exceptions import SuspiciousFileOperation
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.db import models from django.db import models
from django.forms.utils import flatatt from django.forms.utils import flatatt
from django.apps import apps
from django.urls import reverse from django.urls import reverse
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
...@@ -179,6 +180,10 @@ class AbstractVideo(CollectionMember, index.Indexed, models.Model): ...@@ -179,6 +180,10 @@ class AbstractVideo(CollectionMember, index.Indexed, models.Model):
def get_transcode_model(cls): def get_transcode_model(cls):
return cls.transcodes.rel.related_model return cls.transcodes.rel.related_model
@classmethod
def get_track_listing_model(cls):
return cls.track_listing.related.related_model
def video_tag(self, attrs=None): def video_tag(self, attrs=None):
if attrs is None: if attrs is None:
attrs = {} attrs = {}
...@@ -222,7 +227,6 @@ class AbstractVideo(CollectionMember, index.Indexed, models.Model): ...@@ -222,7 +227,6 @@ class AbstractVideo(CollectionMember, index.Indexed, models.Model):
class Meta: class Meta:
abstract = True abstract = True
ordering = ['-created_at']
class Video(AbstractVideo): class Video(AbstractVideo):
...@@ -234,6 +238,9 @@ class Video(AbstractVideo): ...@@ -234,6 +238,9 @@ class Video(AbstractVideo):
'tags', 'tags',
) )
class Meta:
ordering = ['-created_at']
class TranscodingThread(threading.Thread): class TranscodingThread(threading.Thread):
def __init__(self, transcode, **kwargs): def __init__(self, transcode, **kwargs):
...@@ -319,17 +326,25 @@ class VideoTranscode(AbstractVideoTranscode): ...@@ -319,17 +326,25 @@ class VideoTranscode(AbstractVideoTranscode):
) )
class TrackListing(ClusterableModel): class AbstractTrackListing(ClusterableModel):
video = models.OneToOneField(
get_video_model_string(), on_delete=models.CASCADE,
related_name='track_listing')
def __str__(self): def __str__(self):
return self.video.title return self.video.title
@classmethod
def get_track_model(cls):
return cls.tracks.rel.related_model
class VideoTrack(Orderable): class Meta:
listing = ParentalKey(TrackListing, related_name='tracks', on_delete=models.CASCADE) abstract = True
class TrackListing(AbstractTrackListing):
video = models.OneToOneField(
Video, on_delete=models.CASCADE,
related_name='track_listing')
class AbstractVideoTrack(Orderable):
# TODO move to TextChoices once django < 3 is dropped # TODO move to TextChoices once django < 3 is dropped
track_kinds = [ track_kinds = [
('subtitles', 'Subtitles'), ('subtitles', 'Subtitles'),
...@@ -375,3 +390,10 @@ class VideoTrack(Orderable): ...@@ -375,3 +390,10 @@ class VideoTrack(Orderable):
folder_name = 'video_tracks' folder_name = 'video_tracks'
filename = self.file.field.storage.get_valid_name(filename) filename = self.file.field.storage.get_valid_name(filename)
return os.path.join(folder_name, filename) return os.path.join(folder_name, filename)
class Meta:
abstract = True
class VideoTrack(AbstractVideoTrack):
listing = ParentalKey(TrackListing, related_name='tracks', on_delete=models.CASCADE)
...@@ -6,7 +6,6 @@ from django.db import transaction ...@@ -6,7 +6,6 @@ from django.db import transaction
from django.db.models.signals import post_delete, post_save from django.db.models.signals import post_delete, post_save
from wagtailvideos import ffmpeg, get_video_model from wagtailvideos import ffmpeg, get_video_model
from wagtailvideos.models import VideoTrack
@contextmanager @contextmanager
...@@ -68,6 +67,8 @@ def video_post_save(instance, **kwargs): ...@@ -68,6 +67,8 @@ def video_post_save(instance, **kwargs):
def register_signal_handlers(): def register_signal_handlers():
Video = get_video_model() Video = get_video_model()
VideoTranscode = Video.get_transcode_model() VideoTranscode = Video.get_transcode_model()
TrackListing = Video.get_track_listing_model()
VideoTrack = TrackListing.get_track_model()
post_save.connect(video_post_save, sender=Video) post_save.connect(video_post_save, sender=Video)
post_delete.connect(post_delete_file_cleanup, sender=Video) post_delete.connect(post_delete_file_cleanup, sender=Video)
......
...@@ -16,7 +16,6 @@ from wagtail.search.backends import get_search_backends ...@@ -16,7 +16,6 @@ from wagtail.search.backends import get_search_backends
from wagtailvideos import ffmpeg, get_video_model, is_modeladmin_installed from wagtailvideos import ffmpeg, get_video_model, is_modeladmin_installed
from wagtailvideos.forms import VideoTranscodeAdminForm, get_video_form from wagtailvideos.forms import VideoTranscodeAdminForm, get_video_form
from wagtailvideos.permissions import permission_policy from wagtailvideos.permissions import permission_policy
from wagtailvideos.models import TrackListing
if LooseVersion(wagtail.__version__) >= LooseVersion('2.7'): if LooseVersion(wagtail.__version__) >= LooseVersion('2.7'):
from wagtail.admin.auth import PermissionPolicyChecker from wagtail.admin.auth import PermissionPolicyChecker
...@@ -72,7 +71,6 @@ def index(request): ...@@ -72,7 +71,6 @@ def index(request):
'videos': page, 'videos': page,
'query_string': query_string, 'query_string': query_string,
'is_searching': bool(query_string), 'is_searching': bool(query_string),
'search_form': form, 'search_form': form,
'popular_tags': popular_tags_for_model(Video), 'popular_tags': popular_tags_for_model(Video),
'current_collection': current_collection, 'current_collection': current_collection,
...@@ -120,7 +118,7 @@ def edit(request, video_id): ...@@ -120,7 +118,7 @@ def edit(request, video_id):
messages.button(reverse('wagtailvideos:delete', args=(video.id,)), _('Delete')) messages.button(reverse('wagtailvideos:delete', args=(video.id,)), _('Delete'))
]) ])
if is_modeladmin_installed(): if is_modeladmin_installed():
url_helper = AdminURLHelper(TrackListing) url_helper = AdminURLHelper(Video.get_track_listing_model())
if hasattr(video, 'track_listing'): if hasattr(video, 'track_listing'):
action_url = url_helper.get_action_url('edit', instance_pk=video.track_listing.pk) action_url = url_helper.get_action_url('edit', instance_pk=video.track_listing.pk)
else: else:
......
...@@ -22,7 +22,7 @@ Video = get_video_model() ...@@ -22,7 +22,7 @@ Video = get_video_model()
class TracksAdmin(ModelAdmin): class TracksAdmin(ModelAdmin):
model = TrackListing model = Video.get_track_listing_model()
menu_icon = 'openquote' menu_icon = 'openquote'
menu_label = 'Text tracks' menu_label = 'Text tracks'
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment