django-alphafilter
django-form-utils
django-tinymce
+ django-sendfile
+
# LA PROD ne dispose que de reportlab 2.1, incompatible avec
# les versions de pisa assez évoluées pour un bon rendu.
# reportlab
#html5lib = 0.90
#pyPDF = 1.13
#pisa = 3.0.33
+django-sendfile = 0.2.1
-#reportlab = 2.5
-#html5lib = 0.90
-#pyPDF = 1.13
-#pisa = 3.0.33
-
-[django]
+[django]
recipe = auf.recipe.django
-wsgi=true
+wsgi=true
settings=production
extra-paths = project
eggs =${buildout:eggs}
REGIME_TRAVAIL_DEFAULT=100.00
REGIME_TRAVAIL_NB_HEURE_SEMAINE_DEFAULT=35.00
-
# Upload de fichiers
-storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT,
- base_url=settings.PRIVE_MEDIA_URL)
-
-def poste_piece_dispatch(instance, filename):
- path = "poste/%s/%s" % (instance.poste_id, filename)
- return path
-
-def dossier_piece_dispatch(instance, filename):
- path = "dossier/%s/%s" % (instance.dossier_id, filename)
- return path
+UPLOAD_STORAGE = FileSystemStorage(settings.PRIVE_MEDIA_ROOT)
### POSTE
"""
poste = models.ForeignKey("Poste")
nom = models.CharField(verbose_name="Nom", max_length=255)
- fichier = models.FileField(verbose_name="Fichier",
- upload_to=poste_piece_dispatch,
- storage=storage_prive)
+ fichier = models.FileField(verbose_name="Fichier", upload_to='dae/poste', storage=UPLOAD_STORAGE)
class PosteComparaison(models.Model):
poste = models.ForeignKey('Poste', related_name='comparaisons_internes')
"""
dossier = models.ForeignKey("Dossier")
nom = models.CharField(verbose_name="Nom", max_length=255)
- fichier = models.FileField(verbose_name="Fichier",
- upload_to=dossier_piece_dispatch,
- storage=storage_prive)
+ fichier = models.FileField(verbose_name="Fichier", upload_to='dae/dossier', storage=UPLOAD_STORAGE)
class DossierComparaison(models.Model):
<h2>Pièces jointes</h2>
<ul>
{% for pj in dossier.dossierpiece_set.all %}
- <li><a href="{{ pj.fichier.url }}" target="_blank">{{ pj.nom }}</a></li>
+ <li><a href="{% url dossier_piece pj.id %}">{{ pj.nom }}</a></li>
{% endfor %}
</ul>
<h2>Pièces jointes</h2>
<ul>
{% for pj in dossier.dossierpiece_set.all %}
- <li><a href="{{ pj.fichier.url }}" target="_blank">{{ pj.nom }}</a></li>
+ <li><a href="{% url dossier_piece pj.id %}">{{ pj.nom }}</a></li>
{% endfor %}
</ul>
<h2>Pièces jointes</h2>
<ul>
{% for pj in poste.postepiece_set.all %}
- <li><a href="{{ pj.fichier.url }}">{{ pj.nom }}</a></li>
+ <li><a href="{% url poste_piece pj.id %}">{{ pj.nom }}</a></li>
{% endfor %}
</ul>
</fieldset>
# -*- encoding: utf-8 -*
from django.conf.urls.defaults import patterns, url, include
-from django.conf import settings
urlpatterns = patterns(
'project.dae.views',
- (r'^prive/(?P<path>.*)$', 'mediaserve', {'document_root': settings.PRIVE_MEDIA_ROOT}),
url(r'^$', 'index', name='dae_index'),
# poste
url(r'^poste/consulter/(?P<key>.*)$', 'poste_consulter', name='poste_consulter'),
url(r'^poste$', 'poste', name='poste'),
url(r'^poste/(?P<key>.*)$', 'poste', name='poste'),
+ url(r'^pieces-postes/(\d+)$', 'poste_piece', name='poste_piece'),
# embauche
url(r'^embauches$', 'embauches_liste', name='dae_embauches_liste'),
url(r'^employe/(?P<key>.*)$', 'employe', name='employe'),
url(r'^dossier$', 'dossier', name='dossier'),
url(r'^dossier/(?P<poste_key>.*)/(?P<employe_key>.*)$', 'dossier', name='dossier'),
+ url(r'^pieces-dossiers/(\d+)$', 'dossier_piece', name='dossier_piece'),
url(r'^dossier_resume/(?P<dossier_id>.*)$', 'dossier_resume', name='dossier_resume'),
url(r'^poste_resume/(?P<dossier_id>.*)$', 'poste_resume', name='poste_resume'),
url(r'^salaire$', 'salaire', name='salaire'),
from django.template.loader import get_template
from django.contrib import messages
from django.conf import settings
+from django.contrib.auth.decorators import login_required
from reversion.models import Version
+from sendfile import sendfile
+
from project.dae import models as dae
from project.rh_v1 import models as rh
def index(request):
return render_to_response('dae/index.html', {}, RequestContext(request))
+
+### POSTE
+
@dae_groupe_requis
@poste_dans_ma_region_ou_service
def poste_consulter(request, key):
vars['postes_valides'] = dae.Poste.objects.ma_region_ou_service(request.user).filter(etat=POSTE_ETAT_DRH_FINALISATION).order_by('-date_creation')
return render_to_response('dae/postes_liste.html', vars, RequestContext(request))
+@login_required
+def poste_piece(request, id):
+ """Téléchargement d'une pièce jointe à un poste."""
+ piece = get_object_or_404(dae.PostePiece, pk=id)
+ if dae.Poste.objects.ma_region_ou_service(request.user).filter(id=piece.poste_id).exists():
+ return sendfile(request, piece.fichier.path, attachment=True)
+ else:
+ return redirect_interdiction(request)
+
+
+### DOSSIER
+
def filtered_type_remun():
defaut = (2, 3, 8, 17) # salaire de base, indemnité de fonction, charges patronales
return rh.TypeRemuneration.objects.filter(pk__in=defaut)
data = [('', 'Nouveau poste')] + sorted([('dae-%s' % p.id, label_poste_display(p)) for p in dae_ | copies] + [('rh-%s' % p.id, label_poste_display(p)) for p in rhv1], key=lambda t: t[1])
return HttpResponse(dumps(data))
+@login_required
+def dossier_piece(request, id):
+ """Téléchargement d'une pièce jointe à un poste."""
+ piece = get_object_or_404(dae.DossierPiece, pk=id)
+ if dae.Dossier.objects.ma_region_ou_service(request.user).filter(id=piece.dossier_id).exists():
+ return sendfile(request, piece.fichier.path, attachment=True)
+ else:
+ return redirect_interdiction(request)
+
################################################################################
# AJAX SECURITE non nécessaire
'paste_remove_styles' : 'true',
'content_css' : '/media/css/tinymce.css',
}
+
+# django-sendfile
+
+SENDFILE_BACKEND = 'sendfile.backends.simple'