import datetime
+from ajax_select import make_ajax_form
+from auf.django.metadata.admin import \
+ AUFMetadataAdminMixin, AUFMetadataInlineAdminMixin, \
+ AUF_METADATA_READONLY_FIELDS
from django.core.urlresolvers import reverse
from django.contrib import admin
from django.conf import settings
-from django.db.models import Q
+from django.db.models import Q, Count
from django.template.defaultfilters import date
-from ajax_select import make_ajax_form
-from auf.django.metadata.admin import AUFMetadataAdminMixin, \
- AUFMetadataInlineAdminMixin, \
- AUF_METADATA_READONLY_FIELDS
-from forms import ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect, \
-DossierForm
-from dae import models as dae
+
+import auf.django.references.models as ref
+import models as rh
+from forms import \
+ ContratForm, AyantDroitForm, EmployeAdminForm, AjaxSelect, DossierForm
from dae.utils import get_employe_from_user
from change_list import ChangeList
from groups import grp_correspondants_rh
from decorators import in_drh_or_admin
-import models as rh
-import auf.django.references.models as ref
+
+
+class BaseAdmin(admin.ModelAdmin):
+
+ class Media:
+ css = {'screen': ('css/admin_custom.css',)}
+
class ArchiveMixin(object):
"""
_archive.short_description = u'Archivé'
_archive.admin_order_field = 'archive'
+
class RegionProxy(ref.Region):
""" Proxy utilisé pour les organigrammes par région """
class Meta:
class ServiceProxy(rh.Service):
""" Proxy utilisé pour les organigrammes opar service """
+
class Meta:
proxy = True
verbose_name = u"Organigramme par services"
model = rh.PosteComparaison
-class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class ClassementAdmin(AUFMetadataAdminMixin, BaseAdmin):
list_display = ('_classement', '_date_modification', 'user_modification', )
fieldsets = AUFMetadataAdminMixin.fieldsets + (
(None, {
_date_modification.admin_order_field = 'date_modification'
-class CommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin, ArchiveMixin):
+class DeviseAdmin(AUFMetadataAdminMixin, BaseAdmin, ArchiveMixin):
list_display = (
'code',
'nom',
_date_modification.admin_order_field = 'date_modification'
-class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
- ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
+class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin,
+ ProtectRegionMixin, BaseAdmin, AjaxSelect):
alphabet_filter = 'employe__nom'
search_fields = (
- 'employe__nom',
- 'employe__prenom',
- 'poste__nom',
- 'poste__nom_feminin')
+ 'id',
+ 'employe__id',
+ 'poste__id',
+ 'employe__nom',
+ 'employe__prenom',
+ 'poste__nom',
+ 'poste__nom_feminin',
+ 'poste__implantation__nom',
+ )
list_display = (
'_id',
'_apercu',
list_filter = (
'poste__implantation__region',
'poste__implantation',
- 'poste__type_poste__famille_emploi',
+ 'poste__type_poste__categorie_emploi',
'poste__type_poste',
'rh_contrats__type_contrat',
'principal',
'poste__implantation__region__id__exact',
'poste__implantation__id__exact',
'poste__type_poste__id__exact',
- 'poste__type_poste__famille_emploi__id__exact',
+ 'poste__type_poste__categorie_emploi__id__exact',
'rh_contrats__type_contrat__id__exact',
'principal__exact',
'principal__isnull',
apercu_link = u"""<a title="Aperçu du dossier"
onclick="return showAddAnotherPopup(this);"
href='%s'>
- <img src="%simg/loupe.png" />
+ <img src="%simg/dossier-apercu.png" />
</a>""" % \
(reverse('dossier_apercu', args=(d.id,)),
settings.STATIC_URL,
def _dae(self, d):
apercu_link = ""
- if dae.ImportDossier.objects.filter(rh=d).exists():
- dae_id = dae.ImportDossier.objects.get(rh=d).dae_id
+ dossiers_dae = d.dossiers_dae.all()
+ if len(dossiers_dae) > 0:
+ dossier_dae = dossiers_dae[0]
apercu_link = u"""<a title="Aperçu du dossier"
onclick="return showAddAnotherPopup(this);"
href='%s'>
<img src="%simg/loupe.png" />
</a>""" % \
- (reverse('embauche_consulter', args=(dae_id,)),
+ (reverse('embauche_consulter', args=(dossier_dae.id,)),
settings.STATIC_URL,
)
return apercu_link
def _poste(self, dossier):
link = u"""<a title="Aperçu du poste"
onclick="return showAddAnotherPopup(this);"
- href='%s'><img src="%simg/loupe.png" />
+ href='%s'><img src="%simg/poste-apercu.png" />
</a>
<a href="%s" title="Modifier le poste">%s</a>""" % \
(reverse('poste_apercu', args=(dossier.poste.id,)),
view = u"""<a href="%s"
title="Aperçu l'employé"
onclick="return showAddAnotherPopup(this);">
- <img src="%simg/loupe.png" />
+ <img src="%simg/employe-apercu.png" />
</a>""" % (view_link, settings.STATIC_URL,)
return u"""%s<a href='%s' style="%s;">%s</a>""" % \
(view, edit_link, style, employe)
instance.save()
-class DossierPieceAdmin(admin.ModelAdmin):
- pass
-
-
-class DossierCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
- ProtectRegionMixin, admin.ModelAdmin,):
+class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin,
+ ProtectRegionMixin, BaseAdmin):
prefixe_recherche_temporelle = "rh_dossiers__"
alphabet_filter = 'nom'
DEFAULT_ALPHABET = u'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- search_fields = ('id', 'nom', 'prenom', 'nom_affichage', )
+ search_fields = (
+ 'id', 'nom', 'prenom', 'nom_affichage',
+ 'rh_dossiers__poste__nom',
+ 'rh_dossiers__poste__nom_feminin'
+ )
ordering = ('nom', )
form = EmployeAdminForm
list_display = (
'_apercu',
'_nom',
'_dossiers_postes',
+ 'date_entree',
'_date_modification',
'user_modification',
)
('Informations personnelles', {
'fields': ('situation_famille', 'date_entree', )}
),
- ('Coordonnées', {
+ ('Coordonnées personnelles', {
'fields': (
('tel_domicile', 'tel_cellulaire'),
('adresse', 'ville'),
('code_postal', 'province'),
'pays',
+ 'courriel_perso'
)}
),
)
return u"""<a title="Aperçu de l'employé"
onclick="return showAddAnotherPopup(this);"
href='%s'>
- <img src="%simg/loupe.png" />
+ <img src="%simg/employe-apercu.png" />
</a>""" % \
(reverse('employe_apercu', args=(obj.id,)), settings.STATIC_URL)
_apercu.allow_tags = True
href="%s"
onclick="return showAddAnotherPopup(this);"
title="Aperçu du dossier">
- <img src="%simg/loupe.png" />
+ <img src="%simg/dossier-apercu.png" />
</a>
<a href="%s">Dossier</a>
""" % \
href="%s"
onclick="return showAddAnotherPopup(this);"
title="Aperçu du poste">
- <img src="%simg/loupe.png" />
+ <img src="%simg/poste-apercu.png" />
</a>
<a href="%s">Poste</a>
""" % \
def _organigramme(self, obj):
l = []
- for d in rh.Dossier.objects.filter((Q(date_fin__gt=datetime.date.today()) | Q(date_fin=None)) & (Q(date_debut__lt=datetime.date.today()) | Q(date_debut=None)) ).filter(employe=obj.id).all():
- organigramme = u"""Organigramme, niveau: <input type="text" id="level_%s" style="width:30px;height:15px;" /> <input type="button" value="Générer" onclick="window.location='%s'+document.getElementById('level_%s').value" />""" % \
- (d.poste.id, reverse('rho_employe_sans_niveau', args=(d.poste.id,)), d.poste.id)
- link = u"""<li>%s - [%s] %s : %s</li>""" % \
- (d.date_debut.year,
- d.poste.id,
- d.poste.nom,
- organigramme
- )
+ for d in rh.Dossier.objects.filter(
+ Q(date_fin__gt=datetime.date.today()) | Q(date_fin=None),
+ Q(date_debut__lt=datetime.date.today()) | Q(date_debut=None),
+ employe=obj.id
+ ):
+ organigramme = \
+ u'Organigramme, niveau: ' \
+ u'<input type="text" id="level_%s" ' \
+ u'style="width:30px;height:15px;" /> ' \
+ u'<input type="button" value="Générer" ' \
+ u"""onclick="window.location='%s' + """ \
+ u"""document.getElementById('level_%s').value" />""" % (
+ d.poste.id,
+ reverse('rho_employe_sans_niveau', args=(d.poste.id,)),
+ d.poste.id
+ )
+ link = u"""<li>%s - [%s] %s : %s</li>""" % (
+ d.date_debut.year,
+ d.poste.id,
+ d.poste.nom,
+ organigramme
+ )
l.append(link)
return "<ul>%s</ul>" % "\n".join(l)
_organigramme.short_description = "Organigramme"
-class EmployeCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class EmployePieceAdmin(admin.ModelAdmin):
- pass
-
-
-class FamilleEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class CategorieEmploiAdmin(AUFMetadataAdminMixin, BaseAdmin):
list_display = ('nom', '_date_modification', 'user_modification', )
inlines = (TypePosteInline,)
fieldsets = AUFMetadataAdminMixin.fieldsets + (
_date_modification.admin_order_field = 'date_modification'
-class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class OrganismeBstgAdmin(AUFMetadataAdminMixin, BaseAdmin):
search_fields = ('nom',)
list_display = (
'nom',
_date_modification.admin_order_field = 'date_modification'
-class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
- ProtectRegionMixin, admin.ModelAdmin, AjaxSelect,):
+class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin,
+ ProtectRegionMixin, BaseAdmin, AjaxSelect):
form = make_ajax_form(rh.Poste, {
'implantation': 'implantations',
'type_poste': 'typepostes',
'_apercu',
'_nom',
'_occupe_par',
- 'implantation',
+ '_implantation',
'_service',
'_responsable',
'date_debut',
'implantation',
'service',
'type_poste',
- 'type_poste__famille_emploi',
+ 'type_poste__categorie_emploi',
+ 'type_poste__famille_professionnelle',
'vacant',
)
list_display_links = ('_nom',)
PosteCommentaireInline, )
def lookup_allowed(self, key, value):
- if key in (
- 'date_debut__gte',
- 'date_debut__isnull',
- 'date_fin__lte',
- 'date_fin__isnull',
- 'implantation__region__id__exact',
- 'implantation__id__exact',
- 'type_poste__id__exact',
- 'type_poste__famille_emploi__id__exact',
- 'service__id__exact',
- 'service__isnull',
- 'vacant__exact',
- 'vacant__isnull',
- ):
- return True
+ return key in (
+ 'date_debut__gte', 'date_debut__isnull', 'date_fin__lte',
+ 'date_fin__isnull', 'implantation__region__id__exact',
+ 'implantation__id__exact', 'type_poste__id__exact',
+ 'type_poste__categorie_emploi__id__exact', 'service__id__exact',
+ 'service__isnull', 'vacant__exact', 'vacant__isnull',
+ ) or super(PosteAdmin, self).lookup_allowed(key, value)
def _apercu(self, poste):
view_link = u"""<a onclick="return showAddAnotherPopup(this);"
title="Aperçu du poste"
href='%s'>
- <img src="%simg/loupe.png" />
+ <img src="%simg/poste-apercu.png" />
</a>""" % \
(reverse('poste_apercu', args=(poste.id,)),
settings.STATIC_URL,)
def _dae(self, poste):
apercu_link = ""
- if dae.ImportPoste.objects.filter(rh=poste).exists():
- dae_id = dae.ImportPoste.objects.get(rh=poste).dae_id
- apercu_link = u"""<a title="Aperçu du dossier"
- onclick="return showAddAnotherPopup(this);"
- href='%s'>
- <img src="%simg/loupe.png" />
- </a>""" % \
- (reverse('poste_consulter', args=("dae-%s" % dae_id,)),
- settings.STATIC_URL,
- )
+ postes_dae = poste.postes_dae.all()
+ if len(postes_dae) > 0:
+ poste_dae = postes_dae[0]
+ apercu_link = \
+ u'<a title="Aperçu du dossier" href="%s" ' \
+ u'onclick="return showAddAnotherPopup(this);">' \
+ u'<img src="%simg/loupe.png" /></a>' % (reverse(
+ 'poste_consulter', args=("dae-%s" % poste_dae.id,)
+ ), settings.STATIC_URL)
return apercu_link
_dae.allow_tags = True
_dae.short_description = u"DAE"
try:
responsable = u"""<a href="%s"
onclick="return showAddAnotherPopup(this)">
- <img src="%simg/loupe.png"
+ <img src="%simg/poste-apercu.png"
title="Aperçu du poste" />
</a>
<a href="%s">%s</a>
responsable = ''
try:
- employe_id = obj.responsable.rh_dossiers.all()[0].id
- employe = u"""<br />
+ dossier = obj.responsable.rh_dossiers.all().order_by('-date_debut')[0]
+ employe_id = dossier.employe.id
+ employe_html = u"""<br />
<a href="%s"
onclick="return showAddAnotherPopup(this)">
- <img src="%simg/loupe.png"
+ <img src="%simg/employe-apercu.png"
title="Aperçu de l'employé">
</a>
<a href="%s">%s</a>""" % \
(reverse('employe_apercu', args=(employe_id,)),
settings.STATIC_URL,
reverse('admin:rh_employe_change', args=(employe_id,)),
- employe)
+ dossier.employe)
except:
- employe = ""
+ employe_html = ""
- return "%s %s" % (responsable, employe)
+ return "%s %s" % (responsable, employe_html)
_responsable.short_description = 'Responsable'
_responsable.allow_tags = True
+ def _implantation(self, poste):
+ return poste.implantation.nom
+ _implantation.short_description = 'Implantation'
+ _implantation.admin_order_field = 'implantation'
+
def _nom(self, poste):
return """<a href="%s">%s</a>""" % \
(reverse('admin:rh_poste_change', args=(poste.id,)),
poste.nom)
_nom.allow_tags = True
- _nom.short_description = u'Nom'
+ _nom.short_description = u'Poste'
_nom.admin_order_field = 'nom'
def _date_modification(self, obj):
l = []
for e in employes:
link = u"""<a href='%s'
- title='Aperçu de l\'employer'
+ title='Aperçu de l\'employé'
onclick='return showAddAnotherPopup(this)'>
- <img src='%simg/loupe.png' />
+ <img src='%simg/employe-apercu.png' />
</a>
<a href='%s'>%s</a>""" % \
(reverse('employe_apercu', args=(e.id,)),
formset.save_m2m()
-class PosteCommentaireAdmin(admin.ModelAdmin):
- pass
-
-
-class PosteFinancementAdmin(admin.ModelAdmin):
- pass
-
+class ResponsableInline(admin.TabularInline):
+ model = rh.ResponsableImplantation
+ extra = 0
+ fk_name = "implantation"
-class PostePieceAdmin(admin.ModelAdmin):
- fk_name = 'poste'
+class ResponsableImplantationAdmin(BaseAdmin):
+ actions = None
+ list_filter = ('region', 'statut', )
+ list_display = ('_region', '_nom', 'statut', '_responsable', )
+ readonly_fields = ('nom', )
+ fields = ('nom', )
+ inlines = (ResponsableInline, )
+
+ def _region(self, obj):
+ return obj.region.code
+ _region.short_description = u"Région"
+ _region.admin_order_field = 'region__code'
+
+ def _nom(self, obj):
+ return obj.nom
+ _nom.short_description = u"Implantation"
+ _nom.admin_order_field = 'nom'
+
+ def _responsable(self, obj):
+ try:
+ employe = obj.responsable.employe
+ dossiers = employe.dossiers_encours()
+ if len(dossiers) == 0:
+ return u"<span style='color: red;'>%s %s </span>" % (
+ employe, u"sans dossier actif")
+ else:
+ return employe
+ except Exception:
+ if obj.statut in (1, 2): # ouverte, ouverture imminente
+ css = "style='color: red;'"
+ else:
+ css = ""
+ return u"<span %s>Pas de responsable</span>" % css
+ _responsable.allow_tags = True
+ _responsable.short_description = u"Responsable"
-class RemunerationAdmin(admin.ModelAdmin):
- pass
+ def has_add_permission(self, request=None):
+ return False
+ def has_change_permission(self, request, obj=None):
+ return in_drh_or_admin(request.user)
-class ResponsableImplantationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
- fieldsets = AUFMetadataAdminMixin.fieldsets + (
- (None, {
- 'fields': ('employe', 'implantation', ),
- }),
- )
+ def has_delete_permission(self, request, obj=None):
+ return False
-class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin, ArchiveMixin):
+class ServiceAdmin(AUFMetadataAdminMixin, BaseAdmin, ArchiveMixin):
list_display = (
'nom',
'_archive',
class ServiceProxyAdmin(ServiceAdmin):
- list_display = ('nom', '_organigramme')
+ list_display = ('nom', '_organigramme', '_archive', )
actions = None
def __init__(self, *args, **kwargs):
super(ServiceProxyAdmin, self).__init__(*args, **kwargs)
self.list_display_links = (None, )
+ def queryset(self, request):
+ return super(ServiceProxyAdmin, self).queryset(request) \
+ .annotate(num_postes=Count('rh_postes')) \
+ .filter(num_postes__gt=0)
+
def has_add_permission(self, obj):
return False
- def changelist_view(self, request, extra_context=None):
- if not request.GET.has_key('status__exact'):
- q = request.GET.copy()
- q['archive__exact'] = '0'
- request.GET = q
- request.META['QUERY_STRING'] = request.GET.urlencode()
- return super(ServiceProxyAdmin,self).changelist_view(request,
- extra_context=extra_context)
+ def has_change_permission(self, request, obj=None):
+ return in_drh_or_admin(request.user)
def _organigramme(self, obj):
return """<a href="%s"><strong>Organigramme</strong></a>""" % \
_organigramme.short_description = "Organigramme"
-class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class StatutAdmin(AUFMetadataAdminMixin, BaseAdmin):
list_display = ('code', 'nom', '_date_modification', 'user_modification', )
fieldsets = AUFMetadataAdminMixin.fieldsets + (
(None, {
_date_modification.admin_order_field = 'date_modification'
-class TauxChangeAdmin(admin.ModelAdmin):
+class TauxChangeAdmin(BaseAdmin):
list_display = (
'taux',
'devise',
_date_modification.admin_order_field = 'date_modification'
-class TypeContratAdmin(admin.ModelAdmin):
+class TypeContratAdmin(BaseAdmin):
list_display = (
'nom',
'nom_long',
_date_modification.admin_order_field = 'date_modification'
-class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class TypePosteAdmin(AUFMetadataAdminMixin, BaseAdmin):
search_fields = ('nom', 'nom_feminin', )
list_display = (
'nom',
- 'famille_emploi',
+ 'categorie_emploi',
'_date_modification',
'user_modification',
)
- list_filter = ('famille_emploi', )
+ list_filter = ('categorie_emploi', 'famille_professionnelle')
fieldsets = AUFMetadataAdminMixin.fieldsets + (
(None, {
'fields': (
'nom',
'nom_feminin',
'is_responsable',
- 'famille_emploi',
+ 'categorie_emploi',
+ 'famille_professionnelle',
)}
),
)
_date_modification.admin_order_field = 'date_modification'
-class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin, ArchiveMixin):
+class TypeRemunerationAdmin(AUFMetadataAdminMixin, BaseAdmin,
+ ArchiveMixin):
list_display = (
'nom',
'type_paiement',
_date_modification.admin_order_field = 'date_modification'
-class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class TypeRevalorisationAdmin(AUFMetadataAdminMixin, BaseAdmin):
list_display = ('nom', '_date_modification', 'user_modification', )
fieldsets = AUFMetadataAdminMixin.fieldsets + (
(None, {'fields': ('nom', )}),
_date_modification.admin_order_field = 'date_modification'
-class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class ValeurPointAdmin(AUFMetadataAdminMixin, BaseAdmin):
list_display = (
'_devise_code',
'_devise_nom',
return obj.devise.nom
_devise_nom.short_description = "Nom de la devise"
-class ImplantationProxyAdmin(admin.ModelAdmin):
+
+class ImplantationProxyAdmin(BaseAdmin):
list_display = ('nom', '_organigramme')
actions = None
def has_add_permission(self, obj):
return False
+ def has_change_permission(self, request, obj=None):
+ return in_drh_or_admin(request.user)
+
def _organigramme(self, obj):
- return """<a href="%s"><strong>Organigramme</strong></a>""" % (reverse('rho_implantation', args=(obj.id,)))
+ return '<a href="%s"><strong>Organigramme</strong></a>' % (
+ reverse('rho_implantation', args=(obj.id,))
+ )
_organigramme.allow_tags = True
_organigramme.short_description = "Organigramme"
-class RegionProxyAdmin(admin.ModelAdmin):
+
+class RegionProxyAdmin(BaseAdmin):
list_display = ('nom', '_organigramme')
actions = None
def has_add_permission(self, obj):
return False
+ def has_change_permission(self, request, obj=None):
+ return in_drh_or_admin(request.user)
+
def _organigramme(self, obj):
- return """<a href="%s"><strong>Organigramme</strong></a>""" % (reverse('rho_region', args=(obj.id,)))
+ return """<a href="%s"><strong>Organigramme</strong></a>""" % (
+ reverse('rho_region', args=(obj.id,))
+ )
_organigramme.allow_tags = True
_organigramme.short_description = "Organigramme"
-
-
admin.site.register(rh.Classement, ClassementAdmin)
admin.site.register(rh.Devise, DeviseAdmin)
admin.site.register(rh.Dossier, DossierAdmin)
admin.site.register(EmployeProxy, EmployeProxyAdmin)
admin.site.register(ServiceProxy, ServiceProxyAdmin)
admin.site.register(rh.Employe, EmployeAdmin)
-admin.site.register(rh.FamilleEmploi, FamilleEmploiAdmin)
+admin.site.register(rh.CategorieEmploi, CategorieEmploiAdmin)
+admin.site.register(rh.FamilleProfessionnelle)
admin.site.register(rh.OrganismeBstg, OrganismeBstgAdmin)
admin.site.register(rh.Poste, PosteAdmin)
-admin.site.register(rh.ResponsableImplantation, ResponsableImplantationAdmin)
+admin.site.register(
+ rh.ResponsableImplantationProxy, ResponsableImplantationAdmin
+)
admin.site.register(rh.Service, ServiceAdmin)
admin.site.register(rh.Statut, StatutAdmin)
admin.site.register(rh.TauxChange, TauxChangeAdmin)