Parcourir la source

Allow services to be for internal use only

(not available for subscription)
Jocelyn Delalande il y a 8 ans
Parent
commit
662bdfe693

+ 2 - 2
costs/admin.py

@@ -126,8 +126,8 @@ class ServiceAdmin(admin.ModelAdmin):
             'fields': (
                 ('name', 'document'), 'description', 'subscriptions_count'),
         }),
-        ('Ré-utilisabilité', {
-            'fields': ('reusable',)
+        ('Utilisation', {
+            'fields': ('reusable', 'internal')
         })
     )
     save_on_top = True

+ 155 - 0
costs/migrations/0013_auto_20161107_1333.py

@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.2 on 2016-11-07 12:33
+from __future__ import unicode_literals
+
+import datetime
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('costs', '0012_auto_20160209_1043'),
+    ]
+
+    operations = [
+        migrations.AlterModelOptions(
+            name='cost',
+            options={'verbose_name': 'Coût mensuel'},
+        ),
+        migrations.AlterModelOptions(
+            name='costuse',
+            options={'verbose_name': 'Coût mensuel associé', 'verbose_name_plural': 'Coûts mensuels associés'},
+        ),
+        migrations.AlterModelOptions(
+            name='document',
+            options={'ordering': ['-date']},
+        ),
+        migrations.AlterModelOptions(
+            name='good',
+            options={'verbose_name': "Matériel ou Frais d'accès", 'verbose_name_plural': "Matériels ou Frais d'accès"},
+        ),
+        migrations.AlterModelOptions(
+            name='gooduse',
+            options={'verbose_name': "Matériel ou frais d'accès utilisé", 'verbose_name_plural': "Matériels et frais d'accès utilisés"},
+        ),
+        migrations.AlterModelOptions(
+            name='serviceuse',
+            options={'verbose_name': 'service utilisé', 'verbose_name_plural': 'services utilisés'},
+        ),
+        migrations.AddField(
+            model_name='service',
+            name='internal',
+            field=models.BooleanField(default=False, help_text='Service interne uniquement (ne peut être vendu tel quel)'),
+        ),
+        migrations.AlterField(
+            model_name='cost',
+            name='capacity_unit',
+            field=models.CharField(blank=True, choices=[('a', 'A'), ('mbps', 'Mbps'), ('u', 'U'), ('ipv4', 'IPv4'), ('eth', 'ports'), ('services', 'abonnement')], help_text='unité de capacité (si applicable)', max_length=10, verbose_name='unité'),
+        ),
+        migrations.AlterField(
+            model_name='cost',
+            name='description',
+            field=models.TextField(blank=True, verbose_name='description'),
+        ),
+        migrations.AlterField(
+            model_name='cost',
+            name='name',
+            field=models.CharField(max_length=130, verbose_name='Nom'),
+        ),
+        migrations.AlterField(
+            model_name='cost',
+            name='price',
+            field=models.FloatField(verbose_name='Coût mensuel'),
+        ),
+        migrations.AlterField(
+            model_name='cost',
+            name='total_capacity',
+            field=models.FloatField(default=1, help_text='Laisser à 1 si non divisible', verbose_name='Capacité totale'),
+        ),
+        migrations.AlterField(
+            model_name='document',
+            name='comment',
+            field=models.TextField(blank=True, help_text='Texte brut ou markdown', verbose_name='commentaire'),
+        ),
+        migrations.AlterField(
+            model_name='document',
+            name='date',
+            field=models.DateField(default=datetime.datetime.now, help_text='Date de création du document'),
+        ),
+        migrations.AlterField(
+            model_name='document',
+            name='name',
+            field=models.CharField(max_length=130, verbose_name='Nom'),
+        ),
+        migrations.AlterField(
+            model_name='document',
+            name='type',
+            field=models.CharField(choices=[('fact', 'rapport de transparence'), ('plan', 'estimation ou étude')], max_length=10),
+        ),
+        migrations.AlterField(
+            model_name='good',
+            name='capacity_unit',
+            field=models.CharField(blank=True, choices=[('a', 'A'), ('mbps', 'Mbps'), ('u', 'U'), ('ipv4', 'IPv4'), ('eth', 'ports'), ('services', 'abonnement')], help_text='unité de capacité (si applicable)', max_length=10, verbose_name='unité'),
+        ),
+        migrations.AlterField(
+            model_name='good',
+            name='description',
+            field=models.TextField(blank=True, verbose_name='description'),
+        ),
+        migrations.AlterField(
+            model_name='good',
+            name='name',
+            field=models.CharField(max_length=130, verbose_name='Nom'),
+        ),
+        migrations.AlterField(
+            model_name='good',
+            name='price',
+            field=models.FloatField(verbose_name="Prix d'achat"),
+        ),
+        migrations.AlterField(
+            model_name='good',
+            name='provisioning_duration',
+            field=models.DurationField(choices=[(datetime.timedelta(1095), '3 ans'), (datetime.timedelta(1825), '5 ans')], verbose_name="Durée d'amortissement"),
+        ),
+        migrations.AlterField(
+            model_name='good',
+            name='total_capacity',
+            field=models.FloatField(default=1, help_text='Laisser à 1 si non divisible', verbose_name='Capacité totale'),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='capacity_unit',
+            field=models.CharField(blank=True, choices=[('a', 'A'), ('mbps', 'Mbps'), ('u', 'U'), ('ipv4', 'IPv4'), ('eth', 'ports'), ('services', 'abonnement')], help_text='unité de capacité (si applicable)', max_length=10, verbose_name='unité'),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='costs',
+            field=models.ManyToManyField(related_name='using_services', through='costs.CostUse', to='costs.Cost', verbose_name='coûts mensuels associés'),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='description',
+            field=models.TextField(blank=True, verbose_name='description'),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='goods',
+            field=models.ManyToManyField(related_name='using_services', through='costs.GoodUse', to='costs.Good', verbose_name="matériels et frais d'accès utilisés"),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='name',
+            field=models.CharField(max_length=130, verbose_name='Nom'),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='subscriptions_count',
+            field=models.PositiveIntegerField(default=0, verbose_name="Nombre d'abonnements"),
+        ),
+        migrations.AlterField(
+            model_name='service',
+            name='total_capacity',
+            field=models.FloatField(default=1, help_text='Laisser à 1 si non divisible', verbose_name='Capacité totale'),
+        ),
+    ]

+ 13 - 0
costs/models.py

@@ -303,6 +303,11 @@ class GoodUse(AbstractUse):
             return monthly_share/subscriptions_count
 
 
+class ServiceQuerySet(models.QuerySet):
+    def subscribables(self):
+        return self.exclude(internal=True)
+
+
 class Service(AbstractResource):
     """ A service we sell
 
@@ -326,6 +331,14 @@ class Service(AbstractResource):
         "Ré-utilisable par d'autres services",
         default=False,
         help_text="Peut-être utilisé par d'autres services")
+    internal = models.BooleanField(
+        "Service interne",
+        default=False,
+        help_text="Ne peut être vendu tel quel, n'apparaît pas dans la liste des services"
+    )
+
+    objects =  ServiceQuerySet.as_manager()
+
 
     @property
     def price(self):

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

@@ -39,6 +39,18 @@
 
 
 {% block content %}
+  {% if service.internal %}
+  <div class="ui yellow icon message">
+    <i class="warning icon"></i>
+    <div class="content">
+      <p>
+        Ce service est utilisé en interne comme brique pour construire d'autres
+  services ; il n'est pas ouvert tel quel aux abonnements.
+      </p>
+    </div>
+  </div>
+  {% endif %}
+
   <section class="text container ui row">
     <div class="ui icon message">
       <i class="money icon"></i>

+ 1 - 1
publicsite/templates/publicsite/public_document_detail.html

@@ -11,7 +11,7 @@
         <tr><th>Service</th><th>Prix de revient mensuel</th></tr>
       </thead>
       <tbody>
-    {% for service in document.service_set.all %}
+    {% for service in document.service_set.subscribables %}
         <tr>
           <td>{{ service.name }}</td>
           <td>{{ service.get_prices.unit_consolidated_cost|price }}</td>