add when and completed to teamtask model, move task list to an included file
This commit is contained in:
parent
eb8e548c3f
commit
73ec701b06
24
src/teams/migrations/0043_auto_20180804_1641.py
Normal file
24
src/teams/migrations/0043_auto_20180804_1641.py
Normal 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),
|
||||||
|
),
|
||||||
|
]
|
|
@ -4,6 +4,7 @@ from django.dispatch import receiver
|
||||||
from django.utils.text import slugify
|
from django.utils.text import slugify
|
||||||
from utils.models import CampRelatedModel
|
from utils.models import CampRelatedModel
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
from django.contrib.postgres.fields import DateTimeRangeField
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.urls import reverse_lazy
|
from django.urls import reverse_lazy
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -280,6 +281,15 @@ class TeamTask(CampRelatedModel):
|
||||||
description = models.TextField(
|
description = models.TextField(
|
||||||
help_text='Description of the task. Markdown is supported.'
|
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:
|
class Meta:
|
||||||
ordering = ['name']
|
ordering = ['name']
|
||||||
|
|
44
src/teams/templates/includes/team_tasks.html
Normal file
44
src/teams/templates/includes/team_tasks.html
Normal 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>
|
||||||
|
|
|
@ -7,8 +7,15 @@
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading"><h4>Task: {{ task.name }}</h4></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 }}</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 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>
|
</div>
|
||||||
|
|
||||||
|
|
|
@ -53,41 +53,7 @@ Team: {{ team.name }} | {{ block.super }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{# Team tasks #}
|
{% include 'includes/team_tasks.html' %}
|
||||||
<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>
|
|
||||||
|
|
||||||
{# Team members #}
|
{# Team members #}
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
|
|
@ -94,5 +94,9 @@ Manage Team: {{ team.name }} | {{ block.super }}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{% include 'includes/team_tasks.html' %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ class TaskDetailView(CampViewMixin, DetailView):
|
||||||
class TaskCreateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMixin, CreateView):
|
class TaskCreateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMixin, CreateView):
|
||||||
model = TeamTask
|
model = TeamTask
|
||||||
template_name = "task_form.html"
|
template_name = "task_form.html"
|
||||||
fields = ['name', 'description']
|
fields = ['name', 'description', 'when', 'completed']
|
||||||
|
|
||||||
def get_context_data(self, *args, **kwargs):
|
def get_context_data(self, *args, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
@ -38,7 +38,7 @@ class TaskCreateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMix
|
||||||
class TaskUpdateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMixin, UpdateView):
|
class TaskUpdateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMixin, UpdateView):
|
||||||
model = TeamTask
|
model = TeamTask
|
||||||
template_name = "task_form.html"
|
template_name = "task_form.html"
|
||||||
fields = ['name', 'description']
|
fields = ['name', 'description', 'when', 'completed']
|
||||||
|
|
||||||
def get_context_data(self, *args, **kwargs):
|
def get_context_data(self, *args, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
@ -54,4 +54,4 @@ class TaskUpdateView(LoginRequiredMixin, CampViewMixin, EnsureTeamResponsibleMix
|
||||||
return HttpResponseRedirect(task.get_absolute_url())
|
return HttpResponseRedirect(task.get_absolute_url())
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return self.get_object().get_absolute_url()
|
return self.get_object().get_absolute_url()
|
||||||
|
|
Loading…
Reference in a new issue