2020-02-12 12:10:41 +00:00
|
|
|
import logging
|
|
|
|
|
2020-02-24 22:28:52 +00:00
|
|
|
from camps.mixins import CampViewMixin
|
2020-02-12 12:10:41 +00:00
|
|
|
from django.conf import settings
|
|
|
|
from django.contrib import messages
|
2017-04-02 16:04:57 +00:00
|
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
|
|
from django.shortcuts import redirect
|
2018-04-03 16:44:10 +00:00
|
|
|
from django.urls import reverse_lazy
|
2020-02-12 12:10:41 +00:00
|
|
|
from django.views.generic import DetailView, ListView
|
|
|
|
from django.views.generic.edit import UpdateView
|
2018-05-04 22:19:24 +00:00
|
|
|
|
2020-02-12 12:10:41 +00:00
|
|
|
from ..models import Team, TeamMember
|
|
|
|
from .mixins import EnsureTeamResponsibleMixin
|
2019-06-16 12:32:24 +00:00
|
|
|
|
2017-05-23 20:25:06 +00:00
|
|
|
logger = logging.getLogger("bornhack.%s" % __name__)
|
2017-03-31 15:29:28 +00:00
|
|
|
|
|
|
|
|
|
|
|
class TeamListView(CampViewMixin, ListView):
|
|
|
|
template_name = "team_list.html"
|
2017-04-02 16:04:57 +00:00
|
|
|
model = Team
|
2019-06-16 12:32:24 +00:00
|
|
|
context_object_name = "teams"
|
2017-03-31 15:29:28 +00:00
|
|
|
|
2020-02-24 22:28:52 +00:00
|
|
|
def get_queryset(self, *args, **kwargs):
|
|
|
|
qs = super().get_queryset(*args, **kwargs)
|
|
|
|
qs = qs.prefetch_related("members")
|
|
|
|
qs = qs.prefetch_related("members__profile")
|
|
|
|
# FIXME: there is more to be gained here but the templatetag we use to see if
|
|
|
|
# the logged-in user is a member of the current team does not benefit from the prefetching,
|
|
|
|
# also the getting of team responsible members and their profiles do not use the prefetching
|
|
|
|
# :( /tyk
|
|
|
|
return qs
|
|
|
|
|
2018-08-12 14:50:53 +00:00
|
|
|
def get_context_data(self, *, object_list=None, **kwargs):
|
|
|
|
context = super().get_context_data(object_list=object_list, **kwargs)
|
|
|
|
if self.request.user.is_authenticated:
|
2019-06-16 12:32:24 +00:00
|
|
|
context["user_teams"] = self.request.user.teammember_set.filter(
|
|
|
|
team__camp=self.camp
|
|
|
|
)
|
2018-08-12 14:50:53 +00:00
|
|
|
return context
|
|
|
|
|
2017-03-31 15:29:28 +00:00
|
|
|
|
2018-07-22 21:18:50 +00:00
|
|
|
class TeamGeneralView(CampViewMixin, DetailView):
|
|
|
|
template_name = "team_general.html"
|
2019-06-16 12:32:24 +00:00
|
|
|
context_object_name = "team"
|
2017-05-24 05:49:32 +00:00
|
|
|
model = Team
|
2019-06-16 12:32:24 +00:00
|
|
|
slug_url_kwarg = "team_slug"
|
|
|
|
active_menu = "general"
|
2017-05-24 05:49:32 +00:00
|
|
|
|
Merge teamcomms branch. Refactor team app and add events app.
* Primary commit towards improved team communications. Add new events app to handle team notifications when various events happen, with a Type model which contain event types and a Routing model which controls routing of events to teams. Add shortslug for Camp and Team models. events.handler.py contains the code for sending irc and email notifications for teams. The first two eventtypes have been added in datamigrations, 'ticket_created' and 'public_credit_name_changed', and the tickets and profile apps have been adjusted accordingly. Team IRC channels can be marked as managed and if so the IRC bot will register the team channel with ChanServ if possible. Team IRC channels can be marked as private and the bot will set invite only and maintain an ACL with team members. Users can set their NickServ username in their profile to get on the ACL. Rework all team views and templates. Remove TeamArea model and make Team have an FK to Camp directly. Add docstrings a whole bunch of places. Move signal handlers to apps.py and signal_handlers.py in a few apps. Add basic team mailing list handling, more work to be done. Update bootstrap-devsite script to add more teammembers and add some team event routing for the two eventtypes we have.
* default to the console backend for email unless we specifically ask for realworld email
* fix signal for public_credit_name approval irc message
* fix name display on /people/ page
* fix the text on people pages when all non-responsible team members are anonymous
* handle cases where we fallback to the area responsible properly
* readd removed property, it is used in team_detail view
* make it possible to filter profiles by public_credit_name_approved
* add method for sending IRC messages in ircbot.utils.add_irc_message(), extend periodic bot method to do more than check for outgoing messages so rename it, refactor chanserv and nickserv handling code, create methods to check and join/part IRC channels as needed, maintain channel ACLs for private channels, do not autojoin any channels when instatiating the bot instead rely on the new check_irc_channels() method to join them, rename profile presave signal, add checking for changed nickserv usernames for acl handling, add teammember.irc_channel_acl_ok boolean to track ACL state, add missing help_text properties to TeamMember fields, rename teammember postsave signal, add teammember deleted signal, readd wrongly deleted EnsureTeamMemberResponsibleMixin
* add a few missing early returns
2018-04-09 21:11:05 +00:00
|
|
|
def get_context_data(self, **kwargs):
|
2018-07-22 21:18:50 +00:00
|
|
|
context = super().get_context_data(**kwargs)
|
2019-06-16 12:32:24 +00:00
|
|
|
context["IRCBOT_SERVER_HOSTNAME"] = settings.IRCBOT_SERVER_HOSTNAME
|
|
|
|
context["IRCBOT_PUBLIC_CHANNEL"] = settings.IRCBOT_PUBLIC_CHANNEL
|
Merge teamcomms branch. Refactor team app and add events app.
* Primary commit towards improved team communications. Add new events app to handle team notifications when various events happen, with a Type model which contain event types and a Routing model which controls routing of events to teams. Add shortslug for Camp and Team models. events.handler.py contains the code for sending irc and email notifications for teams. The first two eventtypes have been added in datamigrations, 'ticket_created' and 'public_credit_name_changed', and the tickets and profile apps have been adjusted accordingly. Team IRC channels can be marked as managed and if so the IRC bot will register the team channel with ChanServ if possible. Team IRC channels can be marked as private and the bot will set invite only and maintain an ACL with team members. Users can set their NickServ username in their profile to get on the ACL. Rework all team views and templates. Remove TeamArea model and make Team have an FK to Camp directly. Add docstrings a whole bunch of places. Move signal handlers to apps.py and signal_handlers.py in a few apps. Add basic team mailing list handling, more work to be done. Update bootstrap-devsite script to add more teammembers and add some team event routing for the two eventtypes we have.
* default to the console backend for email unless we specifically ask for realworld email
* fix signal for public_credit_name approval irc message
* fix name display on /people/ page
* fix the text on people pages when all non-responsible team members are anonymous
* handle cases where we fallback to the area responsible properly
* readd removed property, it is used in team_detail view
* make it possible to filter profiles by public_credit_name_approved
* add method for sending IRC messages in ircbot.utils.add_irc_message(), extend periodic bot method to do more than check for outgoing messages so rename it, refactor chanserv and nickserv handling code, create methods to check and join/part IRC channels as needed, maintain channel ACLs for private channels, do not autojoin any channels when instatiating the bot instead rely on the new check_irc_channels() method to join them, rename profile presave signal, add checking for changed nickserv usernames for acl handling, add teammember.irc_channel_acl_ok boolean to track ACL state, add missing help_text properties to TeamMember fields, rename teammember postsave signal, add teammember deleted signal, readd wrongly deleted EnsureTeamMemberResponsibleMixin
* add a few missing early returns
2018-04-09 21:11:05 +00:00
|
|
|
return context
|
|
|
|
|
2017-05-24 05:49:32 +00:00
|
|
|
|
|
|
|
class TeamManageView(CampViewMixin, EnsureTeamResponsibleMixin, UpdateView):
|
|
|
|
model = Team
|
|
|
|
template_name = "team_manage.html"
|
2019-06-16 12:32:24 +00:00
|
|
|
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",
|
|
|
|
"guide",
|
|
|
|
]
|
|
|
|
slug_url_kwarg = "team_slug"
|
2017-05-24 05:49:32 +00:00
|
|
|
|
|
|
|
def get_success_url(self):
|
2019-06-16 12:32:24 +00:00
|
|
|
return reverse_lazy(
|
|
|
|
"teams:general",
|
|
|
|
kwargs={"camp_slug": self.camp.slug, "team_slug": self.get_object().slug},
|
|
|
|
)
|
2017-04-02 16:04:57 +00:00
|
|
|
|
Merge teamcomms branch. Refactor team app and add events app.
* Primary commit towards improved team communications. Add new events app to handle team notifications when various events happen, with a Type model which contain event types and a Routing model which controls routing of events to teams. Add shortslug for Camp and Team models. events.handler.py contains the code for sending irc and email notifications for teams. The first two eventtypes have been added in datamigrations, 'ticket_created' and 'public_credit_name_changed', and the tickets and profile apps have been adjusted accordingly. Team IRC channels can be marked as managed and if so the IRC bot will register the team channel with ChanServ if possible. Team IRC channels can be marked as private and the bot will set invite only and maintain an ACL with team members. Users can set their NickServ username in their profile to get on the ACL. Rework all team views and templates. Remove TeamArea model and make Team have an FK to Camp directly. Add docstrings a whole bunch of places. Move signal handlers to apps.py and signal_handlers.py in a few apps. Add basic team mailing list handling, more work to be done. Update bootstrap-devsite script to add more teammembers and add some team event routing for the two eventtypes we have.
* default to the console backend for email unless we specifically ask for realworld email
* fix signal for public_credit_name approval irc message
* fix name display on /people/ page
* fix the text on people pages when all non-responsible team members are anonymous
* handle cases where we fallback to the area responsible properly
* readd removed property, it is used in team_detail view
* make it possible to filter profiles by public_credit_name_approved
* add method for sending IRC messages in ircbot.utils.add_irc_message(), extend periodic bot method to do more than check for outgoing messages so rename it, refactor chanserv and nickserv handling code, create methods to check and join/part IRC channels as needed, maintain channel ACLs for private channels, do not autojoin any channels when instatiating the bot instead rely on the new check_irc_channels() method to join them, rename profile presave signal, add checking for changed nickserv usernames for acl handling, add teammember.irc_channel_acl_ok boolean to track ACL state, add missing help_text properties to TeamMember fields, rename teammember postsave signal, add teammember deleted signal, readd wrongly deleted EnsureTeamMemberResponsibleMixin
* add a few missing early returns
2018-04-09 21:11:05 +00:00
|
|
|
def form_valid(self, form):
|
|
|
|
messages.success(self.request, "Team has been saved")
|
|
|
|
return super().form_valid(form)
|
|
|
|
|
2017-04-02 16:04:57 +00:00
|
|
|
|
2018-04-11 08:22:28 +00:00
|
|
|
class FixIrcAclView(LoginRequiredMixin, CampViewMixin, UpdateView):
|
|
|
|
template_name = "fix_irc_acl.html"
|
|
|
|
model = Team
|
|
|
|
fields = []
|
2019-06-16 12:32:24 +00:00
|
|
|
slug_url_kwarg = "team_slug"
|
2018-04-11 08:22:28 +00:00
|
|
|
|
|
|
|
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 :)
|
2019-06-16 12:32:24 +00:00
|
|
|
response = super().dispatch(request, *args, **kwargs)
|
2018-04-11 08:22:28 +00:00
|
|
|
|
|
|
|
# check if the logged in user has an approved membership of this team
|
|
|
|
if request.user not in self.get_object().approved_members.all():
|
2019-06-16 12:32:24 +00:00
|
|
|
messages.error(request, "No thanks")
|
|
|
|
return redirect(
|
|
|
|
"teams:general",
|
|
|
|
camp_slug=self.get_object().camp.slug,
|
|
|
|
team_slug=self.get_object().slug,
|
|
|
|
)
|
2018-04-11 08:22:28 +00:00
|
|
|
|
|
|
|
# check if we manage the channel for this team
|
2019-06-16 12:32:24 +00:00
|
|
|
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,
|
|
|
|
)
|
2018-04-11 08:22:28 +00:00
|
|
|
|
|
|
|
# check if user has a nickserv username
|
|
|
|
if not request.user.profile.nickserv_username:
|
2019-06-16 12:32:24 +00:00
|
|
|
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,
|
|
|
|
)
|
2018-04-11 08:22:28 +00:00
|
|
|
|
|
|
|
return response
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
|
# get membership
|
|
|
|
try:
|
|
|
|
TeamMember.objects.get(
|
|
|
|
user=request.user,
|
|
|
|
team=self.get_object(),
|
|
|
|
approved=True,
|
2019-06-16 12:32:24 +00:00
|
|
|
irc_channel_acl_ok=True,
|
2018-04-11 08:22:28 +00:00
|
|
|
)
|
|
|
|
except TeamMember.DoesNotExist:
|
|
|
|
# this membership is already marked as membership.irc_channel_acl_ok=False, no need to do anything
|
2019-06-16 12:32:24 +00:00
|
|
|
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,
|
|
|
|
)
|
2018-04-11 08:22:28 +00:00
|
|
|
|
2019-06-16 12:32:24 +00:00
|
|
|
return super().get(request, *args, **kwargs)
|
2018-04-11 08:22:28 +00:00
|
|
|
|
|
|
|
def form_valid(self, form):
|
|
|
|
membership = TeamMember.objects.get(
|
|
|
|
user=self.request.user,
|
|
|
|
team=self.get_object(),
|
|
|
|
approved=True,
|
2019-06-16 12:32:24 +00:00
|
|
|
irc_channel_acl_ok=True,
|
2018-04-11 08:22:28 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
membership.irc_channel_acl_ok = False
|
|
|
|
membership.save()
|
2019-06-16 12:32:24 +00:00
|
|
|
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,
|
|
|
|
)
|