report_sprints.html 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. {% if sprint.retro %}
  34. <div class="sprint-retro">
  35. {{ sprint.retro|safe_markdown }}
  36. </div>
  37. {% endif %}
  38. </div>
  39. </li>
  40. {% endfor %}
  41. </ul>
  42. </section>
  43. <script>
  44. var ctx = document.getElementById("chart-velocity").getContext('2d');
  45. var myChart = new Chart(ctx, {
  46. type: 'line',
  47. data: {
  48. labels: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}"Sprint #{{ sprint.id }}",{% endif %}{% endfor %}],
  49. datasets: [{
  50. label: 'Vélocité réelle',
  51. data: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}{{ sprint.real_velocity }},{% endif %}{% endfor %}],
  52. backgroundColor: [
  53. 'rgba(255, 255, 255, 0.2)'
  54. ],
  55. borderColor: [
  56. 'rgba(0,150,0,1)',
  57. ],
  58. borderWidth: 1
  59. },
  60. {
  61. label: 'Vélocité prévue',
  62. data: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}{{ sprint.planned_velocity }},{% endif %}{% endfor %}],
  63. backgroundColor: [
  64. 'rgba(255, 255, 255, 0.2)'
  65. ],
  66. borderColor: [
  67. 'rgba(0,0,150,1)',
  68. ],
  69. borderWidth: 1
  70. },
  71. {
  72. label: 'Charge non-prévue',
  73. data: [{% for sprint in sprints|dictsort:"id" %}{% if sprint.closed %}{{ sprint.unplanned }},{% endif %}{% endfor %}],
  74. backgroundColor: [
  75. 'rgba(255, 255, 255, 0.2)'
  76. ],
  77. borderColor: [
  78. 'rgba(200,50,50,1)',
  79. ],
  80. borderWidth: 1
  81. }]
  82. },
  83. options: {
  84. scales: {
  85. yAxes: [{
  86. ticks: {
  87. beginAtZero:true
  88. }
  89. }]
  90. }
  91. }
  92. });
  93. </script>
  94. {% endblock %}