Enable 'add task', series model fixes

This commit is contained in:
Thierry Carrez 2013-07-10 17:29:54 +02:00
parent 54d683580f
commit aec2fd76f3
6 changed files with 108 additions and 7 deletions

View File

@ -13,7 +13,7 @@
padding: 9px 0;
}
.after-buttongroup {
padding-top: 10px;
padding-top: 12px;
}
@media (max-width: 980px) {

View File

@ -20,9 +20,25 @@ class Project(models.Model):
name = models.CharField(max_length=50, primary_key=True)
title = models.CharField(max_length=100)
def __unicode__(self):
return self.name
class Series(models.Model):
SERIES_STATUS = (
(0, 'Old'),
(1, 'Supported'),
(2, 'Active'),
(3, 'Future'))
name = models.CharField(max_length=50, primary_key=True)
status = models.IntegerField(choices=SERIES_STATUS)
release_date = models.DateTimeField()
def __unicode__(self):
return self.name
class Meta:
ordering = ['release_date']
class Milestone(models.Model):
@ -30,5 +46,8 @@ class Milestone(models.Model):
series = models.ForeignKey(Series)
active = models.BooleanField(default=True)
def __unicode__(self):
return self.name
class Meta:
ordering = ['name']

View File

@ -36,6 +36,9 @@ class Story(models.Model):
story_type = models.CharField(max_length=1, choices=STORY_TYPES)
priority = models.IntegerField(choices=STORY_PRIORITIES)
def __unicode__(self):
return str(self.id)
class Task(models.Model):
TASK_STATUSES = (
@ -47,9 +50,13 @@ class Task(models.Model):
title = models.CharField(max_length=100, blank=True)
project = models.ForeignKey(Project)
series = models.ForeignKey(Series)
assignee = models.ForeignKey(User)
status = models.CharField(max_length=1, choices=TASK_STATUSES)
milestone = models.ForeignKey(Milestone)
assignee = models.ForeignKey(User, blank=True, null=True)
status = models.CharField(max_length=1, choices=TASK_STATUSES, default='T')
milestone = models.ForeignKey(Milestone, blank=True, null=True)
def __unicode__(self):
return "%s %s/%s" % (
self.story.id, self.project.name, self.series.name)
class Comment(models.Model):

View File

@ -7,7 +7,7 @@
<li class="nav-header">This story</li>
<li><a href="#editprio" data-toggle="modal">Change priority</a></li>
<li><a href="#editstory" data-toggle="modal">Modify story</a></li>
<li class="disabled"><a href="#">Add task</a></li>
<li><a href="#addtask" data-toggle="modal">Add task</a></li>
<li class="disabled"><a href="#">Order tasks</a></li>
</ul>
</div><!--/.well -->
@ -115,6 +115,47 @@
</div>
</div>
</form>
<!-- Add task modal -->
<form method="POST" action="/story/{{story.id}}/addtask">{% csrf_token %}
<div id="addtask" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="addTaskLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="addTaskLabel">Add new task</h3>
</div>
<div class="modal-body">
<label>Title <small>(optional)</small></label>
<input class="input-block-level" name="title"
type="text" placeholder="Optional task description" value="">
<label>Project</label>
<div class="input-prepend">
<span class="add-on"><i class="icon-cog"></i></span>
<input class="input-block-level" name="project" id="prependedInput"
type="text" value="">
</div>
<label>Series</label>
<div class="btn-group" data-toggle="buttons-radio">
{% for series in active_series %}
{% if series.status == 2 %}
<button type="button" data-value="{{ series.name }}"
class="series btn btn-small active">Current ({{series.name}})</button>
{% else %}
<button type="button" data-value="{{ series.name }}"
class="series btn btn-small
{% if series.status == 1 %}btn-success{% endif %}">{{ series.name }}</button>
{% endif %}
{% endfor %}
</div>
<label class="after-buttongroup">Comment</label>
<textarea class="input-block-level" rows="6" name="comment"
placeholder="Add a comment"></textarea>
<input type="hidden" id="series" name="series" value="">
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<input class="btn btn-primary" type="submit" value="Add task">
</div>
</div>
</form>
<!-- Set priority Modal -->
<form method="POST" action="/story/{{ story.id }}/priority">
<div id="editprio" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="editPriolLabel" aria-hidden="true">
@ -203,6 +244,9 @@
{% endfor %}
{% endblock %}
{% block moarscript %}
$(".series").click(function() {
$("#series").val($(this).data("value"));
});
$(".prio").click(function() {
$("#priority").val($(this).data("value"));
});

View File

@ -19,6 +19,7 @@ from django.conf.urls.defaults import *
urlpatterns = patterns('stories.views',
(r'^$', 'dashboard'),
(r'^(\d+)$', 'view'),
(r'^(\d+)/addtask$', 'add_task'),
(r'^(\d+)/edit$', 'edit_story'),
(r'^(\d+)/comment$', 'comment'),
(r'^(\d+)/priority$', 'set_priority'),

View File

@ -18,7 +18,7 @@ from django.views.decorators.http import require_POST
from django.http import HttpResponseRedirect, HttpResponseForbidden
from django.shortcuts import render
from django.contrib.auth.models import User
from projects.models import Milestone
from projects.models import Project, Milestone, Series
from stories.models import Story, Task, Comment, StoryTag
def dashboard(request):
@ -27,12 +27,14 @@ def dashboard(request):
def view(request, storyid):
story = Story.objects.get(id=storyid)
active_series = Series.objects.filter(status__gt=0)
milestones = Milestone.objects.all()
return render(request, "stories.view.html", {
'story': story,
'milestones': milestones,
'priorities': Story.STORY_PRIORITIES,
'taskstatuses': Task.TASK_STATUSES,
'active_series': active_series,
})
@login_required
@ -68,6 +70,34 @@ def set_priority(request, storyid):
newcomment.save()
return HttpResponseRedirect('/story/%s' % storyid)
@login_required
@require_POST
def add_task(request, storyid):
story = Story.objects.get(id=storyid)
try:
if request.POST['series']:
series=Series.objects.get(name=request.POST['series'])
else:
series=Series.objects.get(status=2)
newtask = Task(
story=story,
title=request.POST['title'],
project=Project.objects.get(name=request.POST['project']),
series=series,
)
newtask.save()
msg = "Added %s/%s task " % (
newtask.project.name, newtask.series.name)
newcomment = Comment(story=story,
action=msg,
author=request.user,
comment_type="indent-left",
content=request.POST.get('comment', ''))
newcomment.save()
except KeyError as e:
pass
return HttpResponseRedirect('/story/%s' % story.id)
@login_required
@require_POST
def edit_task(request, taskid):
@ -96,7 +126,7 @@ def edit_task(request, taskid):
newcomment = Comment(story=task.story,
action=msg,
author=request.user,
comment_type="tasks",
comment_type="align-left",
content=request.POST.get('comment', ''))
newcomment.save()
except KeyError as e: