]> git.parisson.com Git - mezzo.git/commitdiff
Add is_legacy and parent fields to Team, add second_team_text to Activity, fix variou...
authorGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Tue, 4 Oct 2016 16:00:23 +0000 (18:00 +0200)
committerGuillaume Pellerin <guillaume.pellerin@ircam.fr>
Tue, 4 Oct 2016 16:00:23 +0000 (18:00 +0200)
app/organization/network/admin.py
app/organization/network/management/commands/import-ircam-person-xls.py
app/organization/network/migrations/0027_personactivity_second_team_text.py [new file with mode: 0644]
app/organization/network/migrations/0028_team_is_legacy.py [new file with mode: 0644]
app/organization/network/migrations/0029_auto_20161004_1556.py [new file with mode: 0644]
app/organization/network/migrations/0030_team_parent.py [new file with mode: 0644]
app/organization/network/models.py

index 939481b3eb8d11223855a4a34d14263af3841587..cbcd1bfa07d378cc758e48c5329aca6c65367a2d 100644 (file)
@@ -60,6 +60,7 @@ class DepartmentAdmin(BaseTranslationModelAdmin):
 class TeamAdmin(BaseTranslationModelAdmin):
 
     model = Team
+    list_filter = ['department',]
 
 
 class TeamPageAdmin(PageAdmin):
@@ -123,6 +124,13 @@ class PersonAdmin(BaseTranslationOrderedModelAdmin):
     list_display = ['last_name', 'first_name', 'email', 'gender']
     list_filter = ['person_title', 'activities__date_from', 'activities__date_to', 'activities__is_permanent', 'activities__framework', 'activities__grade', 'activities__function', 'activities__team', 'activities__project',]
 
+
+class PersonActivityAdmin(admin.ModelAdmin):
+
+    model = PersonActivity
+    list_display = ['person', 'team', 'status', 'date_from', 'date_to']
+
+
 class PersonListBlockInlineAdmin(TabularDynamicInlineAdmin):
 
     model = PersonListBlockInline
@@ -182,6 +190,7 @@ admin.site.register(Team, TeamAdmin)
 admin.site.register(TeamPage, TeamPageAdmin)
 admin.site.register(Person, PersonAdmin)
 admin.site.register(PersonListBlock, PersonListBlockAdmin)
+admin.site.register(PersonActivity, PersonActivityAdmin)
 admin.site.register(ActivityStatus, ActivityStatusAdmin)
 admin.site.register(ActivityGrade, ActivityGradeAdmin)
 admin.site.register(ActivityFramework, ActivityFrameworkAdmin)
index ca0abdc9ade801d6cc1fc711dc61c57288f12242..c1a9c2e38d89da6d7133a3a7753c8eac3a8f9c2c 100644 (file)
@@ -10,6 +10,7 @@ from itertools import takewhile
 from django.conf import settings
 from django.core.management.base import BaseCommand, CommandError
 from django.contrib.auth.models import User
+from django.db.models import Q
 
 from organization.core.models import *
 from organization.network.models import *
@@ -119,7 +120,20 @@ class IrcamPerson(object):
             person, c = Person.objects.get_or_create(title=title)
 
             return person
+        return None
 
+    def get_team(self, code):
+        code = str(code)
+        qs = Q(code=code) | Q(code=code.lower()) | Q(code=code.upper()) | Q(code=code.capitalize())
+        teams = Team.objects.filter(qs)
+        if teams:
+            return teams[0]
+
+        qs = Q(title=code) | Q(title=code.lower()) | Q(title=code.upper()) | Q(title=code.capitalize())
+        projects = Project.objects.filter(qs)
+        if projects:
+            self.activity.project = projects[0]
+            return None
         return None
 
     def get_activity(self):
@@ -140,8 +154,11 @@ class IrcamPerson(object):
         self.activity.second_employer = self.get_or_create_name(Organization, 16)
         self.activity.umr = self.get_or_create_name(UMR, 17)
 
-        self.activity.team, c = Team.objects.get_or_create(code=self.row[19].value, organization=self.organization) if self.row[19].value else (None, False)
-        self.activity.second_team, c = Team.objects.get_or_create(code=self.row[21].value, organization=self.organization) if self.row[21].value else (None, False)
+        self.activity.team = self.get_team(self.row[19].value)
+        try:
+            self.activity.second_team = self.get_team(self.row[21].value)
+        except:
+            self.activity.second_team_text =  self.row[21].value
         self.activity.project, c = Project.objects.get_or_create(title=self.row[22].value) if self.row[22].value else (None, False)
 
         quota = self.row[23].value
@@ -158,7 +175,7 @@ class IrcamPerson(object):
         self.activity.training_type = self.get_or_create_name(TrainingType, 29)
         self.activity.training_level = self.get_or_create_name(TrainingLevel, 30)
         self.activity.training_topic = self.get_or_create_name(TrainingTopic, 31)
-        self.activity.training_speciality = self.get_or_create_name(TrainingSpectiality, 32)
+        self.activity.training_speciality = self.get_or_create_name(TrainingSpeciality, 32)
         self.activity.function = self.get_or_create_name(ActivityFunction, 34)
 
         if self.activity.phd_director:
@@ -175,7 +192,10 @@ class IrcamPerson(object):
         self.activity.comments = self.row[37].value
         self.activity.hdr = self.row[40].value
         self.activity.budget_code = self.get_or_create_name(BudgetCode, 41)
-        self.activity.date_modified_manual = datetime.datetime(*xlrd.xldate_as_tuple(self.row[42].value, self.datemode)) if self.row[42].value else None
+        try:
+            self.activity.date_modified_manual = datetime.datetime(*xlrd.xldate_as_tuple(self.row[42].value, self.datemode)) if self.row[42].value else None
+        except:
+            pass
         self.activity.record_piece = self.get_or_create_name(RecordPiece, 43) if self.row[43].value else None
 
         self.activity.save()
diff --git a/app/organization/network/migrations/0027_personactivity_second_team_text.py b/app/organization/network/migrations/0027_personactivity_second_team_text.py
new file mode 100644 (file)
index 0000000..26b12ad
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-10-03 23:01
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0026_auto_20160929_1810'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='personactivity',
+            name='second_team_text',
+            field=models.CharField(blank=True, max_length=256, null=True, verbose_name='second team text'),
+        ),
+    ]
diff --git a/app/organization/network/migrations/0028_team_is_legacy.py b/app/organization/network/migrations/0028_team_is_legacy.py
new file mode 100644 (file)
index 0000000..bd997c5
--- /dev/null
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-10-04 07:23
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0027_personactivity_second_team_text'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='team',
+            name='is_legacy',
+            field=models.BooleanField(default=False, verbose_name='is legacy'),
+        ),
+    ]
diff --git a/app/organization/network/migrations/0029_auto_20161004_1556.py b/app/organization/network/migrations/0029_auto_20161004_1556.py
new file mode 100644 (file)
index 0000000..58efd4a
--- /dev/null
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-10-04 13:56
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0028_team_is_legacy'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='person',
+            name='external_id',
+            field=models.CharField(blank=True, max_length=128, null=True, verbose_name='external ID'),
+        ),
+        migrations.AddField(
+            model_name='personactivity',
+            name='external_id',
+            field=models.CharField(blank=True, max_length=128, null=True, verbose_name='external ID'),
+        ),
+    ]
diff --git a/app/organization/network/migrations/0030_team_parent.py b/app/organization/network/migrations/0030_team_parent.py
new file mode 100644 (file)
index 0000000..381cdff
--- /dev/null
@@ -0,0 +1,21 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.9.10 on 2016-10-04 15:55
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('organization-network', '0029_auto_20161004_1556'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='team',
+            name='parent',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='children', to='organization-network.Team', verbose_name='parent team'),
+        ),
+    ]
index 8423618a3edb73ad8004812b709da8a734bf8c66..30d834324c3a1e4af9b55caa5972b723636868f0 100644 (file)
@@ -78,7 +78,7 @@ class Organization(Named, Address, URL, AdminThumbRelatedMixin):
     is_on_map = models.BooleanField(_('is on map'), default=True)
 
     admin_thumb_type = 'logo'
-    
+
     class Meta:
         verbose_name = _('organization')
         ordering = ['name',]
@@ -148,6 +148,8 @@ class Team(Named, URL):
     organization = models.ForeignKey('Organization', verbose_name=_('organization'), related_name="teams", blank=True, null=True, on_delete=models.SET_NULL)
     department = models.ForeignKey('Department', verbose_name=_('department'), related_name="teams", blank=True, null=True, on_delete=models.SET_NULL)
     code = models.CharField(_('code'), max_length=64, blank=True, null=True)
+    is_legacy = models.BooleanField(_('is legacy'), default=False)
+    parent = models.ForeignKey('Team', verbose_name=_('parent team'), related_name="children", blank=True, null=True, on_delete=models.SET_NULL)
 
     class Meta:
         verbose_name = _('team')
@@ -194,6 +196,7 @@ class Person(Displayable, AdminThumbMixin):
     email = models.EmailField(_('email'), blank=True, null=True)
     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)
 
     class Meta:
         verbose_name = _('person')
@@ -372,6 +375,7 @@ class PersonActivity(Period):
     umr = models.ForeignKey(UMR, verbose_name=_('UMR'), blank=True, null=True, on_delete=models.SET_NULL)
     team = models.ForeignKey('Team', verbose_name=_('team'), related_name='team_activity', blank=True, null=True, on_delete=models.SET_NULL)
     second_team = models.ForeignKey('Team', verbose_name=_('second team'), related_name='second_team_activity', blank=True, null=True, on_delete=models.SET_NULL)
+    second_team_text = models.CharField(_('second team text'), blank=True, null=True, max_length=256)
 
     project = models.ForeignKey('organization-projects.Project', verbose_name=_('project'), blank=True, null=True, on_delete=models.SET_NULL)
     rd_quota_float = models.IntegerField(_('R&D quota (float)'), blank=True, null=True)
@@ -402,12 +406,14 @@ class PersonActivity(Period):
 
     comments = models.TextField(_('comments'), blank=True)
 
+    external_id = models.CharField(_('external ID'), blank=True, null=True, max_length=128)
+
     class Meta:
         verbose_name = _('activity')
         verbose_name_plural = _('activities')
 
     def __str__(self):
         if self.status:
-            return ' - '.join((self.status.name, str(self.date_begin), str(self.date_end)))
+            return ' - '.join((self.status.name, str(self.date_from), str(self.date_to)))
         else:
-            return ' - '.join((str(self.date_begin), str(self.date_end)))
+            return ' - '.join((str(self.date_from), str(self.date_to)))