from django.views.generic import ListView, DetailView from django.views.generic.edit import UpdateView from camps.mixins import CampViewMixin from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import redirect from django.contrib import messages from django.urls import reverse_lazy from django.conf import settings from .mixins import EnsureTeamResponsibleMixin from ..models import Team, TeamMember import logging logger = logging.getLogger("bornhack.%s" % __name__) class TeamListView(CampViewMixin, ListView): template_name = "team_list.html" model = Team context_object_name = 'teams' class TeamGeneralView(CampViewMixin, DetailView): template_name = "team_general.html" context_object_name = 'team' model = Team slug_url_kwarg = 'team_slug' active_menu = 'general' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) context['IRCBOT_SERVER_HOSTNAME'] = settings.IRCBOT_SERVER_HOSTNAME context['IRCBOT_PUBLIC_CHANNEL'] = settings.IRCBOT_PUBLIC_CHANNEL return context class TeamManageView(CampViewMixin, EnsureTeamResponsibleMixin, UpdateView): model = Team template_name = "team_manage.html" fields = ['description', 'needs_members', 'public_irc_channel_name', 'public_irc_channel_bot', 'public_irc_channel_managed', 'private_irc_channel_name', 'private_irc_channel_bot', 'private_irc_channel_managed'] slug_url_kwarg = 'team_slug' def get_success_url(self): return reverse_lazy('teams:general', kwargs={'camp_slug': self.camp.slug, 'team_slug': self.get_object().slug}) def form_valid(self, form): messages.success(self.request, "Team has been saved") return super().form_valid(form) class FixIrcAclView(LoginRequiredMixin, CampViewMixin, UpdateView): template_name = "fix_irc_acl.html" model = Team fields = [] slug_url_kwarg = 'team_slug' def dispatch(self, request, *args, **kwargs): # we need to call the super().dispatch() method early so self.camp gets populated by CampViewMixin, # because the lookups below depend on self.camp being set :) response = super().dispatch( request, *args, **kwargs ) # check if the logged in user has an approved membership of this team if request.user not in self.get_object().approved_members.all(): messages.error(request, 'No thanks') return redirect('teams:general', camp_slug=self.get_object().camp.slug, team_slug=self.get_object().slug) # check if we manage the channel for this team if not self.get_object().irc_channel or not self.get_object().irc_channel_managed: messages.error(request, 'IRC functionality is disabled for this team, or the team channel is not managed by the bot') return redirect('teams:general', camp_slug=self.get_object().camp.slug, team_slug=self.get_object().slug) # check if user has a nickserv username if not request.user.profile.nickserv_username: messages.error(request, 'Please go to your profile and set your NickServ username first. Make sure the account is registered with NickServ first!') return redirect('teams:general', camp_slug=self.get_object().camp.slug, team_slug=self.get_object().slug) return response def get(self, request, *args, **kwargs): # get membership try: TeamMember.objects.get( user=request.user, team=self.get_object(), approved=True, irc_channel_acl_ok=True ) except TeamMember.DoesNotExist: # this membership is already marked as membership.irc_channel_acl_ok=False, no need to do anything messages.error(request, 'No need, this membership is already marked as irc_channel_acl_ok=False, so the bot will fix the ACL soon') return redirect('teams:general', camp_slug=self.get_object().camp.slug, team_slug=self.get_object().slug) return super().get( request, *args, **kwargs ) def form_valid(self, form): membership = TeamMember.objects.get( user=self.request.user, team=self.get_object(), approved=True, irc_channel_acl_ok=True ) membership.irc_channel_acl_ok = False membership.save() messages.success(self.request, "OK, hang on while we fix the permissions for your NickServ user '%s' for IRC channel '%s'" % (self.request.user.profile.nickserv_username, form.instance.irc_channel_name)) return redirect('teams:general', camp_slug=form.instance.camp.slug, team_slug=form.instance.slug)