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
11 changes: 11 additions & 0 deletions managers/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from bootstrap_datepicker_plus import DatePickerInput
from django import forms

from managers.models import Project


class ProjectForm(forms.ModelForm):
class Meta:
model = Project
fields = "__all__"
widgets = {"start_date": DatePickerInput(format="%Y-%m-%d"), "stop_date": DatePickerInput(format="%Y-%m-%d")}
19 changes: 19 additions & 0 deletions managers/migrations/0003_auto_20190405_0058.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 2.1.1 on 2019-04-05 00:58

from django.conf import settings
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('managers', '0002_auto_20190403_1125'),
]

operations = [
migrations.AlterField(
model_name='project',
name='members',
field=models.ManyToManyField(help_text='How to add more employees? Select by CTRL + click', related_name='projects', to=settings.AUTH_USER_MODEL),
),
]
5 changes: 4 additions & 1 deletion managers/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from django.db.models.query import QuerySet
from django.db.models.signals import m2m_changed
from django.dispatch import receiver
from django.utils.translation import gettext_lazy as _

from managers.commons.constants import MAX_NAME_LENGTH
from users.models import CustomUser
Expand All @@ -28,7 +29,9 @@ class Project(models.Model):
stop_date = models.DateField(null=True, blank=True)
terminated = models.BooleanField(default=False)
managers = models.ManyToManyField(CustomUser, related_name="manager_projects")
members = models.ManyToManyField(CustomUser, related_name="projects")
members = models.ManyToManyField(
CustomUser, related_name="projects", help_text=_("How to add more employees? Select by CTRL + click")
)

objects = ProjectQuerySet.as_manager()

Expand Down
2 changes: 1 addition & 1 deletion managers/templates/managers/project_detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ <h2>
</small>
&nbsp;{{ project.name }}&nbsp;
<small>
<a href="#">
<a href="{% url 'custom-project-update' pk=project.id %}">
<span class="glyphicon glyphicon-pencil"></span>
</a>
</small>
Expand Down
30 changes: 30 additions & 0 deletions managers/templates/managers/project_update.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{% extends 'base.html' %}

{% load i18n %}
{% load static %}
{% load rest_framework %}
{% load crispy_forms_tags %}

{% block content %}

<h2>
<small>
<a href="{% url 'custom-project-detail' pk=project.id %}">
<span class="glyphicon glyphicon-chevron-left"></span>
</a>
</small>
&nbsp;{{project.name}}&nbsp;
</h2>

<div class="modal-dialog" style="margin-bottom:0">
<form action="{% url 'custom-project-update' pk=project.id %}" method="post">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-default">{% trans "Update" %}</button>
</form>
</div>
{% endblock %}

{% block extra_script %}
{{ form.media }}
{% endblock %}
143 changes: 143 additions & 0 deletions managers/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import datetime

from django.test import TestCase
from rest_framework.reverse import reverse
from rest_framework.test import APIRequestFactory

from managers import views
from managers.factories import ProjectFactory
from managers.models import Project
from users.models import CustomUser


Expand Down Expand Up @@ -50,3 +55,141 @@ def test_project_list_view_should_display_project_list_ordered_by_name_regardles

self.assertEqual(response.status_code, 200)
self.assertEqual([project["name"] for project in response.data], expected_project_order)


class ProjectTest(TestCase):
def setUp(self):
super().setUp()
self.user = CustomUser(
email="testuser@codepoets.it",
first_name="John",
last_name="Doe",
country="PL",
user_type=CustomUser.UserType.ADMIN.name,
)
self.user.set_password("newuserpasswd")
self.user.full_clean()
self.user.save()
self.client.force_login(self.user)

self.project = Project(
name="Example Project",
start_date=datetime.datetime.now().date() - datetime.timedelta(days=30),
stop_date=datetime.datetime.now().date(),
terminated=False,
)
self.project.full_clean()
self.project.save()
self.project.managers.add(self.user)
self.project.members.add(self.user)


class CustomProjectsListTests(ProjectTest):
def setUp(self):
super().setUp()
self.url = reverse("custom-projects-list")

def test_project_list_view_should_display_projects_list_on_get(self):
request = APIRequestFactory().get(path=self.url)
request.user = self.user
response = views.ProjectsList.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertContains(response, self.project.name)
projects_list = response.context_data["object_list"]
self.assertTrue(self.project in projects_list)

def test_projects_list_view_should_show_for_managers_only_own_projects(self):
self.user.user_type = CustomUser.UserType.MANAGER.name
manager_project_list = Project.objects.filter(managers__id=self.user.pk)
request = APIRequestFactory().get(path=self.url)
request.user = self.user
response = views.ProjectsList.as_view()(request)
self.assertEqual(response.status_code, 200)
self.assertContains(response, self.project.name)
projects_list = response.context_data["object_list"]
self.assertEqual(list(manager_project_list), list(projects_list))

def test_project_list_view_should_display_projects_sorted_by_name_ascending(self):
request = APIRequestFactory().get(path=self.url + "?sort=name")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("name" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_name_descending(self):
request = APIRequestFactory().get(path=self.url + "?sort=-name")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("-name" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_start_date_ascending(self):
request = APIRequestFactory().get(path=self.url + "?sort=start_date")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("start_date" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_start_date_descending(self):
request = APIRequestFactory().get(path=self.url + "?sort=-start_date")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("-start_date" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_stop_date_ascending(self):
request = APIRequestFactory().get(path=self.url + "?sort=stop_date")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("stop_date" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_stop_date_descending(self):
request = APIRequestFactory().get(path=self.url + "?sort=-stop_date")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("-stop_date" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_members_count_ascending(self):
request = APIRequestFactory().get(path=self.url + "?sort=members_count")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("members_count" in projects_list.query.order_by)

def test_project_list_view_should_display_projects_sorted_by_members_count_descending(self):
request = APIRequestFactory().get(path=self.url + "?sort=-members_count")
request.user = self.user
response = views.ProjectsList.as_view()(request)
projects_list = response.context_data["object_list"]
self.assertTrue(projects_list.ordered)
self.assertTrue("-members_count" in projects_list.query.order_by)


class ProjectDetailTests(ProjectTest):
def setUp(self):
super().setUp()
self.url = reverse("custom-project-detail", args=(self.project.pk,))

def test_project_detail_view_should_display_project_details_on_get(self):
request = APIRequestFactory().get(path=self.url)
request.user = self.user
response = views.ProjectDetail.as_view()(request, self.project.pk)
self.assertEqual(response.status_code, 200)
self.assertContains(response, self.project.name)
project = response.data["project"]
self.assertEqual(self.project, project)

def test_project_detail_view_should_return_404_status_code_on_get_if_project_does_not_exist(self):
request = APIRequestFactory().get(path=self.url)
request.user = self.user
response = views.ProjectDetail.as_view()(request, self.project.pk + 1)
self.assertEqual(response.status_code, 404)
142 changes: 0 additions & 142 deletions managers/tests/test_unit_managers_apiview.py

This file was deleted.

Loading