Changing bug states seems working.

portnov [2008-06-08 14:00:34]
Changing bug states seems working.
Filename
mgmt/debug.py
mgmt/models.py
mgmt/rights.py
mgmt/views.py
templates/base.html
templates/bug.html
templates/bug_body.html
templates/comments.html
templates/project_docs.html
urls.py
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),
ViewGit