report_sprints.html 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. {% extends '_layout.html' %}
  2. {% block title %}
  3. Rapport: Sprints
  4. {% endblock %}
  5. {% block breadcrumb %}
  6. <li><a href="{% url 'index' %}">Accueil</a></li>
  7. <li><a href="{% url 'reports' %}">Rapports</a></li>
  8. <li><a>Les Sprints</a></li>
  9. {% endblock %}
  10. {% block main %}
  11. {% load martortags %}
  12. <section id="backlog">
  13. <header>
  14. <div class="flex-row">
  15. <h2 class="flex-extend">Les Sprints</h2>
  16. </div>
  17. </header>
  18. <canvas id="chart-velocity" width="400" height="120"></canvas>
  19. <ul class="sprints-list">
  20. {% for sprint in sprints %}
  21. <li class="sprint-li">
  22. <div class="flex-col">
  23. <div class="flex-row">
  24. <h4>Sprint #{{ sprint.number }} : {{ sprint.date_start|date:"d M. Y" }} au {{ sprint.date_end|date:"d M. Y" }}</h4>
  25. {% if sprint.running %}<span class="running" style="margin-left: 14px;">En cours</span>{% endif %}
  26. </div>
  27. <div class="flex-row flex-space-around" style="margin-bottom: 20px;">
  28. <b>Stories programmées: <a href="{% url 'story_index' %}?sprint={{ sprint.id }}">{{ sprint.nb_stories }}</a> </b>
  29. <b>Vélocité prévue: {{ sprint.planned_velocity }} </b>
  30. <b>Vélocité réelle: {{ sprint.real_velocity }} </b>
  31. <b>Non-planifié: {{ sprint.unplanned }} </b>
  32. </div>
  33. <div class="sprint-retro">
  34. <h5>Bilan </h5>
  35. {% if sprint.retro %}
  36. {{ sprint.retro|safe_markdown }}
  37. {% else %}
  38. (...)
  39. {% endif %}
  40. <h5>Perspectives </h5>
  41. {% if sprint.improvements %}
  42. {{ sprint.improvements |safe_markdown }}
  43. {% else %}
  44. (...)
  45. {% endif %}
  46. </div>
  47. </li>
  48. {% endfor %}
  49. </ul>
  50. </section>
  51. <script>
  52. var ctx = document.getElementById("chart-velocity").getContext('2d');
  53. var myChart = new Chart(ctx, {
  54. type: 'line',
  55. data: {
  56. labels: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}"Sprint #{{ sprint.id }}",{% endif %}{% endfor %}],
  57. datasets: [{
  58. label: 'Vélocité réelle',
  59. data: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}{{ sprint.real_velocity }},{% endif %}{% endfor %}],
  60. backgroundColor: [
  61. 'rgba(255, 255, 255, 0.2)'
  62. ],
  63. borderColor: [
  64. 'rgba(0,150,0,1)',
  65. ],
  66. borderWidth: 1
  67. },
  68. {
  69. label: 'Vélocité prévue',
  70. data: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}{{ sprint.planned_velocity }},{% endif %}{% endfor %}],
  71. backgroundColor: [
  72. 'rgba(255, 255, 255, 0.2)'
  73. ],
  74. borderColor: [
  75. 'rgba(0,0,150,1)',
  76. ],
  77. borderWidth: 1
  78. },
  79. {
  80. label: 'Charge non-prévue',
  81. data: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}{{ sprint.unplanned }},{% endif %}{% endfor %}],
  82. backgroundColor: [
  83. 'rgba(255, 255, 255, 0.2)'
  84. ],
  85. borderColor: [
  86. 'rgba(200,50,50,1)',
  87. ],
  88. borderWidth: 1
  89. }]
  90. },
  91. options: {
  92. scales: {
  93. yAxes: [{
  94. ticks: {
  95. beginAtZero:true
  96. }
  97. }]
  98. }
  99. }
  100. });
  101. </script>
  102. {% endblock %}