Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
24 changes: 24 additions & 0 deletions managers/static/managers/scripts/delete_project_popup.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
$(function () {
$("#dialog").dialog ({
modal: true,
autoOpen: false,
buttons : [
{
text: "No",
click: function () {
$(this).dialog('close');
}
},
{
text: "Yes",
click: function () {
window.location.href = delete_project_path;
}
}
]
}).prev().find(".ui-dialog-titlebar-close").hide ();

$("#opener").click(function () {
$('#dialog').dialog('open');
});
});
19 changes: 18 additions & 1 deletion managers/templates/managers/project_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
{% load crispy_forms_tags %}

{% block content %}

<h2>
<small>
<a href="{{ back_url }}">
Expand All @@ -23,8 +22,26 @@ <h2>
<button type="submit" class="btn btn-default">{{ button_text }}</button>
</form>
</div>

{% if request.user.is_admin and object %}
<br/>
<button type="button" id="opener" class="btn btn btn-danger">
<span class="glyphicon glyphicon-remove"></span> Delete
</button>

<div id="dialog" style="display: none" title="{% trans 'Are you sure' %}?" align="center">
{% trans 'Do you want to delete' %} <br/>
<b>{{object.name}}</b> {% trans 'project' %}?
</div>
{% endif %}
{% endblock %}

{% block extra_script %}
{{ form.media }}
{% if request.user.is_admin and object %}
<script type="text/javascript">
var delete_project_path = "{% url 'custom-project-delete' pk=object.pk %}";
</script>
<script type="text/javascript" src="{% static 'managers/scripts/delete_project_popup.js' %}"></script>
{% endif %}
{% endblock %}
23 changes: 23 additions & 0 deletions managers/tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import datetime

from django.shortcuts import reverse
from parameterized import parameterized

from managers.factories import ProjectFactory
from managers.models import Project
from managers.tests.test_api import ProjectTest
from managers.views import ProjectCreateView
from managers.views import ProjectUpdateView
from users.models import CustomUser


class ProjectCreateTests(ProjectTest):
Expand Down Expand Up @@ -74,3 +76,24 @@ def test_project_update_view_should_update_project_on_post_if_data_is_invalid(se
self.assertEqual(response.status_code, 200)
self.project.refresh_from_db()
self.assertFormError(response, "form", "name", "This field is required.")


class DeleteProjectTests(ProjectTest):
def setUp(self):
super().setUp()
self.project = ProjectFactory()
self.url = reverse("custom-project-delete", kwargs={"pk": self.project.pk})

def test_delete_project_function_view_should_delete_project_on_admin_type_user_post(self):
response = self.client.post(self.url)
self.assertEqual(response.status_code, 302)
self.assertEqual(Project.objects.all().count(), 0)

@parameterized.expand([(CustomUser.UserType.EMPLOYEE.name,), (CustomUser.UserType.MANAGER.name,)])
def test_delete_project_function_view_should_not_delete_project_on_non_admin_request(self, user_type):
self.user.user_type = user_type
self.user.full_clean()
self.user.save()
response = self.client.post(self.url)
self.assertEqual(response.status_code, 302)
self.assertEqual(Project.objects.all().count(), 1)
1 change: 1 addition & 0 deletions managers/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@
url("^projects/create/$", views.ProjectCreateView.as_view(), name="custom-project-create"),
url("^projects/(?P<pk>[0-9]+)/$", views.ProjectDetail.as_view(), name="custom-project-detail"),
url("^projects/(?P<pk>[0-9]+)/update/$", views.ProjectUpdateView.as_view(), name="custom-project-update"),
url("^projects/(?P<pk>[0-9]+)/delete/$", views.ProjectDeleteView.as_view(), name="custom-project-delete"),
]
16 changes: 16 additions & 0 deletions managers/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@
from django.db.models.functions import Lower
from django.db.models.query import QuerySet
from django.http import HttpRequest
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from django.shortcuts import redirect
from django.shortcuts import reverse
from django.utils.translation import gettext_lazy as _
from django.views.generic import CreateView
from django.views.generic import DeleteView
from django.views.generic import ListView
from django.views.generic import UpdateView
from rest_framework import renderers
Expand Down Expand Up @@ -87,3 +90,16 @@ def get_context_data(self, **kwargs: Any) -> dict:

def get_success_url(self) -> str:
return reverse("custom-project-detail", kwargs={"pk": self.kwargs["pk"]})


class ProjectDeleteView(DeleteView):
model = Project

def dispatch(self, request: HttpRequest, *args: Any, **kwargs: Any) -> HttpResponse:
if not request.user.is_admin:
return redirect(reverse("home"))

return super().dispatch(request, *args, **kwargs)

def get_success_url(self) -> str:
return reverse("custom-projects-list")
2 changes: 2 additions & 0 deletions requirements.lock
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,12 @@ more-itertools==5.0.0
mypy==0.700
mypy-extensions==0.4.1
oauthlib==2.1.0
parameterized==0.7.0
parso==0.3.4
pbr==5.1.2
pexpect==4.6.0
pickleshare==0.7.5
pipdeptree==0.13.0
pluggy==0.8.1
prompt-toolkit==2.0.9
psycopg2==2.7.5
Expand Down
1 change: 1 addition & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ mypy
oauthlib
psycopg2
pylint
parameterized
pytest
pytest-cov
pytest-django
Expand Down
4 changes: 4 additions & 0 deletions users/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@ def email_user(self, subject: str, message: str, from_email: str = None) -> None
"""
send_mail(subject, message, from_email, [self.email])

@property
def is_admin(self) -> bool:
return self.user_type == CustomUser.UserType.ADMIN.name


@receiver(post_save, sender=CustomUser)
def update_from_manager_to_employee(sender: "CustomUser", **kwargs: Any) -> None:
Expand Down