add when and completed to teamtask model, move task list to an included file

This commit is contained in:
Thomas Steen Rasmussen 2018-08-04 17:38:09 +02:00
parent eb8e548c3f
commit 73ec701b06
7 changed files with 95 additions and 40 deletions

View File

@ -0,0 +1,24 @@
# Generated by Django 2.0.4 on 2018-08-04 14:41
import django.contrib.postgres.fields.ranges
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('teams', '0042_auto_20180413_1933'),
]
operations = [
migrations.AddField(
model_name='teamtask',
name='completed',
field=models.BooleanField(default=False, help_text='Check to mark this task as completed.'),
),
migrations.AddField(
model_name='teamtask',
name='when',
field=django.contrib.postgres.fields.ranges.DateTimeRangeField(blank=True, help_text='When does this task need to be started and/or finished?', null=True),
),
]

View File

@ -4,6 +4,7 @@ from django.dispatch import receiver
from django.utils.text import slugify
from utils.models import CampRelatedModel
from django.core.exceptions import ValidationError
from django.contrib.postgres.fields import DateTimeRangeField
from django.contrib.auth.models import User
from django.urls import reverse_lazy
from django.conf import settings
@ -280,6 +281,15 @@ class TeamTask(CampRelatedModel):
description = models.TextField(
help_text='Description of the task. Markdown is supported.'
)
when = DateTimeRangeField(
blank=True,
null=True,
help_text='When does this task need to be started and/or finished?'
)
completed = models.BooleanField(
help_text='Check to mark this task as completed.',
default=False
)
class Meta:
ordering = ['name']

View File

@ -0,0 +1,44 @@
<div class="panel panel-default">
<div class="panel-heading">
<h4>Tasks</h4>
</div>
<div class="panel-body">
<p>The {{ team.name }} Team is responsible for the following tasks</p>
<table class="table table-hover">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>When</th>
<th>Completed</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{% for task in team.tasks.all %}
<tr>
<td><a href="{% url 'teams:task_detail' slug=task.slug camp_slug=camp.slug team_slug=team.slug %}">{{ task.name }}</a></td>
<td>{{ task.description }}</td>
<td>
<ul>
<li>Start: {{ task.when.lower|default:"N/A" }}<br>
<li>Finish: {{ task.when.upper|default:"N/A" }}<br>
</ul>
</td>
<td>{{ task.completed }}</td>
<td>
<a href="{% url 'teams:task_detail' camp_slug=camp.slug team_slug=team.slug slug=task.slug %}" class="btn btn-primary btn-sm"><i class="fas fa-search"></i> Details</a>
{% if request.user in team.responsible_members.all %}
<a href="{% url 'teams:task_update' camp_slug=camp.slug team_slug=team.slug slug=task.slug %}" class="btn btn-primary btn-sm"><i class="fas fa-edit"></i> Edit Task</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if request.user in team.responsible_members.all %}
<a href="{% url 'teams:task_create' camp_slug=camp.slug team_slug=team.slug %}" class="btn btn-primary"><i class="fas fa-plus"></i> Create Task</a>
{% endif %}
</div>
</div>

View File

@ -7,8 +7,15 @@
{% block content %}
<div class="panel panel-default">
<div class="panel-heading"><h4>Task: {{ task.name }}</h4></div>
<div class="panel-body">{{ task.description|untrustedcommonmark }}</div>
<div class="panel-heading"><h4>Task: {{ task.name }} ({% if not task.completed %}Not {% endif %}Completed)</h4></div>
<div class="panel-body">
{{ task.description|untrustedcommonmark }}
<hr>
<ul>
<li>Start: {{ task.when.lower|default:"N/A" }}<br>
<li>Finish: {{ task.when.upper|default:"N/A" }}<br>
</ul>
</div>
<div class="panel-footer"><i>This task belongs to the <a href="{% url 'teams:detail' team_slug=task.team.slug camp_slug=task.team.camp.slug %}">{{ task.team.name }} Team</a></i></div>
</div>

View File

@ -53,41 +53,7 @@ Team: {{ team.name }} | {{ block.super }}
</div>
</div>
{# Team tasks #}
<div class="panel panel-default">
<div class="panel-heading">
<h4>Tasks</h4>
</div>
<div class="panel-body">
<p>The {{ team.name }} Team is responsible for the following tasks</p>
<table class="table table-hover">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Action</th>
</tr>
</thead>
<tbody>
{% for task in team.tasks.all %}
<tr>
<td><a href="{% url 'teams:task_detail' slug=task.slug camp_slug=camp.slug team_slug=team.slug %}">{{ task.name }}</a></td>
<td>{{ task.description }}</td>
<td>
<a href="{% url 'teams:task_detail' camp_slug=camp.slug team_slug=team.slug slug=task.slug %}" class="btn btn-primary btn-sm"><i class="fas fa-search"></i> Details</a>
{% if request.user in team.responsible_members.all %}
<a href="{% url 'teams:task_update' camp_slug=camp.slug team_slug=team.slug slug=task.slug %}" class="btn btn-primary btn-sm"><i class="fas fa-edit"></i> Edit Task</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if request.user in team.responsible_members.all %}
<a href="{% url 'teams:task_create' camp_slug=camp.slug team_slug=team.slug %}" class="btn btn-primary"><i class="fas fa-plus"></i> Create Task</a>
{% endif %}
</div>
</div>
{% include 'includes/team_tasks.html' %}
{# Team members #}
<div class="panel panel-default">

View File

@ -94,5 +94,9 @@ Manage Team: {{ team.name }} | {{ block.super }}
{% endif %}
</div>
</div>
{% include 'includes/team_tasks.html' %}
{% endblock %}

View File

@ -16,7 +16,7 @@ class TaskDetailView(CampViewMixin, DetailView):
class TaskCreateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMixin, CreateView):
model = TeamTask
template_name = "task_form.html"
fields = ['name', 'description']
fields = ['name', 'description', 'when', 'completed']
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(**kwargs)
@ -38,7 +38,7 @@ class TaskCreateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMix
class TaskUpdateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMixin, UpdateView):
model = TeamTask
template_name = "task_form.html"
fields = ['name', 'description']
fields = ['name', 'description', 'when', 'completed']
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(**kwargs)
@ -54,4 +54,4 @@ class TaskUpdateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMix
return HttpResponseRedirect(task.get_absolute_url())
def get_success_url(self):
return self.get_object().get_absolute_url()
return self.get_object().get_absolute_url()