Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
139 changes: 139 additions & 0 deletions back/admin/people/department_views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
from django.contrib.messages.views import SuccessMessageMixin
from django.shortcuts import get_object_or_404, render
from django.urls import reverse_lazy
from django.utils.translation import gettext as _
from django.views.generic.base import View
from django.views.generic.edit import CreateView, UpdateView
from django.views.generic.list import ListView

from users.mixins import AdminOrManagerPermMixin
from users.models import Department, Role
from users.selectors import (
get_all_users_for_departments_of_user,
get_available_departments_for_user,
get_available_roles_for_user,
)


class DepartmentListView(AdminOrManagerPermMixin, ListView):
template_name = "departments.html"
paginate_by = 20
context_object_name = "departments"

def get_queryset(self):
return get_available_departments_for_user(
user=self.request.user
).prefetch_related("roles__users")

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = _("Roles and departments")
context["subtitle"] = _("people")
context["users"] = get_all_users_for_departments_of_user(user=self.request.user)
return context
Comment thread
GDay marked this conversation as resolved.


class DepartmentCreateView(AdminOrManagerPermMixin, SuccessMessageMixin, CreateView):
template_name = "department_create.html"
model = Department
fields = [
"name",
]
success_message = _("Department has been created")
success_url = reverse_lazy("people:departments")

def form_valid(self, form):
response = super().form_valid(form)
if self.request.user.is_manager:
self.request.user.departments.add(self.object)
return response

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = _("Roles and departments")
context["subtitle"] = _("people")
return context


class DepartmentRoleCreateView(
AdminOrManagerPermMixin, SuccessMessageMixin, CreateView
):
template_name = "role_create.html"
model = Role
fields = [
"name",
]
success_message = _("Role has been created")
success_url = reverse_lazy("people:departments")

def dispatch(self, *args, **kwargs):
self.department = get_object_or_404(
get_available_departments_for_user(user=self.request.user),
id=self.kwargs.get("pk"),
)
return super().dispatch(*args, **kwargs)

def form_valid(self, form):
form.instance.department = self.department
return super().form_valid(form)

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = _("Roles")
context["subtitle"] = _("people")
return context


class AddUserToRoleView(AdminOrManagerPermMixin, SuccessMessageMixin, View):
def post(self, request, role_pk, user_pk, **kwargs):
role = get_object_or_404(
get_available_roles_for_user(user=request.user), id=role_pk
)
user = get_object_or_404(
get_all_users_for_departments_of_user(user=request.user), id=user_pk
)

role.users.add(user)
return render(
request,
"_departments_list.html",
{"departments": get_available_departments_for_user(user=self.request.user)},
Comment thread
GDay marked this conversation as resolved.
Outdated
)


class DepartmentUpdateView(AdminOrManagerPermMixin, SuccessMessageMixin, UpdateView):
template_name = "department_update.html"
fields = [
"name",
]
success_message = _("Department has been updated")
success_url = reverse_lazy("people:departments")

def get_queryset(self):
return get_available_departments_for_user(user=self.request.user)

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = _("Department")
context["subtitle"] = _("people")
return context


class DepartmentRoleUpdateView(
AdminOrManagerPermMixin, SuccessMessageMixin, UpdateView
):
template_name = "role_update.html"
fields = [
"name",
]
success_message = _("Role has been updated")
success_url = reverse_lazy("people:departments")

def get_queryset(self):
return get_available_roles_for_user(user=self.request.user)

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context["title"] = _("Role")
context["subtitle"] = _("people")
return context
52 changes: 52 additions & 0 deletions back/admin/people/templates/_departments_list.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
{% load static crispy_forms_tags %}
Comment thread
GDay marked this conversation as resolved.
Outdated
{% load i18n %}

{% for department in departments %}
<div class="card mb-4">
<div class="card-header">
<div class="col-11">
<h3 class="card-title">{{ department }}</h3>
</div>
<div class="col-1 text-end">
<a class="btn btn-azure btn-sm" href="{% url "people:department_update" department.pk %}">
{% include "_edit_icon.html" %}
</a>
</div>
</div>
<div class="card-body">
{% for role in department.roles.all %}
<div class="drop mb-2" data-role-id="{{role.id}}">
<h3 class="card-title mb-2">{{ role }}</h3>
{% if role.users.all|length %}
Comment thread
GDay marked this conversation as resolved.
Outdated
<ul class="list-group list-group-flush">

{% for user in role.users.all %}
<li class="list-group-item" style="padding: 4px;">
Comment thread
GDay marked this conversation as resolved.
Outdated
{% if user.profile_image is not None %}
Comment thread
GDay marked this conversation as resolved.
Outdated
<span class="avatar me-2 avatar-xs" style="background-image: url({{ user.profile_image.get_url }})"></span>
{% else %}
<span class="avatar me-2 avatar-xs">{{ user.initials }}</span>
{% endif %}
{{ user.name }}
</li>
{% endfor %}
</ul>
{% else %}
{% trans "No users have been added to this role yet." %}
{% endif %}
</div>
{% endfor %}
{% if department.roles.all|length == 0 %}
Comment thread
GDay marked this conversation as resolved.
Outdated
{% trans "No roles have been added to this department yet." %}
<br/>
<a type="submit" class="btn btn-primary btn-sm mt-2" href="{% url "people:department_role_create" department.id %}">{% trans "Add role" %}</a>
Comment thread
GDay marked this conversation as resolved.
Outdated
{% endif %}
</div>
</div>
{% empty %}
<div class="card mb-4">
<div class="card-header">
{% trans "There are no departments yet." %}
</div>
</div>
{% endfor %}
51 changes: 51 additions & 0 deletions back/admin/people/templates/department_update.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
{% extends 'admin_base.html' %}
{% load i18n %}
{% load crispy_forms_tags %}

{% block content %}
<div class="row justify-content-md-center">
<div class="col-md-8 col-12">
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title">{{ object.name }}</h3>
</div>
<div class="card-body">
<form action="." method="post">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-primary">{% trans "Update" %}</button>
</form>
</div>
</div>
<div class="card mt-3">
<div class="card-header">
<h3 class="card-title">{% trans "Roles" %}</h3>
</div>
<div class="card-body">
<div class="divide-y">
{% for role in department.roles.all %}
<div class="row">
<div class="col">
<p style="margin-bottom:0px">{{ role }}</p>
Comment thread
GDay marked this conversation as resolved.
Outdated
</div>
<div class="col">
<div class="text-end">
<a class="btn btn-azure btn-sm" href="{% url "people:department_role_update" department.pk role.pk %}">
{% include "_edit_icon.html" %}
</a>
</div>
</div>
</div>
{% empty %}
<p class="mb-0">{% trans "No roles added yet" %}</p>
{% endfor %}
</div>
<a class="btn btn-primary mt-4" href="{% url "people:department_role_create" department.pk %}">
{% trans "Add" %}
</a>
</div>
</div>
</div>
</div>
{% endblock %}

Loading