Enable 'add task', series model fixes
This commit is contained in:
parent
54d683580f
commit
aec2fd76f3
@ -13,7 +13,7 @@
|
||||
padding: 9px 0;
|
||||
}
|
||||
.after-buttongroup {
|
||||
padding-top: 10px;
|
||||
padding-top: 12px;
|
||||
}
|
||||
|
||||
@media (max-width: 980px) {
|
||||
|
@ -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']
|
||||
|
@ -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):
|
||||
|
@ -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"));
|
||||
});
|
||||
|
@ -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'),
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user