#1539, #1540, #1542
authorOlivier Larchevêque <olivier.larcheveque@auf.org>
Thu, 7 Jul 2011 13:30:56 +0000 (09:30 -0400)
committerOlivier Larchevêque <olivier.larcheveque@auf.org>
Thu, 7 Jul 2011 13:30:56 +0000 (09:30 -0400)
1  2 
buildout.cfg
project/rh/lib.py
project/rh/models.py

diff --cc buildout.cfg
Simple merge
  # -*- encoding: utf-8 -*-
  
++import datetime
+ from django.db import models
  from django.contrib import admin
  
+ from project.rh import models as rh
++# MetaData
++METADATA_READONLY_FIELDS = ('supprime',
++                       'date_creation',
++                       'user_creation',
++                       'date_modification',
++                       'user_modification',
++                       'date_activation',
++                       'user_activation',
++                       'date_desactivation',
++                       'user_desactivation', )
++
++METADATA_FIELDSET_FIELDS = ('actif', 'date_creation', 'user_creation',
++                       'date_modification', 'user_modification',
++                       'date_activation', 'user_activation',
++                       'date_desactivation', 'user_desactivation',)
++
++class MetadataAdminMixin(object):
++    """
++    Surcharge l'admin de base, pour setter automatiquement les metadata
++    """
++    def save_model(self, request, obj, form, change):
++        if change is False:
++            obj.user_creation = request.user
++            obj.date_creation = datetime.datetime.now()
++        obj.user_modification = request.user
++        obj.date_modification = datetime.datetime.now()
++        if form.initial['actif'] is True and obj.actif is False:
++            obj.user_desactivation = request.user
++            obj.date_desactivation = datetime.datetime.now()
++        if form.initial['actif'] is False and obj.actif is True:
++            obj.user_activation = request.user
++            obj.date_activation = datetime.datetime.now()
++        obj.save()
+ class ReadonlyInlineMixin(object):
+     def get_readonly_fields(self, request, obj=None):
+         return [f.name for f in self.model._meta.fields]
+ # Inlines
+ class AyantDroitInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class AyantDroitCommentaireInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class ContratInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
++    exclude = METADATA_READONLY_FIELDS + ('actif', )
++    extra = 1
+ class DossierROInline(ReadonlyInlineMixin, admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
 -class DossierCommentaireInline(admin.TabularInline):
++class DossierCommentaireInline(admin.TabularInline, MetadataAdminMixin):
++    exclude = METADATA_READONLY_FIELDS + ('actif', )
++    readonly_fields = ('owner', )
+     model = models.Model  # à remplacer dans admin.py
 -
++    extra = 1
+ class DossierPieceInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class EmployeInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class EmployeCommentaireInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class EmployePieceInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
 -class EvenementInline(admin.TabularInline):
++class EvenementInline(admin.TabularInline, MetadataAdminMixin):
+     model = models.Model  # à remplacer dans admin.py
++    exclude = METADATA_READONLY_FIELDS + ('actif', )
++    extra = 1
 -class EvenementRemunerationInline(admin.TabularInline):
++class EvenementRemunerationInline(admin.TabularInline, MetadataAdminMixin):
+     model = models.Model  # à remplacer dans admin.py
++    exclude = METADATA_READONLY_FIELDS + ('actif', )
++    extra = 1
+ class PosteInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class PosteCommentaireInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class PosteFinancementInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class PostePieceInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ class RemunerationInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
++    exclude = METADATA_READONLY_FIELDS + ('actif', )
++    extra = 1
+ class RemunerationROInline(ReadonlyInlineMixin, RemunerationInline):
+     pass
+ class TypePosteInline(admin.TabularInline):
+     model = models.Model  # à remplacer dans admin.py
+ # Admins
+ class AyantDroitAdmin(admin.ModelAdmin):
+     inlines = (AyantDroitCommentaireInline,)
+ class AyantDroitCommentaireAdmin(admin.ModelAdmin):
+     pass
+ class ClassementAdmin(admin.ModelAdmin):
+     pass
  
  class CommentaireAdmin(admin.ModelAdmin):
      pass
  
  
+ class ContratAdmin(admin.ModelAdmin):
+     pass
+ class DeviseAdmin(admin.ModelAdmin):
+     pass
 -class DossierAdmin(admin.ModelAdmin):
 -    list_display = ('_employe', '_poste')
 -    inlines = (DossierPieceInline, DossierCommentaireInline, ContratInline,
 -               RemunerationInline, EvenementInline)
++class DossierAdmin(MetadataAdminMixin, admin.ModelAdmin,):
++    search_fields = ('employe__nom', 'employe__prenom', )
++    list_display = ('_employe', '_poste', 'date_debut', 'date_fin', )
++    inlines = (DossierPieceInline, ContratInline,
++               RemunerationInline, EvenementInline, DossierCommentaireInline,
++              )
++    readonly_fields = METADATA_READONLY_FIELDS
++    fieldsets = (
++        ('Metadata', {
++            'classes': ('collapse',),
++            'fields': METADATA_FIELDSET_FIELDS,
++        }),
++        ('Identification', {
++            'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
++        }),
++        ('Recrutement', {
++            'fields': ('remplacement', 'statut_residence', )
++        }),
++        ('Rémunération', {
++            'fields': ('classement', 'regime_travail', 'regime_travail_nb_heure_semaine',)
++        }),
++        ('Occupation du Poste par cet Employe', {
++            'fields': ('date_debut', 'date_fin', )
++        }),
++    )
+     def _poste(self, dossier):
+         return unicode(dossier.poste.nom)
+     _poste.short_description = u'Poste'
+     def _employe(self, dossier):
+         return unicode(dossier.employe)
+     _employe.short_description = u'Employé'
 -
++    
++    def save_formset(self, request, form, formset, change):
++        instances = formset.save(commit=False)
++        for instance in instances:
++            if instance.__class__ == rh.DossierCommentaire:
++                instance.owner = request.user
++            instance.save()
++        formset.save_m2m()
+ class DossierPieceAdmin(admin.ModelAdmin):
+     pass
+ class DossierCommentaireAdmin(admin.ModelAdmin):
+     pass
+ class EmployeAdmin(admin.ModelAdmin):
+     inlines = (AyantDroitInline,
+                DossierROInline,
+                EmployePieceInline,
+                EmployeCommentaireInline)
+ class EmployeCommentaireAdmin(admin.ModelAdmin):
+     pass
+ class EmployePieceAdmin(admin.ModelAdmin):
+     pass
+ class EvenementAdmin(admin.ModelAdmin):
+     inlines = (EvenementRemunerationInline,)
+ class EvenementRemunerationAdmin(admin.ModelAdmin):
+     pass
+ class FamilleEmploiAdmin(admin.ModelAdmin):
+     inlines = (TypePosteInline,)
+ class OrganismeBstgAdmin(admin.ModelAdmin):
+     inlines = (DossierROInline,)
  class PosteAdmin(admin.ModelAdmin):
      fieldsets = (
          (None, {
@@@ -31,17 -37,18 +37,22 @@@ class RHManager(models.Manager)
  class Metadata(models.Model):
      """Méta-données AUF.
      Metadata.actif = flag remplaçant la suppression.
-     actif == False : objet réputé supprimé.
+     supprime == True : objet réputé supprimé.
      """
--    actif = models.BooleanField(default=True)
-     date_creation = models.DateField(auto_now_add=True, null=True)
+     supprime = models.BooleanField(default=False)
 -    date_creation = models.DateField(auto_now_add=True)
++    date_creation = models.DateField(null=True, blank=True)
      user_creation = models.ForeignKey('auth.User', 
                              db_column='user_creation', related_name='+',
                              null=True, blank=True)
--    date_modification = models.DateField(auto_now=True)
++    date_modification = models.DateField(null=True, blank=True)
      user_modification = models.ForeignKey('auth.User', 
                              db_column='user_modification', related_name='+',
                              null=True, blank=True)
++    actif = models.BooleanField(default=True)
++    date_activation = models.DateField(null=True, blank=True)
++    user_activation = models.ForeignKey('auth.User', 
++                            db_column='user_activation', related_name='+',
++                            null=True, blank=True)
      date_desactivation = models.DateField(null=True, blank=True)
      user_desactivation = models.ForeignKey('auth.User', 
                              db_column='user_desactivation', related_name='+',
@@@ -69,11 -83,11 +87,19 @@@ POSTE_APPEL_CHOICES = 
      ('externe', 'Externe'),
  )
  
++
++class PosteManager(models.Manager):
++    def get_query_set(self):
++        return super(PosteManager, self).get_query_set().select_related('implantation')
++
  class Poste_(Metadata):
      """Un Poste est un emploi (job) à combler dans une implantation. 
      Un Poste peut être comblé par un Employe, auquel cas un Dossier est créé.
      Si on veut recruter 2 jardiniers, 2 Postes distincts existent.
      """
++
++    objects = PosteManager()
++
      # Identification
      nom = models.CharField(max_length=255, 
                              verbose_name="Titre du poste", )
@@@ -446,9 -463,10 +475,9 @@@ class Dossier_(Metadata)
      employe = models.ForeignKey('Employe', db_column='employe', 
                              related_name='+',
                              verbose_name="Employé")
--    poste = models.ForeignKey('Poste', db_column='poste', 
--                            related_name='+', editable=False)
-     statut = models.ForeignKey('Statut', related_name='+', default=3)
++    poste = models.ForeignKey('Poste', db_column='poste', related_name='+')
+     statut = models.ForeignKey('Statut', related_name='+', default=3,
+                             null=True)
      organisme_bstg = models.ForeignKey('OrganismeBstg', 
                              db_column='organisme_bstg',
                              related_name='+',