38531-vm/groups/views.py
2026-02-17 18:44:08 +00:00

124 lines
4.5 KiB
Python

from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, DetailView, CreateView, UpdateView, View
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy
from django.db.models import Q
from .models import Group, GroupMember
class GroupsHubView(LoginRequiredMixin, ListView):
model = Group
template_name = 'groups/hub.html'
context_object_name = 'discover_groups'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
user = self.request.user
context['your_circles'] = Group.objects.filter(
memberships__user=user,
memberships__status='active'
).distinct()
# Simple recommendation based on intent (can be refined later)
user_profile = getattr(user, 'profile', None)
if user_profile:
user_intents = user_profile.intents.all()
context['recommended_groups'] = Group.objects.exclude(
memberships__user=user
).filter(
intent_type__in=[i.name.lower() for i in user_intents]
).distinct()[:3]
return context
class GroupCreateView(LoginRequiredMixin, CreateView):
model = Group
template_name = 'groups/group_form.html'
fields = [
'name', 'description', 'group_type', 'intent_type',
'focus_game', 'visibility', 'capacity',
'location_scope', 'city', 'state', 'recurring_schedule', 'cover_image'
]
success_url = reverse_lazy('groups:hub')
def form_valid(self, form):
form.instance.created_by = self.request.user
response = super().form_valid(form)
# Automatically add creator as owner
GroupMember.objects.create(
group=self.object,
user=self.request.user,
role='owner',
status='active'
)
return response
class GroupDetailView(LoginRequiredMixin, DetailView):
model = Group
template_name = 'groups/group_detail.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
user = self.request.user
context['is_member'] = self.object.memberships.filter(user=user, status='active').exists()
context['is_pending'] = self.object.memberships.filter(user=user, status='pending').exists()
context['membership'] = self.object.memberships.filter(user=user).first()
context['active_members'] = self.object.memberships.filter(status='active')
return context
class GroupUpdateView(LoginRequiredMixin, UpdateView):
model = Group
template_name = 'groups/group_form.html'
fields = [
'name', 'description', 'group_type', 'intent_type',
'focus_game', 'visibility', 'capacity',
'location_scope', 'city', 'state', 'recurring_schedule', 'cover_image'
]
def get_queryset(self):
return Group.objects.filter(memberships__user=self.request.user, memberships__role__in=['owner', 'moderator'])
def get_success_url(self):
return reverse_lazy('groups:detail', kwargs={'pk': self.object.pk})
class GroupMembersView(LoginRequiredMixin, DetailView):
model = Group
template_name = 'groups/group_members.html'
class GroupJoinView(LoginRequiredMixin, View):
def post(self, request, pk):
group = get_object_or_404(Group, pk=pk)
# Check if already a member
if group.memberships.filter(user=request.user).exists():
return redirect('groups:detail', pk=pk)
status = 'active'
if group.visibility == 'private_request':
status = 'pending'
try:
GroupMember.objects.create(
group=group,
user=request.user,
status=status
)
except Exception as e:
# Handle capacity error from model clean
pass
return redirect('groups:detail', pk=pk)
class GroupLeaveView(LoginRequiredMixin, View):
def post(self, request, pk):
membership = get_object_or_404(GroupMember, group_id=pk, user=request.user)
if membership.role != 'owner':
membership.delete()
return redirect('groups:hub')
class GroupModerationView(LoginRequiredMixin, DetailView):
model = Group
template_name = 'groups/group_moderation.html'
def get_queryset(self):
return Group.objects.filter(memberships__user=self.request.user, memberships__role__in=['owner', 'moderator'])