Parcourir la source

Add detail service view

Jocelyn Delande il y a 9 ans
Parent
commit
86e9ad74ed
4 fichiers modifiés avec 63 ajouts et 0 suppressions
  1. 3 0
      costs/models.py
  2. 21 0
      costs/templates/costs/service_detail.html
  3. 19 0
      costs/tests/test_views.py
  4. 20 0
      costs/views.py

+ 3 - 0
costs/models.py

@@ -66,6 +66,9 @@ class AbstractUse(models.Model):
 class CostUse(AbstractUse):
     resource = models.ForeignKey(Cost)
 
+    def cost_share(self):
+        return self.share*self.resource.price
+
 
 class GoodUse(AbstractUse):
     resource = models.ForeignKey(Good)

+ 21 - 0
costs/templates/costs/service_detail.html

@@ -0,0 +1,21 @@
+<h1>Service {{ service.name }}</h1>
+<table>
+  {% for usage in goods_uses %}
+  <tr>
+    <td>matériel</td>
+    <td>{{ usage.resource.name }}</td>
+    <td>{{ usage.monthly_provision_share }}€</td>
+  </tr>
+  {% endfor %}
+  {% for usage in costs_uses %}
+  <tr>
+    <td>coût récurent</td>
+    <td>{{ usage.resource.name }}</td>
+    <td>{{ usage.cost_share }}€</td>
+  </tr>
+  {% endfor %}
+  <tr>
+    <td colspan="2">Coût TOTAL</td>
+    <td>{{ total_costs_price }}€</td>
+  </tr>
+</table>

+ 19 - 0
costs/tests/test_views.py

@@ -1,7 +1,22 @@
+import datetime
+
 from django.test import TestCase
 
+from ..models import Cost, Good, Service, GoodUse, CostUse
+
 
 class ViewsTests(TestCase):
+    def setUp(self):
+        rent = Cost.objects.create(name='Rent', price=100)
+        server = Good.objects.create(
+            name='Server',
+            price=1000,
+            provisioning_duration=datetime.timedelta(days=36*20.6),
+        )
+        vpn = Service.objects.create(name='VPN')
+        GoodUse.objects.create(resource=server, service=vpn, share=0.5)
+        CostUse.objects.create(resource=rent, service=vpn, share=0.5)
+
     def test_services_list(self):
         response = self.client.get('/transparency/services')
         self.assertEqual(response.status_code, 200)
@@ -9,3 +24,7 @@ class ViewsTests(TestCase):
     def test_resources(self):
         response = self.client.get('/transparency/resources')
         self.assertEqual(response.status_code, 200)
+
+    def test_detail_service(self):
+        response = self.client.get('/transparency/services/1')
+        self.assertEqual(response.status_code, 200)

+ 20 - 0
costs/views.py

@@ -1,3 +1,5 @@
+from itertools import chain
+
 from django.shortcuts import render
 
 from .models import Service, Cost, Good
@@ -16,3 +18,21 @@ def list_resources(request):
         'costs': Cost.objects.all(),
     }
     return render(request, 'costs/resources_list.html', context)
+
+
+def detail_service(request, pk):
+    service = Service.objects.get(pk=pk)
+
+    costs_uses = CostUse.objects.filter(service=service)
+    goods_uses = GoodUse.objects.filter(service=service)
+
+    context = {
+        'service': service,
+        'costs_uses': costs_uses,
+        'goods_uses': goods_uses,
+        'total_costs_price': sum(chain(
+            (i.monthly_provision_share() for i in goods_uses),
+            (i.cost_share() for i in costs_uses)
+        ))
+    }
+    return render(request, 'costs/service_detail.html', context)