38359-vm/core/views.py
2026-02-11 12:56:44 +00:00

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)