diff options
| -rw-r--r-- | archaeological_files/migrations/0106_auto_20210423_1206.py | 194 | ||||
| -rw-r--r-- | archaeological_files/models.py | 125 | 
2 files changed, 319 insertions, 0 deletions
| diff --git a/archaeological_files/migrations/0106_auto_20210423_1206.py b/archaeological_files/migrations/0106_auto_20210423_1206.py new file mode 100644 index 000000000..5d147781e --- /dev/null +++ b/archaeological_files/migrations/0106_auto_20210423_1206.py @@ -0,0 +1,194 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.27 on 2021-04-23 12:06 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import ishtar_common.models_common +import re + + +class Migration(migrations.Migration): + +    dependencies = [ +        ('archaeological_files', '0105_auto_20201204_1442'), +    ] + +    operations = [ +        migrations.CreateModel( +            name='EquipmentCost', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('service_provider', models.CharField(default='-', max_length=200, verbose_name='Service provider')), +                ('flat_rate', models.BooleanField(default=False, verbose_name='Flat rate')), +                ('daily_cost', models.FloatField(blank=True, null=True, verbose_name='Daily cost')), +                ('monday', models.BooleanField(default=True, verbose_name='Monday')), +                ('tuesday', models.BooleanField(default=True, verbose_name='Tuesday')), +                ('wednesday', models.BooleanField(default=True, verbose_name='Wednesday')), +                ('thursday', models.BooleanField(default=True, verbose_name='Thursday')), +                ('friday', models.BooleanField(default=True, verbose_name='Friday')), +            ], +            options={ +                'verbose_name': 'Equipment cost', +                'verbose_name_plural': 'Equipment costs', +            }, +        ), +        migrations.CreateModel( +            name='EquipmentType', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('label', models.TextField(verbose_name='Label')), +                ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), +                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), +                ('available', models.BooleanField(default=True, verbose_name='Available')), +            ], +            options={ +                'verbose_name': 'Equipment type', +                'verbose_name_plural': 'Equipment types', +                'ordering': ('label',), +            }, +            bases=(ishtar_common.models_common.Cached, models.Model), +        ), +        migrations.CreateModel( +            name='GenericEquipmentType', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('label', models.TextField(verbose_name='Label')), +                ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), +                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), +                ('available', models.BooleanField(default=True, verbose_name='Available')), +            ], +            options={ +                'verbose_name': 'Generic equipment type', +                'verbose_name_plural': 'Generic equipment types', +                'ordering': ('label',), +            }, +            bases=(ishtar_common.models_common.Cached, models.Model), +        ), +        migrations.CreateModel( +            name='Job', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('label', models.TextField(verbose_name='Label')), +                ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), +                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), +                ('available', models.BooleanField(default=True, verbose_name='Available')), +                ('ground_daily_cost', models.FloatField(blank=True, null=True, verbose_name='Ground daily cost')), +                ('daily_cost', models.FloatField(blank=True, null=True, verbose_name='Daily cost')), +                ('permanent_contract', models.NullBooleanField(verbose_name='Is a permanent contract')), +                ('default_daily_need_on_ground', models.FloatField(default=0, verbose_name='Default daily number needed on the ground')), +                ('default_daily_need', models.FloatField(default=0, verbose_name='Default daily number needed')), +            ], +            options={ +                'verbose_name': 'Job', +                'verbose_name_plural': 'Jobs', +                'ordering': ('label',), +            }, +            bases=(ishtar_common.models_common.Cached, models.Model), +        ), +        migrations.CreateModel( +            name='PreventiveFile', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('study_period', models.CharField(blank=True, default='', max_length=200, verbose_name='Study period')), +                ('start_date', models.DateField(blank=True, null=True, verbose_name='Start date')), +                ('end_date', models.DateField(blank=True, null=True, verbose_name='End date')), +                ('ground_start_date', models.DateField(blank=True, null=True, verbose_name='Ground start date')), +                ('ground_end_date', models.DateField(blank=True, null=True, verbose_name='Ground end date')), +                ('execution_report_date', models.DateField(blank=True, null=True, verbose_name='Execution report date')), +                ('linear_meter', models.IntegerField(blank=True, null=True, verbose_name='Linear meter')), +                ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.File', verbose_name='File')), +            ], +            options={ +                'verbose_name': 'Preventive file', +                'verbose_name_plural': 'Preventive files', +            }, +        ), +        migrations.CreateModel( +            name='PreventiveFileEquipmentCost', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')), +                ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')), +                ('equipment_cost', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentCost')), +                ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')), +            ], +            options={ +                'abstract': False, +            }, +        ), +        migrations.CreateModel( +            name='PreventiveFileJob', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')), +                ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')), +                ('ground_man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Ground man-day planned')), +                ('ground_man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Ground man-day worked')), +                ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')), +                ('job', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.Job')), +            ], +            options={ +                'abstract': False, +            }, +        ), +        migrations.CreateModel( +            name='PreventiveFileTechnicalServiceCost', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('man_days_planned', models.FloatField(blank=True, null=True, verbose_name='Man-day planned')), +                ('man_days_worked', models.FloatField(blank=True, null=True, verbose_name='Man-day worked')), +                ('file', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.PreventiveFile')), +            ], +            options={ +                'abstract': False, +            }, +        ), +        migrations.CreateModel( +            name='TechnicalService', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('label', models.TextField(verbose_name='Label')), +                ('txt_idx', models.TextField(help_text='The slug is the standardized version of the name. It contains only lowercase letters, numbers and hyphens. Each slug must be unique.', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[-a-zA-Z0-9_]+\\Z', 32), "Enter a valid 'slug' consisting of letters, numbers, underscores or hyphens.", 'invalid')], verbose_name='Textual ID')), +                ('comment', models.TextField(blank=True, default='', verbose_name='Comment')), +                ('available', models.BooleanField(default=True, verbose_name='Available')), +            ], +            options={ +                'verbose_name': 'Technical service', +                'verbose_name_plural': 'Technical services', +                'ordering': ('label',), +            }, +            bases=(ishtar_common.models_common.Cached, models.Model), +        ), +        migrations.CreateModel( +            name='TechnicalServiceCost', +            fields=[ +                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), +                ('service_provider', models.CharField(default='-', max_length=200, verbose_name='Service provider')), +                ('flat_rate', models.BooleanField(default=False, verbose_name='Flat rate')), +                ('unitary_cost', models.FloatField(blank=True, null=True, verbose_name='Unitary cost')), +                ('unit', models.CharField(blank=True, choices=[('D', 'Days'), ('M', 'Linear meter')], max_length=1, null=True, verbose_name='Unit')), +                ('technical_service', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.TechnicalService', verbose_name='Technical service')), +            ], +            options={ +                'verbose_name': 'Equipment cost', +                'verbose_name_plural': 'Equipment costs', +            }, +        ), +        migrations.AddField( +            model_name='preventivefiletechnicalservicecost', +            name='technical_service_cost', +            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.TechnicalServiceCost'), +        ), +        migrations.AddField( +            model_name='equipmenttype', +            name='generic_equipment_type', +            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.GenericEquipmentType', verbose_name='Generic type'), +        ), +        migrations.AddField( +            model_name='equipmentcost', +            name='equipment_type', +            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='archaeological_files.EquipmentType', verbose_name='Equipment'), +        ), +    ] diff --git a/archaeological_files/models.py b/archaeological_files/models.py index 88326d405..db46c1ca7 100644 --- a/archaeological_files/models.py +++ b/archaeological_files/models.py @@ -68,6 +68,85 @@ from archaeological_operations.models import (  ) +class Job(GeneralType): +    ground_daily_cost = models.FloatField(_("Ground daily cost"), blank=True, null=True) +    daily_cost = models.FloatField(_("Daily cost"), blank=True, null=True) +    permanent_contract = models.NullBooleanField( +        _("Is a permanent contract"), blank=True, null=True) +    default_daily_need_on_ground = models.FloatField( +        _("Default daily number needed on the ground"), default=0) +    default_daily_need = models.FloatField( +        _("Default daily number needed"), default=0) + +    class Meta: +        verbose_name = _("Job") +        verbose_name_plural = _("Jobs") +        ordering = ("label",) + + +class GenericEquipmentType(GeneralType): +    class Meta: +        verbose_name = _("Generic equipment type") +        verbose_name_plural = _("Generic equipment types") +        ordering = ("label",) + + +class EquipmentType(GeneralType): +    generic_equipment_type = models.ForeignKey( +        GenericEquipmentType, verbose_name=_("Generic type")) + +    class Meta: +        verbose_name = _("Equipment type") +        verbose_name_plural = _("Equipment types") +        ordering = ("label",) + + +class EquipmentCost(models.Model): +    service_provider = models.CharField(_("Service provider"), max_length=200, +                                        default="-") +    equipment_type = models.ForeignKey( +        EquipmentType, verbose_name=_("Equipment")) +    flat_rate = models.BooleanField(_("Flat rate"), default=False) +    daily_cost = models.FloatField(_("Daily cost"), blank=True, null=True) +    monday = models.BooleanField(_("Monday"), default=True) +    tuesday = models.BooleanField(_("Tuesday"), default=True) +    wednesday = models.BooleanField(_("Wednesday"), default=True) +    thursday = models.BooleanField(_("Thursday"), default=True) +    friday = models.BooleanField(_("Friday"), default=True) + +    class Meta: +        verbose_name = _("Equipment cost") +        verbose_name_plural = _("Equipment costs") + + +class TechnicalService(GeneralType): +    class Meta: +        verbose_name = _("Technical service") +        verbose_name_plural = _("Technical services") +        ordering = ("label",) + + +TECH_UNITS = ( +    ("D", _("Days")), +    ("M", _("Linear meter")), +) + + +class TechnicalServiceCost(models.Model): +    service_provider = models.CharField(_("Service provider"), max_length=200, +                                        default="-") +    technical_service = models.ForeignKey( +        TechnicalService, verbose_name=_("Technical service")) +    flat_rate = models.BooleanField(_("Flat rate"), default=False) +    unitary_cost = models.FloatField(_("Unitary cost"), blank=True, null=True) +    unit = models.CharField(_("Unit"), max_length=1, choices=TECH_UNITS, +                            blank=True, null=True) + +    class Meta: +        verbose_name = _("Equipment cost") +        verbose_name_plural = _("Equipment costs") + +  class FileType(GeneralType):      class Meta:          verbose_name = _("Archaeological file type") @@ -1061,3 +1140,49 @@ class FileDashboard:              .annotate(number=Sum("file__total_surface"))              .order_by("department__label")          ) + + +class PreventiveFile(models.Model): +    file = models.ForeignKey(File, verbose_name=_("File")) +    study_period = models.CharField(_("Study period"), max_length=200, +                                    default="", blank=True) +    start_date = models.DateField(_("Start date"), blank=True, null=True) +    end_date = models.DateField(_("End date"), blank=True, null=True) +    ground_start_date = models.DateField(_("Ground start date"), blank=True, null=True) +    ground_end_date = models.DateField(_("Ground end date"), blank=True, null=True) +    execution_report_date = models.DateField(_("Execution report date"), blank=True, +                                             null=True) +    linear_meter = models.IntegerField(_("Linear meter"), blank=True, null=True) + +    class Meta: +        verbose_name = _("Preventive file") +        verbose_name_plural = _("Preventive files") + + +class ManDays(models.Model): +    man_days_planned = models.FloatField( +        _("Man-day planned"), null=True, blank=True) +    man_days_worked = models.FloatField( +        _("Man-day worked"), null=True, blank=True) + +    class Meta: +        abstract = True + + +class PreventiveFileJob(ManDays): +    file = models.ForeignKey(PreventiveFile) +    job = models.ForeignKey(Job) +    ground_man_days_planned = models.FloatField( +        _("Ground man-day planned"), null=True, blank=True) +    ground_man_days_worked = models.FloatField( +        _("Ground man-day worked"), null=True, blank=True) + + +class PreventiveFileEquipmentCost(ManDays): +    file = models.ForeignKey(PreventiveFile) +    equipment_cost = models.ForeignKey(EquipmentCost) + + +class PreventiveFileTechnicalServiceCost(ManDays): +    file = models.ForeignKey(PreventiveFile) +    technical_service_cost = models.ForeignKey(TechnicalServiceCost) | 
