# -*- encoding: utf-8 -*-
-import datetime
from django.db import models
from django.contrib import admin
-
+from auf.django.metadata.admin import AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, AUF_METADATA_READONLY_FIELDS
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 if f.name not in METADATA_READONLY_FIELDS]
+# Inlines
+class ReadOnlyInlineMixin(object):
+ def get_readonly_fields(self, request, obj=None):
+ return [f.name for f in self.model._meta.fields if f.name not in AUF_METADATA_READONLY_FIELDS]
-# Inlines
-class AyantDroitInline(admin.TabularInline):
- exclude = METADATA_READONLY_FIELDS + ('actif', )
+class AyantDroitInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
model = models.Model # à remplacer dans admin.py
extra = 1
-class AyantDroitCommentaireInline(admin.TabularInline):
- exclude = METADATA_READONLY_FIELDS + ('actif', )
+
+class AyantDroitCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
readonly_fields = ('owner', )
model = models.Model # à remplacer dans admin.py
extra = 1
-class ContratInline(admin.TabularInline):
+class ContratInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
model = models.Model # à remplacer dans admin.py
- exclude = METADATA_READONLY_FIELDS + ('actif', )
extra = 1
-class DossierROInline(ReadonlyInlineMixin, admin.TabularInline):
+class DossierROInline(ReadOnlyInlineMixin, admin.TabularInline):
+ exclude = AUF_METADATA_READONLY_FIELDS
model = models.Model # à remplacer dans admin.py
- exclude = METADATA_READONLY_FIELDS
-class DossierCommentaireInline(admin.TabularInline, MetadataAdminMixin):
- exclude = METADATA_READONLY_FIELDS + ('actif', )
+
+class DossierCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
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):
- exclude = METADATA_READONLY_FIELDS + ('actif', )
+class EmployeCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
readonly_fields = ('owner', )
model = models.Model # à remplacer dans admin.py
extra = 1
model = models.Model # à remplacer dans admin.py
-class EvenementInline(admin.TabularInline, MetadataAdminMixin):
+class EvenementInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
model = models.Model # à remplacer dans admin.py
- exclude = METADATA_READONLY_FIELDS + ('actif', )
extra = 1
-class EvenementRemunerationInline(admin.TabularInline, MetadataAdminMixin):
+class EvenementRemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
model = models.Model # à remplacer dans admin.py
- exclude = METADATA_READONLY_FIELDS + ('actif', )
extra = 1
model = models.Model # à remplacer dans admin.py
-class PosteCommentaireInline(admin.TabularInline):
- exclude = METADATA_READONLY_FIELDS + ('actif', )
+class PosteCommentaireInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
readonly_fields = ('owner', )
model = models.Model # à remplacer dans admin.py
extra = 1
model = models.Model # à remplacer dans admin.py
-class RemunerationInline(admin.TabularInline):
+class RemunerationInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
model = models.Model # à remplacer dans admin.py
- exclude = METADATA_READONLY_FIELDS + ('actif', )
extra = 1
-class RemunerationROInline(ReadonlyInlineMixin, RemunerationInline):
+class RemunerationROInline(ReadOnlyInlineMixin, RemunerationInline):
pass
# Admins
-class AyantDroitAdmin(admin.ModelAdmin):
+class AyantDroitAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
"""
L'ajout d'un nouvel ayantdroit se fait dans l'admin de l'employé.
"""
search_fields = ('nom', 'prenom', 'employe__nom', 'employe__prenom', )
list_display = ('_ayantdroit', '_employe', )
inlines = (AyantDroitCommentaireInline,)
- readonly_fields = METADATA_READONLY_FIELDS + ('employe',)
- fieldsets = (
- ('Metadata', {
- 'classes': ('collapse',),
- 'fields': METADATA_FIELDSET_FIELDS,
- }),
+ readonly_fields = AUFMetadataAdminMixin.readonly_fields + ('employe',)
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
("Lien avec l'employé", {
'fields': ('employe', 'lien_parente', )
}),
)
def save_formset(self, request, form, formset, change):
+ super(AyantDroitAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if instance.__class__ == rh.AyantDroitCommentaire:
pass
-class DossierAdmin(MetadataAdminMixin, admin.ModelAdmin,):
+class DossierAdmin(AUFMetadataAdminMixin, admin.ModelAdmin,):
search_fields = ('employe__nom', 'employe__prenom', )
list_display = ('_employe', '_poste', 'date_debut', 'date_fin', )
inlines = (DossierPieceInline, ContratInline,
#EvenementInline,
DossierCommentaireInline,
)
- readonly_fields = METADATA_READONLY_FIELDS
- fieldsets = (
- ('Metadata', {
- 'classes': ('collapse',),
- 'fields': METADATA_FIELDSET_FIELDS,
- }),
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
('Identification', {
'fields': ('employe', 'poste', 'statut', 'organisme_bstg',)
}),
_employe.short_description = u'Employé'
def save_formset(self, request, form, formset, change):
+ super(DossierAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if instance.__class__ == rh.DossierCommentaire:
pass
-class EmployeAdmin(MetadataAdminMixin, admin.ModelAdmin):
+class EmployeAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+ search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
inlines = (AyantDroitInline,
DossierROInline,
EmployePieceInline,
EmployeCommentaireInline)
- readonly_fields = METADATA_READONLY_FIELDS
- fieldsets = (
- ('Metadata', {
- 'classes': ('collapse',),
- 'fields': METADATA_FIELDSET_FIELDS,
- }),
+ fieldsets = AUFMetadataAdminMixin.fieldsets + (
('Identification', {
'fields': ('nom', 'prenom', 'nom_affichage', 'nationalite', 'date_naissance', 'genre', )
}),
)
def save_formset(self, request, form, formset, change):
+ super(EmployeAdmin, self).save_formset(request, form, formset, change)
instances = formset.save(commit=False)
for instance in instances:
if instance.__class__ == rh.EmployeCommentaire:
# -=- encoding: utf-8 -=-
-import datetime
-
from django.core.files.storage import FileSystemStorage
from django.db import models
-import settings
-
+from django.conf import settings
+from auf.django.metadata.models import AUFMetadata
+from auf.django.metadata.managers import NoDeleteManager
import datamaster_modeles.models as ref
return path
-class RHManager(models.Manager):
- def get_query_set(self):
- return super(RHManager, self).get_query_set().filter(supprime=False)
-
-
-# Abstracts
-class Metadata(models.Model):
- """Méta-données AUF.
- Metadata.actif = flag remplaçant la suppression.
- supprime == True : objet réputé supprimé.
- """
- supprime = models.BooleanField(default=False)
- 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(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='+',
- null=True, blank=True)
-
- objects = RHManager()
-
- class Meta:
- abstract = True
-
- def delete(self):
- self.supprime = True
- self.save()
-
-
-class Commentaire(Metadata):
+class Commentaire(AUFMetadata):
texte = models.TextField()
owner = models.ForeignKey('auth.User', db_column='owner', related_name='+')
('externe', 'Externe'),
)
-
-class PosteManager(models.Manager):
+class PosteManager(NoDeleteManager):
def get_query_set(self):
return super(PosteManager, self).get_query_set().select_related('implantation')
-class Poste_(Metadata):
+class Poste_(AUFMetadata):
"""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.
('M', 'Marié'),
)
-class Employe(Metadata):
+class Employe(AUFMetadata):
"""Personne occupant ou ayant occupé un Poste. Un Employe aura autant de
Dossiers qu'il occupe ou a occupé de Postes.
('Fils', 'Fils'),
)
-class AyantDroit(Metadata):
+class AyantDroit(AUFMetadata):
"""Personne en relation avec un Employe.
"""
# Identification
('aucun', 'Aucun'),
)
-class Dossier_(Metadata):
+class Dossier_(AUFMetadata):
"""Le Dossier regroupe les informations relatives à l'occupation
d'un Poste par un Employe. Un seul Dossier existe par Poste occupé
par un Employe.
### RÉMUNÉRATION
-class RemunerationMixin(Metadata):
+class RemunerationMixin(AUFMetadata):
# Identification
dossier = models.ForeignKey('Dossier', db_column='dossier',
related_name='%(app_label)s_%(class)s_remunerations')
### CONTRATS
-class Contrat(Metadata):
+class Contrat(AUFMetadata):
"""Document juridique qui encadre la relation de travail d'un Employe
pour un Poste particulier. Pour un Dossier (qui documente cette
relation de travail) plusieurs contrats peuvent être associés.
### ÉVÉNEMENTS
-class Evenement_(Metadata):
+class Evenement_(AUFMetadata):
"""Un Evenement sert à déclarer une situation temporaire (exceptionnelle)
d'un Dossier qui vient altérer des informations normales liées à un Dossier
(ex.: la Remuneration).
### RÉFÉRENCES RH
-class FamilleEmploi(Metadata):
+class FamilleEmploi(AUFMetadata):
"""Catégorie utilisée dans la gestion des Postes.
Catégorie supérieure à TypePoste.
"""
def __unicode__(self):
return u'%s' % (self.nom)
-class TypePoste(Metadata):
+class TypePoste(AUFMetadata):
"""Catégorie de Poste.
"""
nom = models.CharField(max_length=255)
('Traitement', 'Traitement'),
)
-class TypeRemuneration(Metadata):
+class TypeRemuneration(AUFMetadata):
"""Catégorie de Remuneration.
"""
nom = models.CharField(max_length=255)
def __unicode__(self):
return u'%s' % (self.nom)
-class TypeRevalorisation(Metadata):
+class TypeRevalorisation(AUFMetadata):
"""Justification du changement de la Remuneration.
(Actuellement utilisé dans aucun traitement informatique.)
"""
def __unicode__(self):
return u'%s' % (self.nom)
-class Service(Metadata):
+class Service(AUFMetadata):
"""Unité administrative où les Postes sont rattachés.
"""
nom = models.CharField(max_length=255)
('DET', 'Détachement'),
)
-class OrganismeBstg(Metadata):
+class OrganismeBstg(AUFMetadata):
"""Organisation d'où provient un Employe mis à disposition (MAD) de
ou détaché (DET) à l'AUF à titre gratuit.
def __unicode__(self):
return u'%s (%s)' % (self.nom, self.get_type_display())
-class Statut(Metadata):
+class Statut(AUFMetadata):
"""Statut de l'Employe dans le cadre d'un Dossier particulier.
"""
# Identification
)
-class Classement_(Metadata):
+class Classement_(AUFMetadata):
"""Éléments de classement de la
"Grille générique de classement hiérarchique".
__doc__ = Classement_.__doc__
-class TauxChange_(Metadata):
+class TauxChange_(AUFMetadata):
"""Taux de change de la devise vers l'euro (EUR)
pour chaque année budgétaire.
"""
__doc__ = TauxChange_.__doc__
-class ValeurPoint_(Metadata):
+class ValeurPoint_(AUFMetadata):
"""Utile pour connaître, pour un Dossier, le salaire de base théorique lié
au classement dans la grille. La ValeurPoint s'obtient par l'implantation
du Poste de ce Dossier : dossier.poste.implantation (pseudo code).
__doc__ = ValeurPoint_.__doc__
-class Devise(Metadata):
+class Devise(AUFMetadata):
"""Devise monétaire.
"""
code = models.CharField(max_length=10, unique=True)
def __unicode__(self):
return u'%s - %s' % (self.code, self.nom)
-class TypeContrat(Metadata):
+class TypeContrat(AUFMetadata):
"""Type de contrat.
"""
nom = models.CharField(max_length=255)
### AUTRES
-class ResponsableImplantation(Metadata):
+class ResponsableImplantation(AUFMetadata):
"""Le responsable d'une implantation.
Anciennement géré sur le Dossier du responsable.
"""