75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
from django.shortcuts import render, get_object_or_404, redirect
|
|
from django.views.generic import ListView, DetailView, CreateView, TemplateView
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
from django.urls import reverse_lazy
|
|
from .models import Video, Channel, Category, LiveStream
|
|
from .forms import VideoUploadForm
|
|
|
|
class IndexView(ListView):
|
|
model = Video
|
|
template_name = 'core/index.html'
|
|
context_object_name = 'videos'
|
|
paginate_by = 20
|
|
|
|
def get_queryset(self):
|
|
return Video.objects.filter(is_published=True, video_type='standard').select_related('channel')
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['categories'] = Category.objects.all()
|
|
context['shorts'] = Video.objects.filter(video_type='short', is_published=True)[:10]
|
|
return context
|
|
|
|
class VideoDetailView(DetailView):
|
|
model = Video
|
|
template_name = 'core/video_detail.html'
|
|
context_object_name = 'video'
|
|
|
|
def get_object(self):
|
|
obj = super().get_object()
|
|
obj.views += 1
|
|
obj.save()
|
|
return obj
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['related_videos'] = Video.objects.filter(category=self.object.category).exclude(id=self.object.id)[:10]
|
|
return context
|
|
|
|
class ShortsListView(ListView):
|
|
model = Video
|
|
template_name = 'core/shorts_list.html'
|
|
context_object_name = 'shorts'
|
|
|
|
def get_queryset(self):
|
|
return Video.objects.filter(video_type='short', is_published=True)
|
|
|
|
class LiveStudioView(LoginRequiredMixin, TemplateView):
|
|
template_name = 'core/live_studio.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
channel = getattr(self.request.user, 'channel', None)
|
|
if channel:
|
|
context['live_streams'] = LiveStream.objects.filter(channel=channel)
|
|
context['videos'] = Video.objects.filter(channel=channel)
|
|
return context
|
|
|
|
class UploadVideoView(LoginRequiredMixin, CreateView):
|
|
model = Video
|
|
form_class = VideoUploadForm
|
|
template_name = 'core/upload_video.html'
|
|
success_url = reverse_lazy('index')
|
|
|
|
def form_valid(self, form):
|
|
# Ensure user has a channel
|
|
channel, created = Channel.objects.get_or_create(
|
|
user=self.request.user,
|
|
defaults={'name': self.request.user.username, 'handle': self.request.user.username.lower()}
|
|
)
|
|
form.instance.channel = channel
|
|
return super().form_valid(form)
|
|
|
|
def home(request):
|
|
return IndexView.as_view()(request)
|