icones apercus
[auf_rh_dae.git] / project / rh / admin.py
index 78d1689..76adef5 100644 (file)
@@ -9,7 +9,7 @@ from auf.django.metadata.admin import \
 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
 
 import auf.django.references.models as ref
@@ -22,6 +22,12 @@ from groups import grp_correspondants_rh
 from decorators import in_drh_or_admin
 
 
+class BaseAdmin(admin.ModelAdmin):
+
+    class Media:
+        css = {'screen': ('css/admin_custom.css',)}
+
+
 class ArchiveMixin(object):
     """
     Archive Mixin pour gérer le queryset et le display
@@ -58,6 +64,7 @@ class ImplantationProxy(ref.Implantation):
 
 class ServiceProxy(rh.Service):
     """ Proxy utilisé pour les organigrammes opar service """
+
     class Meta:
         proxy = True
         verbose_name = u"Organigramme par services"
@@ -255,7 +262,7 @@ class PosteComparaisonInline(AUFMetadataInlineAdminMixin, admin.TabularInline):
     model = rh.PosteComparaison
 
 
-class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class ClassementAdmin(AUFMetadataAdminMixin, BaseAdmin):
     list_display = ('_classement', '_date_modification', 'user_modification', )
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
@@ -273,11 +280,7 @@ class ClassementAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _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',
@@ -299,14 +302,19 @@ class DeviseAdmin(AUFMetadataAdminMixin, admin.ModelAdmin, ArchiveMixin):
     _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',
@@ -389,7 +397,7 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         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,
@@ -435,7 +443,7 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
     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,)),
@@ -457,7 +465,7 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         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)
@@ -474,20 +482,16 @@ class DossierAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
             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 = (
@@ -495,6 +499,7 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
             '_apercu',
             '_nom',
             '_dossiers_postes',
+            'date_entree',
             '_date_modification',
             'user_modification',
             )
@@ -520,12 +525,13 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         ('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'
                 )}
             ),
         )
@@ -534,7 +540,7 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         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
@@ -566,7 +572,7 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
                              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>
                           &nbsp;""" % \
@@ -578,7 +584,7 @@ class EmployeAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
                            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>
                         &nbsp;""" % \
@@ -660,15 +666,7 @@ class EmployeProxyAdmin(EmployeAdmin):
     _organigramme.short_description = "Organigramme"
 
 
-class EmployeCommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-class EmployePieceAdmin(admin.ModelAdmin):
-    pass
-
-
-class CategorieEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class CategorieEmploiAdmin(AUFMetadataAdminMixin, BaseAdmin):
     list_display = ('nom', '_date_modification', 'user_modification', )
     inlines = (TypePosteInline,)
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
@@ -681,7 +679,7 @@ class CategorieEmploiAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _date_modification.admin_order_field = 'date_modification'
 
 
-class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class OrganismeBstgAdmin(AUFMetadataAdminMixin, BaseAdmin):
     search_fields = ('nom',)
     list_display = (
             'nom',
@@ -703,8 +701,8 @@ class OrganismeBstgAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _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',
@@ -727,7 +725,7 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         '_apercu',
         '_nom',
         '_occupe_par',
-        'implantation',
+        '_implantation',
         '_service',
         '_responsable',
         'date_debut',
@@ -742,6 +740,7 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         'service',
         'type_poste',
         'type_poste__categorie_emploi',
+        'type_poste__famille_professionnelle',
         'vacant',
         )
     list_display_links = ('_nom',)
@@ -800,27 +799,19 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
                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__categorie_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,)
@@ -860,7 +851,7 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         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>
@@ -873,19 +864,19 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
             responsable = ''
 
         try:
-            employe = obj.responsable.rh_dossiers.all()[0]
-            employe_id = obj.responsable.rh_dossiers.all()[0].id
+            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_html = ""
 
@@ -893,12 +884,17 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
     _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):
@@ -916,9 +912,9 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
             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,)),
@@ -941,36 +937,30 @@ class PosteAdmin(DateRangeMixin, AUFMetadataAdminMixin, \
         formset.save_m2m()
 
 
-class PosteCommentaireAdmin(admin.ModelAdmin):
-    pass
-
-
-class PosteFinancementAdmin(admin.ModelAdmin):
-    pass
-
-
-class PostePieceAdmin(admin.ModelAdmin):
-    fk_name = 'poste'
-
-
-class RemunerationAdmin(admin.ModelAdmin):
-    pass
-
-
 class ResponsableInline(admin.TabularInline):
     model = rh.ResponsableImplantation
     extra = 0
     fk_name = "implantation"
 
 
-class ResponsableImplantationAdmin(admin.ModelAdmin):
+class ResponsableImplantationAdmin(BaseAdmin):
     actions = None
     list_filter = ('region', 'statut', )
-    list_display = ('nom', 'statut', '_responsable', )
+    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
@@ -999,7 +989,7 @@ class ResponsableImplantationAdmin(admin.ModelAdmin):
         return False
 
 
-class ServiceAdmin(AUFMetadataAdminMixin, admin.ModelAdmin, ArchiveMixin):
+class ServiceAdmin(AUFMetadataAdminMixin, BaseAdmin, ArchiveMixin):
     list_display = (
             'nom',
             '_archive',
@@ -1028,6 +1018,11 @@ class ServiceProxyAdmin(ServiceAdmin):
         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
 
@@ -1041,7 +1036,7 @@ class ServiceProxyAdmin(ServiceAdmin):
     _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, {
@@ -1056,7 +1051,7 @@ class StatutAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _date_modification.admin_order_field = 'date_modification'
 
 
-class TauxChangeAdmin(admin.ModelAdmin):
+class TauxChangeAdmin(BaseAdmin):
     list_display = (
             'taux',
             'devise',
@@ -1078,7 +1073,7 @@ class TauxChangeAdmin(admin.ModelAdmin):
     _date_modification.admin_order_field = 'date_modification'
 
 
-class TypeContratAdmin(admin.ModelAdmin):
+class TypeContratAdmin(BaseAdmin):
     list_display = (
             'nom',
             'nom_long',
@@ -1098,7 +1093,7 @@ class TypeContratAdmin(admin.ModelAdmin):
     _date_modification.admin_order_field = 'date_modification'
 
 
-class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class TypePosteAdmin(AUFMetadataAdminMixin, BaseAdmin):
     search_fields = ('nom', 'nom_feminin', )
     list_display = (
             'nom',
@@ -1106,7 +1101,7 @@ class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
             '_date_modification',
             'user_modification',
             )
-    list_filter = ('categorie_emploi', )
+    list_filter = ('categorie_emploi', 'famille_professionnelle')
     fieldsets = AUFMetadataAdminMixin.fieldsets + (
         (None, {
             'fields': (
@@ -1114,6 +1109,7 @@ class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
                 'nom_feminin',
                 'is_responsable',
                 'categorie_emploi',
+                'famille_professionnelle',
                 )}
             ),
         )
@@ -1125,7 +1121,7 @@ class TypePosteAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _date_modification.admin_order_field = 'date_modification'
 
 
-class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin,
+class TypeRemunerationAdmin(AUFMetadataAdminMixin, BaseAdmin,
                             ArchiveMixin):
     list_display = (
             'nom',
@@ -1147,7 +1143,7 @@ class TypeRemunerationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin,
     _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', )}),
@@ -1160,7 +1156,7 @@ class TypeRevalorisationAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _date_modification.admin_order_field = 'date_modification'
 
 
-class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
+class ValeurPointAdmin(AUFMetadataAdminMixin, BaseAdmin):
     list_display = (
             '_devise_code',
             '_devise_nom',
@@ -1190,7 +1186,7 @@ class ValeurPointAdmin(AUFMetadataAdminMixin, admin.ModelAdmin):
     _devise_nom.short_description = "Nom de la devise"
 
 
-class ImplantationProxyAdmin(admin.ModelAdmin):
+class ImplantationProxyAdmin(BaseAdmin):
     list_display = ('nom', '_organigramme')
     actions = None
 
@@ -1212,7 +1208,7 @@ class ImplantationProxyAdmin(admin.ModelAdmin):
     _organigramme.short_description = "Organigramme"
 
 
-class RegionProxyAdmin(admin.ModelAdmin):
+class RegionProxyAdmin(BaseAdmin):
     list_display = ('nom', '_organigramme')
     actions = None
 
@@ -1241,6 +1237,7 @@ admin.site.register(EmployeProxy, EmployeProxyAdmin)
 admin.site.register(ServiceProxy, ServiceProxyAdmin)
 admin.site.register(rh.Employe, EmployeAdmin)
 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(