]> git.parisson.com Git - mezzo.git/commitdiff
[Timesheet] add weekly hour management
authorEmilie <zawadzki@ircam.fr>
Thu, 22 Dec 2016 16:34:52 +0000 (17:34 +0100)
committerEmilie <zawadzki@ircam.fr>
Thu, 22 Dec 2016 16:34:52 +0000 (17:34 +0100)
app/local_settings.py
app/organization/network/admin.py
app/organization/network/migrations/0070_auto_20161222_1656.py [new file with mode: 0644]
app/organization/network/models.py
app/organization/network/translation.py
app/organization/projects/migrations/0032_project_external_id.py [new file with mode: 0644]
app/organization/projects/models.py

index 47f22b9d4422a18fe31da1f04bd4a05bb71da481..90be2caecfbd1801b97defa7c59d8ce191eca33e 100644 (file)
@@ -142,6 +142,7 @@ ADMIN_MENU_ORDER = (
                     'organization-network.TrainingTopic',
                     'organization-network.TrainingLevel',
                     'organization-network.TrainingSpeciality',
+                    'organization-network.ActivityWeeklyHourVolume'
                     )),
     (_('Projects'), ('organization-projects.Project',
                     'organization-projects.ProjectProgram',
index fcbbb1d0a50bbe0e20567a5c8152e14b81d6d477..f2fc4c77a447a12bc151c5d9ea1d8d4e61e90670 100644 (file)
@@ -139,6 +139,16 @@ class PersonAdminBase(BaseTranslationModelAdmin):
     model = Person
 
 
+class ActivityWeeklyHourVolumeAdmin(BaseTranslationModelAdmin):
+
+    model = ActivityWeeklyHourVolume
+
+
+class PersonActivityWeeklyHourVolumeAdminInline(TabularDynamicInlineAdmin):
+
+    model = PersonActivityWeeklyHourVolume
+
+
 class PersonActivityInline(StackedDynamicInlineAdmin):
 
     model = PersonActivity
@@ -199,6 +209,7 @@ class PersonActivityAdmin(BaseTranslationModelAdmin):
     list_filter = [ 'date_from', 'date_to',
                     'is_permanent', 'framework', 'grade',
                     'status', 'teams', 'projects',]
+    inlines = [PersonActivityWeeklyHourVolumeAdminInline,]
 
     def get_teams(self, instance):
         values = []
@@ -273,6 +284,7 @@ admin.site.register(ActivityStatus, ActivityStatusAdmin)
 admin.site.register(ActivityGrade, ActivityGradeAdmin)
 admin.site.register(ActivityFramework, ActivityFrameworkAdmin)
 admin.site.register(ActivityFunction, ActivityFunctionAdmin)
+admin.site.register(ActivityWeeklyHourVolume, ActivityWeeklyHourVolumeAdmin)
 admin.site.register(TrainingType, TrainingTypeAdmin)
 admin.site.register(TrainingLevel, TrainingLevelAdmin)
 admin.site.register(TrainingTopic, TrainingTopicAdmin)
diff --git a/app/organization/network/migrations/0070_auto_20161222_1656.py b/app/organization/network/migrations/0070_auto_20161222_1656.py
new file mode 100644 (file)
index 0000000..f56bedd
--- /dev/null
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2016-12-22 15:56
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0069_auto_20161216_1649'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='ActivityWeeklyHourVolume',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('title', models.CharField(max_length=1024, verbose_name='title')),
+                ('description', models.TextField(blank=True, verbose_name='description')),
+                ('monday_hours', models.IntegerField(verbose_name='monday hours')),
+                ('tuesday_hours', models.IntegerField(verbose_name='tuesday hours')),
+                ('wednesday_hours', models.IntegerField(verbose_name='wednesday hours')),
+                ('thursday_hours', models.IntegerField(verbose_name='thursday hours')),
+                ('friday_hours', models.IntegerField(verbose_name='friday hours')),
+            ],
+            options={
+                'verbose_name_plural': 'Activity Weekly Hour Volumes',
+                'verbose_name': 'Activity Weekly Hour Volume',
+            },
+        ),
+        migrations.CreateModel(
+            name='PersonActivityWeeklyHourVolume',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('monday_hours', models.IntegerField(blank=True, null=True, verbose_name='monday hours')),
+                ('tuesday_hours', models.IntegerField(blank=True, null=True, verbose_name='tuesday hours')),
+                ('wednesday_hours', models.IntegerField(blank=True, null=True, verbose_name='wednesday hours')),
+                ('thursday_hours', models.IntegerField(blank=True, null=True, verbose_name='thursday hours')),
+                ('friday_hours', models.IntegerField(blank=True, null=True, verbose_name='friday hours')),
+                ('activity', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='person_activity_weekly_hour_volume', to='organization-network.PersonActivity', verbose_name='activity')),
+            ],
+            options={
+                'verbose_name': 'Person Activity Weekly Hour Volume',
+            },
+        ),
+        migrations.AddField(
+            model_name='person',
+            name='register_id',
+            field=models.CharField(blank=True, max_length=128, null=True, verbose_name='register ID'),
+        ),
+        migrations.AddField(
+            model_name='personactivity',
+            name='weekly_hour_volume',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='organization-network.ActivityWeeklyHourVolume'),
+        ),
+    ]
index 5e391257968f95d151c518a5e0f6b7e914f5a5ec..6d2f2c2b3c725542b82c51a9ae3e12fc74283625 100644 (file)
@@ -96,6 +96,7 @@ BOX_SIZE_CHOICES = [
     (6, 6),
 ]
 
+
 class Organization(Named, Address, URL, AdminThumbRelatedMixin, Orderable):
     """(Organization description)"""
 
@@ -294,6 +295,7 @@ class Person(Displayable, AdminThumbMixin):
     last_name = models.CharField(_('last name'), max_length=255, blank=True, null=True)
     email = models.EmailField(_('email'), blank=True, null=True)
     telephone = models.CharField(_('telephone'), max_length=64, blank=True, null=True)
+    register_id = models.CharField(_('register ID'), blank=True, null=True, max_length=128)
     birthday = models.DateField(_('birthday'), blank=True, null=True)
     bio = RichTextField(_('biography'), blank=True)
     external_id = models.CharField(_('external ID'), blank=True, null=True, max_length=128)
@@ -458,6 +460,32 @@ class UMR(Named):
         verbose_name = _('UMR')
 
 
+class ActivityWeeklyHourVolume(Titled):
+
+    monday_hours = models.IntegerField(_('monday hours'))
+    tuesday_hours = models.IntegerField(_('tuesday hours'))
+    wednesday_hours = models.IntegerField(_('wednesday hours'))
+    thursday_hours = models.IntegerField(_('thursday hours'))
+    friday_hours = models.IntegerField(_('friday hours'))
+
+    class Meta:
+        verbose_name = _('Activity Weekly Hour Volume')
+        verbose_name_plural = _('Activity Weekly Hour Volumes')
+
+
+class PersonActivityWeeklyHourVolume(models.Model):
+
+    activity = models.OneToOneField('PersonActivity', verbose_name=_('activity'), related_name="person_activity_weekly_hour_volume", blank=True, null=True, on_delete=models.CASCADE)
+    monday_hours = models.IntegerField(_('monday hours'), blank=True, null=True)
+    tuesday_hours = models.IntegerField(_('tuesday hours'), blank=True, null=True)
+    wednesday_hours = models.IntegerField(_('wednesday hours'), blank=True, null=True)
+    thursday_hours = models.IntegerField(_('thursday hours'), blank=True, null=True)
+    friday_hours = models.IntegerField(_('friday hours'), blank=True, null=True)
+
+    class Meta:
+        verbose_name = _('Person Activity Weekly Hour Volume')
+
+
 class PersonActivity(Period):
     """(Activity description)"""
 
@@ -507,6 +535,8 @@ class PersonActivity(Period):
 
     external_id = models.CharField(_('external ID'), blank=True, null=True, max_length=128)
 
+    weekly_hour_volume = models.ForeignKey('ActivityWeeklyHourVolume', blank=True, null=True, on_delete=models.SET_NULL)
+
     class Meta:
         verbose_name = _('activity')
         verbose_name_plural = _('activities')
@@ -517,3 +547,14 @@ class PersonActivity(Period):
             return ' - '.join((self.status.name, str(self.date_from), str(self.date_to)))
         else:
             return ' - '.join((str(self.date_from), str(self.date_to)))
+
+    def save(self, *args, **kwargs):
+        super(PersonActivity, self).save(args, kwargs)
+        if self.weekly_hour_volume and not hasattr(self, 'person_activity_weekly_hour_volume'):
+            self.person_activity_weekly_hour_volume = PersonActivityWeeklyHourVolume(activity=self)
+            self.person_activity_weekly_hour_volume.monday_hours = self.weekly_hour_volume.monday_hours
+            self.person_activity_weekly_hour_volume.tuesday_hours = self.weekly_hour_volume.tuesday_hours
+            self.person_activity_weekly_hour_volume.wednesday_hours = self.weekly_hour_volume.wednesday_hours
+            self.person_activity_weekly_hour_volume.thursday_hours = self.weekly_hour_volume.thursday_hours
+            self.person_activity_weekly_hour_volume.friday_hours = self.weekly_hour_volume.friday_hours
+            self.person_activity_weekly_hour_volume.save()
index d1bcb30c46e1ed3d3b9715a2bd98d35cfdf6d16f..1f72247581baa77e597949a04fbb739936e4da48 100644 (file)
@@ -214,3 +214,15 @@ class OrganizationLinkedInlineTranslationOptions(TranslationOptions):
 class OrganizationLinkedBlockInlineTranslationOptions(TranslationOptions):
 
     fields = []
+
+
+@register(ActivityWeeklyHourVolume)
+class ActivityWeeklyHourVolumeTranslationOptions(TranslationOptions):
+
+    fields = []
+
+
+@register(PersonActivityWeeklyHourVolume)
+class PersonActivityWeeklyHourVolumeTranslationOptions(TranslationOptions):
+
+    fields = []
diff --git a/app/organization/projects/migrations/0032_project_external_id.py b/app/organization/projects/migrations/0032_project_external_id.py
new file mode 100644 (file)
index 0000000..193342f
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.11 on 2016-12-22 15:56
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-projects', '0031_auto_20161205_1536'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='project',
+            name='external_id',
+            field=models.CharField(blank=True, max_length=128, null=True, verbose_name='register ID'),
+        ),
+    ]
index df69a4a305ce91e202c1d745aee9cbf23aab204d..8d0e5316406ecd9096b53b1d47272b4ad62848ba 100644 (file)
@@ -50,6 +50,7 @@ class Project(Displayable, Period, RichText):
     """(Project description)"""
 
     type = models.CharField(_('type'), max_length=128, choices=PROJECT_TYPE_CHOICES)
+    external_id = models.CharField(_('register ID'), blank=True, null=True, max_length=128)
     program = models.ForeignKey('ProjectProgram', verbose_name=_('project program'), related_name='projects', blank=True, null=True, on_delete=models.SET_NULL)
     program_type = models.ForeignKey('ProjectProgramType', verbose_name=_('project program type'), related_name='projects', blank=True, null=True, on_delete=models.SET_NULL)
     lead_team = models.ForeignKey('organization-network.Team', verbose_name=_('lead team'), related_name='leader_projects', blank=True, null=True)