items.MenuItem('Rapport des contrats', reverse('rhr_contrats')),
#items.MenuItem('Rapport de rémunération', reverse('rhr_remuneration')),
items.MenuItem('Rapport des postes par service', reverse('rhr_postes_service')),
- items.MenuItem('Rappor des postes par implantation', reverse('rhr_postes_implantation')),
+ items.MenuItem('Rapport des postes par implantation', reverse('rhr_postes_implantation')),
+ items.MenuItem('Modelisation des postes', reverse('rhr_postes_modelisation')),
]
),
]
STATUT_FUTUR = 'Futur'
STATUT_INCONNU = 'Inconnu'
-class ChangeList(DjangoChangeList):
+
+class RechercheTemporelle(object):
+ model = None
+ params = None
+ prefixe_recherche_temporelle = ""
+ lookup_recherche_temporelle = {}
internal_fields = (KEY_ANNEE, KEY_DATE_DEBUT, KEY_DATE_FIN, KEY_STATUT, )
STATUT_CHOICES = (STATUT_ACTIF, STATUT_INACTIF, STATUT_FUTUR, STATUT_INCONNU )
-
- def __init__(self, *args, **kwargs):
- super(ChangeList, self).__init__(*args, **kwargs)
+
+ def __init__(self, request, model):
+ self.model = model
+ self.params = dict(request.GET.items())
def get_prefix(self):
- return getattr(self.model_admin, 'prefixe_recherche_temporelle', "")
+ klass = getattr(self, "model_admin", self)
+ return getattr(klass, 'prefixe_recherche_temporelle', "")
def get_annees(self):
prefix = self.get_prefix()
annees.sort(reverse=True)
return annees
-
def get_q_inconnu(self, prefix):
date_debut_nulle = Q(**{"%s%s__isnull" % (prefix, KEY_DATE_DEBUT) : True})
date_fin_nulle = Q(**{"%s%s__isnull" % (prefix, KEY_DATE_FIN) : True})
return q_range
+ def purge_params(self, lookup_params):
+ self.lookup_recherche_temporelle = {}
+ params = lookup_params.copy()
+ for key, value in lookup_params.items():
+ # ignorer les param GET pour la recherche temporelle
+ if len([i for i in self.internal_fields if key.endswith(i)]) > 0:
+ del params[key]
+ self.lookup_recherche_temporelle[key] = value
+ continue
+ return params
+
+ def filter_temporel(self, qs):
+ q = Q()
+ prefix = self.get_prefix()
+ borne_gauche = None
+ borne_droite = None
+ for k, v in self.lookup_recherche_temporelle.items():
+
+ if k.endswith(KEY_ANNEE):
+ borne_gauche = "%s-01-01" % v
+ borne_droite = "%s-12-31" % v
+
+ if k.endswith(KEY_DATE_DEBUT):
+ date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
+ borne_gauche = time.strftime("%Y-%m-%d", date)
+
+ if k.endswith(KEY_DATE_FIN):
+ date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
+ borne_droite = time.strftime("%Y-%m-%d", date)
+
+ if k.endswith(KEY_STATUT):
+ aujourdhui = datetime.date.today()
+ if v == STATUT_ACTIF:
+ borne_gauche = aujourdhui
+ borne_droite = aujourdhui
+ elif v == STATUT_INACTIF:
+ # dans le cas d'une FK, on retire des inactifs ceux qui ont une FK active
+ if prefix != "":
+ q_range = self.get_q_range(prefix, aujourdhui, aujourdhui)
+ id_actifs = [o.id for o in qs.filter(q_range).distinct()]
+ qs = qs.exclude(id__in=id_actifs)
+ borne_droite = aujourdhui
+ elif v == STATUT_FUTUR:
+ borne_gauche = aujourdhui
+ elif v == STATUT_INCONNU:
+ q = q & self.get_q_inconnu(prefix)
+ q_range = self.get_q_range(prefix, borne_gauche, borne_droite)
+ qs = qs.filter(q & q_range).distinct()
+ return qs
+
+RechercheTemporelle.get_query_string = DjangoChangeList.get_query_string.im_func
+
+
+class ChangeList(DjangoChangeList, RechercheTemporelle):
+
+ def __init__(self, *args, **kwargs):
+ super(ChangeList, self).__init__(*args, **kwargs)
+
def get_query_set(self):
- lookup_recherche_temporelle = {}
use_distinct = False
qs = self.root_query_set
for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR, TO_FIELD_VAR):
if i in lookup_params:
del lookup_params[i]
+
+ lookup_params = self.purge_params(lookup_params)
for key, value in lookup_params.items():
if not isinstance(key, str):
# 'key' will be used as a keyword argument later, so Python
del lookup_params[key]
lookup_params[smart_str(key)] = value
- # ignorer les param GET pour la recherche temporelle
- if len([i for i in self.internal_fields if key.endswith(i)]) > 0:
- del lookup_params[key]
- lookup_recherche_temporelle[key] = value
- continue
-
if not use_distinct:
# Check if it's a relationship that might return more than one
# instance
except:
raise IncorrectLookupParameters
- q = Q()
- prefix = self.get_prefix()
- borne_gauche = None
- borne_droite = None
- for k, v in lookup_recherche_temporelle.items():
-
- if k.endswith(KEY_ANNEE):
- borne_gauche = "%s-01-01" % v
- borne_droite = "%s-12-31" % v
-
- if k.endswith(KEY_DATE_DEBUT):
- date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
- borne_gauche = time.strftime("%Y-%m-%d", date)
-
- if k.endswith(KEY_DATE_FIN):
- date = time.strptime(v, settings.DATE_INPUT_FORMATS[0])
- borne_droite = time.strftime("%Y-%m-%d", date)
-
- if k.endswith(KEY_STATUT):
- aujourdhui = datetime.date.today()
- if v == STATUT_ACTIF:
- borne_gauche = aujourdhui
- borne_droite = aujourdhui
- elif v == STATUT_INACTIF:
- # dans le cas d'une FK, on retire des inactifs ceux qui ont une FK active
- if prefix != "":
- q_range = self.get_q_range(prefix, aujourdhui, aujourdhui)
- id_actifs = [o.id for o in qs.filter(q_range).distinct()]
- qs = qs.exclude(id__in=id_actifs)
- borne_droite = aujourdhui
- elif v == STATUT_FUTUR:
- borne_gauche = aujourdhui
- elif v == STATUT_INCONNU:
- q = q & self.get_q_inconnu(prefix)
-
- q_range = self.get_q_range(prefix, borne_gauche, borne_droite)
- qs = qs.filter(q & q_range).distinct()
+ qs = self.filter_temporel(qs)
# Use select_related() if one of the list_display options is a field
# with a relationship and the provided queryset doesn't already have
{% load i18n %}
-
<h3>{% blocktrans with title as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
{% if choices|length > 5 %}
<select style="width: 160px;" onchange="window.location=window.location.pathname+this.options[this.selectedIndex].value">
{% extends 'rh/rapports/base.html' %}
-{% load adminmedia rapports i18n %}
+{% load adminmedia rapports i18n change_list %}
+
+{% block extrastyle %}
+<script type="text/javascript" src="/admin/jsi18n"></script>
+<script type="text/javascript" src="{{ STATIC_URL }}/admin/js/core.js"></script>
+{{ block.super }}
+{% endblock %}
{% block nomrapport %}Rapport Contrats{% endblock %}
{% filter_a_venir %}
</div>
+
+{% recherche_par_annees cl %}
+
<table id="result_list" class="results">
<thead>
<tr>
--- /dev/null
+{% extends 'rh/rapports/base.html' %}
+{% load adminmedia rapports i18n %}
+
+{% block nomrapport %}Rapport postes par implantation{% endblock %}
+{% block count_elements %}{% endblock %}
+
+{% block contentrapport %}
+<ul>
+ {% for f in data %}
+ <li>
+ {{ f.famille.nom }} ({{ f.nb_types }})
+ <ul>
+ {% for t in f.types %}
+ <li>
+ {{ t.type.nom }} ({{ t.num_postes }})
+ <ul>
+ {% for p in t.postes %}
+ <li>{{ p.nom }} [{{ p.id }}]</li>
+ {% endfor %}
+ </ul>
+ </li>
+ {% endfor %}
+ </ul>
+ </li>
+ {% endfor %}
+</ul>
+{% endblock %}
'choices': prepare_choices(COMBLE_CHOICES, 'comble', context)}
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_region(context):
return {'title': u"région",
'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'implantation__region', context, remove=['pays', 'nord_sud'])}
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_implantation(context):
return {'title': u"implantation",
'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'implantation', context)}
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_region_contrat(context):
return {'title': u"région",
'choices': prepare_choices(Region.objects.values_list('id', 'nom'), 'dossier__poste__implantation__region', context, remove=['pays', 'nord_sud'])}
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_implantation_contrat(context):
return {'title': u"implantation",
'choices': prepare_choices(Implantation.objects.values_list('id', 'nom'), 'dossier__poste__implantation', context)}
-@register.inclusion_tag('admin/filter_select.html', takes_context=True)
+@register.inclusion_tag('admin/filter.html', takes_context=True)
def filter_type_contrat(context):
return {'title': u"type de contrat",
'choices': prepare_choices(TypeContrat.objects.values_list('id', 'nom'), 'type_contrat', context)}
return {'title': u"échéance",
'choices': prepare_choices_date(field_name, context, links=(
('Tous', {}),
+ ('échus', {'%s__lt' % field_name: today.strftime('%Y-%m-%d'),}),
('moins de 3 mois', {'%s__gte' % field_name: today.strftime('%Y-%m-%d'),
'%s__lte' % field_name: three_months.strftime('%Y-%m-%d')}),
('3 à 6 mois', {'%s__gte' % field_name: three_months.strftime('%Y-%m-%d'),
url(r'^admin/rh/rapports/remuneration$', 'rapports_remuneration', name='rhr_remuneration'),
url(r'^admin/rh/rapports/postes_par_service$', 'rapports_postes_service', name='rhr_postes_service'),
url(r'^admin/rh/rapports/postes_par_implantation$', 'rapports_postes_implantation', name='rhr_postes_implantation'),
+ url(r'^admin/rh/rapports/postes_modelisation$', 'rapports_postes_modelisation', name='rhr_postes_modelisation'),
url(r'^admin/rh/dossier/(\d+)/apercu/$', 'dossier_apercu', name='dossier_apercu'),
url(r'^admin/rh/employe/(\d+)/apercu/$', 'employe_apercu', name='employe_apercu'),
url(r'^admin/rh/poste/(\d+)/apercu/$', 'poste_apercu', name='poste_apercu'),
from rh.lib import calc_remun
from rh.decorators import drh_or_admin_required
from rh.templatetags.rapports import SortHeaders
+from rh.change_list import RechercheTemporelle
# pas de reference a DAE devrait etre refactorisé
from dae.utils import get_employe_from_user
lookup_params[smart_str(key)] = value
contrats = rh.Contrat.objects.select_related('dossier', 'dossier__poste', 'dossier__poste__implantation', 'type_contrat', 'dossier__employe')
+
+ cl = RechercheTemporelle(request, rh.Contrat)
+ lookup_params = cl.purge_params(lookup_params)
contrats = contrats.filter(**lookup_params).exclude(dossier__employe__supprime=1)
+ contrats = cl.filter_temporel(contrats)
+
if 'o' in request.GET:
contrats = contrats.order_by("%s%s" % ('-' if 'ot' in request.GET and request.GET['ot'] == "desc" else '', request.GET['o']))
h = SortHeaders(request, headers, order_field_type="ot", order_field="o")
c = {
+ 'cl' : cl,
'title': 'Rapport des contrats',
'contrats': contrats,
'count': len(contrats),
@login_required
@drh_or_admin_required
+def rapports_postes_modelisation(request):
+ c = {}
+ data = []
+
+ for f in rh.FamilleEmploi.objects.all():
+ types = rh.TypePoste.objects.filter(famille_emploi=f)
+ data_types = []
+ for t in types.all():
+ postes = rh.Poste.objects.filter(type_poste=t)
+ data_types.append({
+ 'num_postes': postes.count(),
+ 'postes': postes.all(),
+ 'type': f,
+ })
+
+ data.append({
+ 'famille': f,
+ 'nb_types': types.count(),
+ 'types' : data_types
+ })
+
+ c['data'] = data
+
+
+ return render_to_response('rh/rapports/postes_modelisation.html', c, RequestContext(request))
+
+
+@login_required
+@drh_or_admin_required
def rapports_postes_implantation(request):
c = {}
data = []