diff --git a/mgmt/debug.py b/mgmt/debug.py
index 1ddf816..6f47c55 100644
--- a/mgmt/debug.py
+++ b/mgmt/debug.py
@@ -6,8 +6,4 @@ def message(str):
messages.append(str)
def dump():
- if messages:
- m = ["<p>%s</p>" % msg for msg in messages]
- return "<div class='debug'>\n" + '\n'.join(m) + "\n</div>\n"
- else:
- return ""
+ return messages
diff --git a/mgmt/models.py b/mgmt/models.py
index 24f28fa..9dbc094 100644
--- a/mgmt/models.py
+++ b/mgmt/models.py
@@ -21,13 +21,20 @@ class Project(Object):
class Admin:
pass
+class BugState(models.Model):
+ name = models.CharField(max_length=64)
+ def __unicode__(self):
+ return self.name
+ class Admin:
+ pass
+
class Bug(Object):
fixed = models.DateTimeField(null=True)
project = models.ForeignKey(Project)
author = models.ForeignKey(User,related_name='created_bugs')
confirmed = models.ForeignKey(User,related_name='confirmed_bugs',null=True)
responsible = models.ForeignKey(User,related_name='resp_bugs',null=True)
- status = models.IntegerField()
+ status = models.ForeignKey(BugState)
class Meta:
ordering = ("-created",)
class Admin:
diff --git a/mgmt/rights.py b/mgmt/rights.py
index 3141903..f7e7a7a 100644
--- a/mgmt/rights.py
+++ b/mgmt/rights.py
@@ -1,27 +1,43 @@
+import debug
+from models import BugState
def set_responsible(bug,user):
bug.responsible = user
bug_rights = {
- (0,1): ('Team',None),
- (0,4): ('Admin',None),
- (1,0): ('Admin',None),
- (1,2): ('Team', set_responsible),
- (1,4): ('Admin',None),
- (2,3): ('Team',None),
+ (1,2): ('Team',None),
+ (1,5): ('Admin',None),
+ (2,1): ('Admin',None),
+ (2,3): ('Team', set_responsible),
+ (2,5): ('Admin',None),
(3,4): ('Team',None),
- (4,0): ('Team',None) }
+ (4,5): ('Team',None),
+ (5,1): ('Team',None) }
+
+def can_change_bug_state(user,bug,new_state):
+ if (bug.status.id,new_state) in bug_rights:
+ cat,proc = bug_rights[(bug.status.id,new_state)]
+ if cat=='Team':
+ return user in bug.project.team.iterator()
+ if cat=='Admin':
+ return user in bug.project.admins.iterator()
+ return False
def can(user,action,object=None,target=None):
if action in ['comment','send bug']:
return user.is_authenticated()
if action in ['create', 'edit', 'delete']:
return user.is_authenticated() and user.has_perm('mgmt.%s.%s' % (object,action))
+ if action == 'document':
+ return user in object.team.iterator()
if object.__class__.__name__ == 'Bug':
- if (object.status,target) in bug_rights:
- cat,proc = bug_rights[(object.status,target)]
- if cat=='Team':
- return user in object.team
- if cat=='Admin':
- return user in object.admins
- return False
+ return can_change_bug_state(user,object,target)
+ return False
+
+def possible_changes(bug,user):
+ r = []
+ for new in range(1,6):
+ if can_change_bug_state(user,bug,new):
+ r.append(BugState.objects.get(pk=new))
+ return r
+
diff --git a/mgmt/views.py b/mgmt/views.py
index ca9f8a6..8019064 100644
--- a/mgmt/views.py
+++ b/mgmt/views.py
@@ -11,7 +11,7 @@ import django.newforms as forms
from models import *
from context import add_blocks,debug_messages
-from rights import can
+from rights import can,possible_changes
def render_it(template,dict,request):
c = RequestContext(request,dict,[add_blocks,debug_messages])
@@ -31,7 +31,7 @@ class BugForm(forms.Form):
class DocForm(forms.Form):
name = forms.CharField()
- project = forms.ModelChoiceField(Project.objects.all())
+# project = forms.ModelChoiceField(Project.objects.all())
text = forms.CharField(widget=forms.Textarea())
def main(request):
@@ -66,10 +66,11 @@ def project_bugs(request,id):
if request.method=='POST':
name = request.POST['name']
text = request.POST['text']
+ s0 = BugState.objects.get(pk=1)
b = Bug(created=datetime.now(),
author = request.user,
project = project,
- status = 0,
+ status = s0,
name = name,
text = text)
b.save()
@@ -115,12 +116,54 @@ def one_document(request,id):
'form': form},
request)
-def create_document(request):
+def one_bug(request,id):
+ bug = Bug.objects.get(pk=id)
+ if request.method=='POST':
+ if request.POST['action']=='comment':
+ title = request.POST['title']
+ text = request.POST['text']
+ c = Comment(created=datetime.now(),
+ author = request.user,
+ object_id = bug.id,
+ object_type = 'Bug',
+ title = title,
+ text = text)
+ c.save()
+ elif request.POST['action']=='change_state':
+ new_state = request.POST['new_state']
+ bug.status = BugState.objects.get(pk=new_state)
+ if bug.status.id==3:
+ bug.responsible = request.user
+ bug.save()
+ comments = Comment.objects.filter(object_id=bug.id,object_type='Bug')
+ change_states = possible_changes(bug,request.user)
+ if change_states:
+ choices = [(st.id,st.name) for st in change_states]
+
+ class BugStateForm(forms.Form):
+ new_state = forms.ChoiceField(choices)
+
+ state_form = BugStateForm()
+ else:
+ state_form = None
+ if can(request.user,'comment'):
+ form = CommentForm()
+ else:
+ form = None
+ return render_it('bug.html',
+ {'bug': bug,
+ 'change_state': state_form,
+ 'project': bug.project,
+ 'comments': comments,
+ 'form': form},
+ request)
+
+def create_document(request,pid):
msg = ""
+ project = Project.objects.get(pk=pid)
if request.method=='POST':
name = request.POST['name']
text = request.POST['text']
- project = Project.objects.get(pk=request.POST['project'])
d = Document(name=name,
text=text,
created=datetime.now(),
@@ -128,7 +171,7 @@ def create_document(request):
project=project)
d.save()
msg = u"Документ создан"
- if can(request.user,'create','document'):
+ if can(request.user,'document',project):
form = DocForm()
else:
form = None
diff --git a/templates/base.html b/templates/base.html
index 07ec506..703e855 100644
--- a/templates/base.html
+++ b/templates/base.html
@@ -31,7 +31,11 @@
<div id='footer'>
{% block footer %}
- {{debug}}
+ <div class='debug'>
+ {% for msg in debug %}
+ {{msg}}
+ {% endfor %}
+ </div>
{% endblock %}
</div>
</div>
diff --git a/templates/bug.html b/templates/bug.html
new file mode 100644
index 0000000..f02ada5
--- /dev/null
+++ b/templates/bug.html
@@ -0,0 +1,18 @@
+{% extends "base.html" %}
+
+{% block title %}Баг: {{bug.name}}{% endblock %}
+
+{% block main %}
+{% include "bug_body.html" %}
+
+{% if change_state %}
+<h3>Сменить состояние бага</h3>
+<form action='.' method='post'>
+ {{change_state.as_p}}
+ <input type='hidden' name='action' value='change_state'/>
+ <input type='submit'/>
+</form>
+{% endif %}
+
+{% include "comments.html" %}
+{% endblock %}
diff --git a/templates/bug_body.html b/templates/bug_body.html
index e97445b..2ab1b5b 100644
--- a/templates/bug_body.html
+++ b/templates/bug_body.html
@@ -1,6 +1,6 @@
{% load prj_filters %}
- <div class='bug bug-state-{{bug.status}}'>
- <p><strong>{{bug.name}}</strong></p>
+ <div class='bug bug-state-{{bug.status.id}}'>
+ <h3><a href='/bugs/{{bug.id}}/'>Баг #{{bug.id}}: {{bug.name}}</a></h3>
<div class='project-link'>{{project|link|safe}}</div>
<p>{{bug.text}}</p>
</div>
diff --git a/templates/comments.html b/templates/comments.html
index eac66dc..3ba70a4 100644
--- a/templates/comments.html
+++ b/templates/comments.html
@@ -1,4 +1,5 @@
{% if comments.count %}
+ <h3>Комментарии</h3>
<div class='comments'>
{% for comment in comments %}
<div class='comment'>
@@ -12,8 +13,10 @@
{% endif %}
{% if form %}
+<h3>Отправить комментарий</h3>
<form method='post' action='.'>
{{ form.as_p }}
+ <input type='hidden' name='action' value='comment'/>
<input type='submit' />
</form>
{% endif %}
diff --git a/templates/project_docs.html b/templates/project_docs.html
index 50f0fcc..6bb1821 100644
--- a/templates/project_docs.html
+++ b/templates/project_docs.html
@@ -15,7 +15,7 @@
{%else%}
<p>Документации пока нет.</p>
{%endif%}
- <p><a href='/create/doc/'>Создать страницу документации</a></p>
+ <p><a href='/create/doc/{{project.id}}/'>Создать страницу документации</a></p>
{% endblock %}
diff --git a/urls.py b/urls.py
index b18b1ad..2bf524b 100644
--- a/urls.py
+++ b/urls.py
@@ -7,8 +7,9 @@ urlpatterns = patterns('',
(r'^projects/(\d+)/bugs/$', "mgmt.views.project_bugs"),
(r'^projects/(\d+)/docs/$', "mgmt.views.project_documents"),
(r'^docs/(\d+)/$', "mgmt.views.one_document"),
+ (r'^bugs/(\d+)/$', "mgmt.views.one_bug"),
(r'^bugs/$', "mgmt.views.all_bugs"),
- (r'^create/doc/$', "mgmt.views.create_document"),
+ (r'^create/doc/(\d+)/$', "mgmt.views.create_document"),
(r'^login/', login),
(r'^logout/', logout),