from django.contrib import messages from django.contrib.auth.decorators import login_required from django.urls import reverse from konova.sub_settings.context_settings import TAB_TITLE_IDENTIFIER from konova.utils.mailer import Mailer from konova.utils.message_templates import FORM_INVALID 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 any_group_check, default_group_required from user.forms import UserNotificationForm, UserContactForm, UserAPITokenForm, NewTeamModalForm, EditTeamModalForm, \ RemoveTeamModalForm, TeamDataForm, LeaveTeamModalForm @login_required @any_group_check def index_view(request: HttpRequest): """ Renders the user's data index view Args: request (): Returns: """ template = "user/index.html" context = { "user": request.user, TAB_TITLE_IDENTIFIER: _("User settings"), } context = BaseContext(request, context).context return render(request, template, context) @login_required @any_group_check def notifications_view(request: HttpRequest): """ Renders the notifications settings view Args: request (): Returns: """ template = "user/notifications.html" user = request.user form = UserNotificationForm(user=user, data=request.POST or None) if request.method == "POST": if form.is_valid(): form.save() messages.success( request, _("Notifications edited") ) return redirect("user:index") elif request.method == "GET": # Implicit pass else: raise NotImplementedError context = { "user": user, "form": form, TAB_TITLE_IDENTIFIER: _("User notifications"), } context = BaseContext(request, context).context return render(request, template, context) @login_required @default_group_required def api_token_view(request: HttpRequest): """ Handles the request for user api frontend settings Args: request (HttpRequest): The incoming request Returns: """ template = "user/token.html" user = request.user form = UserAPITokenForm(request.POST or None, instance=user) if request.method == "POST": if form.is_valid(): token = form.save() messages.info(request, _("New token generated. Administrators need to validate.")) mailer = Mailer() mailer.send_mail_verify_api_token(user) return redirect("user:api-token") else: messages.error(request, FORM_INVALID, extra_tags="danger") elif request.method != "GET": raise NotImplementedError context = { "user": user, "form": form, TAB_TITLE_IDENTIFIER: _("User API token"), } context = BaseContext(request, context).context return render(request, template, context) @login_required def contact_view(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) template = "modal/modal_form.html" context = { "form": form, } context = BaseContext(request, context).context return render( request, template, context ) @login_required def data_team_view(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) template = "modal/modal_form.html" context = { "form": form, } context = BaseContext(request, context).context return render( request, template, context ) @login_required def index_team_view(request: HttpRequest): template = "user/team/index.html" user = request.user context = { "teams": user.teams.all(), "tab_title": _("Teams"), } context = BaseContext(request, context).context return render(request, template, context) @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 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 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 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") )