124 lines
4.5 KiB
Python
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'])
|