diff options
author | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-04-22 17:50:10 +0200 |
---|---|---|
committer | Étienne Loks <etienne.loks@iggdrasil.net> | 2021-07-29 11:54:14 +0200 |
commit | f5e7db4f7b3bceb0cdef84f9530e0cddc67beea8 (patch) | |
tree | 6b190ee4e81581390540bb14b4e31c1ef29002bb | |
parent | 9f19fcb307a6eaca7e88599d2234ae7190b95a6e (diff) | |
download | Ishtar-f5e7db4f7b3bceb0cdef84f9530e0cddc67beea8.tar.bz2 Ishtar-f5e7db4f7b3bceb0cdef84f9530e0cddc67beea8.zip |
File: preventive fields
-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) |