from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth.mixins import LoginRequiredMixin from django.urls import reverse from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.views.base import BaseView, BaseModalFormView from user.forms.modals.team import NewTeamModalForm, EditTeamModalForm, RemoveTeamModalForm, LeaveTeamModalForm from user.forms.modals.user import UserContactForm from user.forms.team import TeamDataForm from user.forms.user import UserNotificationForm from user.models import User, Team from django.http import HttpRequest, Http404 from django.shortcuts import render, redirect, get_object_or_404 from django.utils.translation import gettext_lazy as _ from konova.contexts import BaseContext from konova.decorators import login_required_modal class UserDetailView(LoginRequiredMixin, BaseView): _TAB_TITLE = _("User settings") _TEMPLATE = "user/index.html" def get(self, request: HttpRequest): context = { "user": request.user, TAB_TITLE_IDENTIFIER: self._TAB_TITLE, } context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) class NotificationsView(LoginRequiredMixin, BaseView): _TEMPLATE = "user/notifications.html" _TAB_TITLE = _("User notifications") def get(self, request: HttpRequest): user = request.user form = UserNotificationForm(user=user, data=None) context = { "user": user, "form": form, TAB_TITLE_IDENTIFIER: self._TAB_TITLE, } context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) def post(self, request: HttpRequest): user = request.user form = UserNotificationForm(user=user, data=request.POST) if form.is_valid(): form.save() messages.success( request, _("Notifications edited") ) return redirect("user:detail") context = { "user": user, "form": form, TAB_TITLE_IDENTIFIER: self._TAB_TITLE, } context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) class ContactView(LoginRequiredMixin, BaseModalFormView): def get(self, request: HttpRequest, id: str): """ Renders contact modal view of a users contact data Args: request (HttpRequest): The incoming request id (str): The user's id Returns: """ user = get_object_or_404(User, id=id) form = UserContactForm(request.POST or None, instance=user, request=request) context = { "form": form, } context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) class TeamDetailModalView(LoginRequiredMixin, BaseModalFormView): def get(self, request: HttpRequest, id: str): """ Renders team data Args: request (HttpRequest): The incoming request id (str): The team's id Returns: """ team = get_object_or_404(Team, id=id) form = TeamDataForm(request.POST or None, instance=team, request=request) context = { "form": form, } context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) class TeamIndexView(LoginRequiredMixin, BaseView): _TEMPLATE = "user/team/index.html" _TAB_TITLE = _("Teams") def get(self, request: HttpRequest): user = request.user context = { "teams": user.shared_teams, "tab_title": self._TAB_TITLE, } context = BaseContext(request, context).context return render(request, self._TEMPLATE, context) @login_required_modal @login_required def new_team_view(request: HttpRequest): form = NewTeamModalForm(request.POST or None, request=request) return form.process_request( request, _("New team added"), redirect_url=reverse("user:team-index") ) @login_required_modal @login_required def edit_team_view(request: HttpRequest, id: str): team = get_object_or_404(Team, id=id) user_is_admin = team.is_user_admin(request.user) if not user_is_admin: raise Http404() form = EditTeamModalForm(request.POST or None, instance=team, request=request) return form.process_request( request, _("Team edited"), redirect_url=reverse("user:team-index") ) @login_required_modal @login_required def remove_team_view(request: HttpRequest, id: str): team = get_object_or_404(Team, id=id) user_is_admin = team.is_user_admin(request.user) if not user_is_admin: raise Http404() form = RemoveTeamModalForm(request.POST or None, instance=team, request=request) return form.process_request( request, _("Team removed"), redirect_url=reverse("user:team-index") ) @login_required_modal @login_required def leave_team_view(request: HttpRequest, id: str): team = get_object_or_404(Team, id=id) user = request.user is_user_team_member = team.users.filter(id=user.id).exists() if not is_user_team_member: messages.info( request, _("You are not a member of this team") ) return redirect("user:team-index") form = LeaveTeamModalForm(request.POST or None, instance=team, request=request) return form.process_request( request, _("Left Team"), redirect_url=reverse("user:team-index") )