* refactors deduction views on interventions and eco accounts from function to class based * introduces basic checks on shared access and permission on BaseView on dispatching --> checks shall be overwritten on inheriting classes
		
			
				
	
	
		
			207 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			207 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
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 UserBaseView(BaseView):
 | 
						|
    def _user_has_shared_access(self, user, **kwargs):
 | 
						|
        return True
 | 
						|
 | 
						|
    def _user_has_permission(self, user):
 | 
						|
        return True
 | 
						|
 | 
						|
 | 
						|
class UserDetailView(LoginRequiredMixin, UserBaseView):
 | 
						|
    _TEMPLATE = "user/index.html"
 | 
						|
    _TAB_TITLE = _("User settings")
 | 
						|
 | 
						|
    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, UserBaseView):
 | 
						|
    _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)
 | 
						|
 | 
						|
    def _user_has_shared_access(self, user, **kwargs):
 | 
						|
        # No specific constraints
 | 
						|
        return True
 | 
						|
 | 
						|
    def _user_has_permission(self, user):
 | 
						|
        # No specific constraints
 | 
						|
        return True
 | 
						|
 | 
						|
 | 
						|
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)
 | 
						|
 | 
						|
    def _user_has_shared_access(self, user, **kwargs):
 | 
						|
        # No specific constraints
 | 
						|
        return True
 | 
						|
 | 
						|
    def _user_has_permission(self, user):
 | 
						|
        # No specific constraints
 | 
						|
        return True
 | 
						|
 | 
						|
 | 
						|
class TeamIndexView(LoginRequiredMixin, UserBaseView):
 | 
						|
    _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")
 | 
						|
    )
 |