Ajout des pièces jointes. 1763: Absence visualisation pièces jointes
authorNilovna Bascunan-Vasquez <contact@nilovna.com>
Wed, 27 Jul 2011 19:33:18 +0000 (15:33 -0400)
committerNilovna Bascunan-Vasquez <contact@nilovna.com>
Wed, 27 Jul 2011 19:33:18 +0000 (15:33 -0400)
.gitignore
project/recrutement/admin.py
project/recrutement/api.py
project/recrutement/templates/admin/recrutement/proxycandidat/change_form.html [new file with mode: 0644]
project/urls.py
src/auf.django.emploi/auf/django/emploi/api.py
src/auf.django.emploi/auf/django/emploi/models.py
src/auf.django.emploi/auf/django/emploi/settings.py [new file with mode: 0644]

index fba9937..ec755d5 100644 (file)
@@ -32,3 +32,4 @@ tmp
 
 # extra
 project/media_prive/*
+src/auf.django.emploi/auf/django/emploi/media_prive/*
index 45e7fa0..28577ab 100644 (file)
@@ -4,6 +4,7 @@ from django.core.urlresolvers import reverse
 from django.http import HttpResponseRedirect
 from django.contrib import admin
 from django.shortcuts import get_object_or_404
+from django.core.files.storage import default_storage
 
 from reversion.admin import VersionAdmin
 from datamaster_modeles.models import Employe, Implantation, Region
@@ -115,10 +116,6 @@ class ProxyOffreEmploiAdmin(OffreEmploiAdmin):
         return False   
 
 class ProxyCandidatPiece(CandidatPiece):
-    """
-    Ce proxy sert uniquement dans l'admin à disposer d'un libellé
-    plus ergonomique.
-    """
     class Meta:
         proxy = True
         verbose_name = "pièce jointe"
@@ -126,8 +123,9 @@ class ProxyCandidatPiece(CandidatPiece):
 
 class CandidatPieceInline(admin.TabularInline):
     model = ProxyCandidatPiece
-    fields = ('candidat', 'nom', )#'path', )
+    fields = ('candidat', 'nom', 'path',)
     extra = 1
+    max_num = 3
 
 class ProxyEvaluateur(Evaluateur.candidats.through):
     """
@@ -204,7 +202,7 @@ class CandidatAdmin(VersionAdmin):
         return "<a href='%s'>Voir le candidat</a>" % \
             (reverse('admin:recrutement_proxycandidat_change', args=(obj.id,)))
     afficher_candidat.allow_tags = True    
-    afficher_candidat.short_description = u'Afficher les détails du candidat'
+    afficher_candidat.short_description = u'Détails du candidat'
 
     # Voir l'offre d'emploi
     def voir_offre_emploi(self, obj):
@@ -294,7 +292,7 @@ class ProxyCandidatAdmin(CandidatAdmin):
                         'nombre_dependant', 'telephone', 'email', 'adresse', 
                         'ville', 'etat_province', 'code_postal', 'pays', 
                         'niveau_diplome', 'employeur_actuel', 'poste_actuel',
-                        'domaine_professionnel',)
+                        'domaine_professionnel', 'pieces_jointes',)
     fieldsets = (
         ("Offre d'emploi", {
             'fields': ('offre_emploi', )
@@ -310,7 +308,7 @@ class ProxyCandidatAdmin(CandidatAdmin):
         ('Informations professionnelles', {
             'fields': ('niveau_diplome','employeur_actuel', 
                         'poste_actuel', 'domaine_professionnel',)
-        }),  
+        }),   
     )
     inlines = []
 
index f8de70a..bf629d4 100644 (file)
@@ -65,12 +65,12 @@ class API:
         if self.request.method == "POST":
             form = emploiForms.PostulerOffreEmploiForm(self.request.POST,
                      instance=cand, offre_emploi=offre_emploi)
-            #piecesForm = emploiForms.CandidatPieceForm(self.request.POST, self.request.FILES,
-            #            instance=cand)
-            if form.is_valid(): # and piecesForm.is_valid():
+            piecesForm = emploiForms.CandidatPieceForm(self.request.POST, self.request.FILES,
+                        instance=cand)
+            if form.is_valid() and piecesForm.is_valid():
                 offre = form.save()
-                #piecesForm.instance = offre
-                #piecesForm.save() 
+                piecesForm.instance = offre
+                piecesForm.save() 
          
                 """courriel_template = CourrielTemplate.objects.\
                             get(nom_modele='Confirmation postulation (automatique)')
@@ -83,9 +83,9 @@ class API:
         else:
             form = emploiForms.PostulerOffreEmploiForm(instance=cand,
                     offre_emploi=offre_emploi)
-            #piecesForm = emploiForms.CandidatPieceForm(instance=cand)
+            piecesForm = emploiForms.CandidatPieceForm(instance=cand)
 
-        vars.update(dict(form=form, candidat=cand, ))#piecesForm=piecesForm, ))
+        vars.update(dict(form=form, candidat=cand, piecesForm=piecesForm, ))
      
         return render_to_response('recrutement/postuler_appel_offre.html', vars, 
                 RequestContext(self.request))
diff --git a/project/recrutement/templates/admin/recrutement/proxycandidat/change_form.html b/project/recrutement/templates/admin/recrutement/proxycandidat/change_form.html
new file mode 100644 (file)
index 0000000..5073e3f
--- /dev/null
@@ -0,0 +1,77 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify adminmedia %}
+
+{% block extrahead %}{{ block.super }}
+{% url admin:jsi18n as jsi18nurl %}
+<script type="text/javascript" src="{{ jsi18nurl|default:"../../../jsi18n/" }}"></script>
+{{ media }}
+{% endblock %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %}
+
+{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
+
+{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+     <a href="../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../">{{ app_label|capfirst|escape }}</a> &rsaquo;
+     {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} &rsaquo;
+     {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %}
+</div>
+{% endif %}{% endblock %}
+
+{% block content %}<div id="content-main">
+{% block object-tools %}
+{% if change %}{% if not is_popup %}
+  <ul class="object-tools"><li><a href="history/" class="historylink">{% trans "History" %}</a></li>
+  {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
+  </ul>
+{% endif %}{% endif %}
+{% endblock %}
+<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post" id="{{ opts.module_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if save_on_top %}{% submit_row %}{% endif %}
+{% if errors %}
+    <p class="errornote">
+    {% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
+    </p>
+    {{ adminform.form.non_field_errors }}
+{% endif %}
+
+{% for fieldset in adminform %}
+  {% include "admin/includes/fieldset.html" %}
+{% endfor %}
+
+{% block after_field_sets %}{% endblock %}
+
+{% for inline_admin_formset in inline_admin_formsets %}
+    {% include inline_admin_formset.opts.template %}
+{% endfor %}
+
+<fieldset class="module aligned ">
+    <h2>Pièces jointes</h2>
+    {% for p in original.pieces_jointes %}
+        <div class="form-row">
+            <label>{{ p.nom }}:</label>
+            <p><a href="{{ p.path.url }}">Voir</a></p>
+        </div>
+    {% endfor %}
+</fieldset>
+
+{% block after_related_objects %}{% endblock %}
+
+{% submit_row %}
+
+{% if adminform and add %}
+   <script type="text/javascript">document.getElementById("{{ adminform.first_field.id_for_label }}").focus();</script>
+{% endif %}
+
+{# JavaScript for prepopulated fields #}
+{% prepopulated_fields_js %}
+
+</div>
+</form></div>
+{% endblock %}
index c4d2f63..072b6a5 100644 (file)
@@ -2,6 +2,7 @@
 from django.conf.urls.defaults import patterns, include, handler500, url
 from django.conf import settings
 from django.contrib import admin
+from auf.django.emploi import settings as sett
 
 admin.autodiscover()
 
@@ -39,7 +40,7 @@ urlpatterns = patterns(
     (r'^tinymce/', include('tinymce.urls')),    
     (r'^', include('project.rh.urls')),
     (r'^prive/(?P<path>.*)$', 'django.views.static.serve', 
-        {'document_root': settings.PRIVE_MEDIA_ROOT}),
+        {'document_root': sett.PRIVE_MEDIA_ROOT}),
 )
 
 if settings.DEBUG:
index fdd97b5..0a51d2d 100644 (file)
@@ -21,8 +21,8 @@ class API:
 
         for offre_dict in liste_offres:
             offre = emploi.OffreEmploi()
-            #offre.est_affiche = offre_dict['est_affiche']
-            #offre.statut = offre_dict['statut']
+            offre.est_affiche = offre_dict['est_affiche']
+            offre.statut = offre_dict['statut']
             offre.nom = offre_dict['nom']
             offre.resume = offre_dict['resume']
             offre.description = offre_dict['description']
@@ -45,8 +45,8 @@ class API:
         obj_offres_emploi = []
 
         offre = emploi.OffreEmploi()
-        #obj_offre.est_affiche = offre_dict('est_affiche')
-        #obj_offre.statut = offre_dict('statut')
+        offre.est_affiche = offre_dict['est_affiche']
+        offre.statut = offre_dict['statut']
         offre.nom = offre_dict['nom']
         offre.resume = offre_dict['resume']
         offre.description = offre_dict['description']
index 62716c4..555c540 100755 (executable)
@@ -1,4 +1,4 @@
-# -=- encoding: utf-8 -=-
+# -*- encoding: utf-8 -*
 
 import datetime
 from django.core.files.storage import FileSystemStorage
@@ -135,30 +135,32 @@ class Candidat(Metadata):
     def __unicode__(self):
         return '%s %s [%s]' % (self.prenom, self.nom, self.id)
 
+    def pieces_jointes(self):
+        return CandidatPiece.objects.filter(candidat=self) 
+    pieces_jointes.allow_tags = True    
+
     class Meta:
         db_table = 'emploi_candidat'
 
 # Upload de fichiers
-#storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, 
-#                            base_url=settings.PRIVE_MEDIA_URL)
+storage_prive = FileSystemStorage(settings.PRIVE_MEDIA_ROOT, 
+                            base_url=settings.PRIVE_MEDIA_URL)
 
 def candidat_piece_dispatch(instance, filename):
-    path = "offre_emploi/%s_%s/%s/%s_%s" % (instance.candidat.nom, 
-                instance.candidat.prenom, instance.nom, instance.candidat.id,
-                filename)
+    path = u'%s/%s/%s_%s_%s/%s/%s' % ('emplois', instance.candidat.offre_emploi.id,
+            instance.candidat.nom, instance.candidat.prenom, instance.candidat.id, 
+            instance.nom, filename)
     return path
 
 class CandidatPiece(models.Model):
     candidat = models.ForeignKey(Candidat, db_column='candidat',
                 related_name='candidat_piece') 
     nom = models.CharField(max_length=3, choices=TYPE_PIECE_CHOICES)
-    #path = PrivateFileField("file", upload_to=candidat_piece_dispatch)
-    #    path = models.FileField(verbose_name="Fichier", 
-    #        upload_to=candidat_piece_dispatch, )
-    #storage=storage_prive, )
+    path = models.FileField(verbose_name="Fichier", 
+                        upload_to=candidat_piece_dispatch, storage=storage_prive)
 
     class Meta:
-        db_table = 'emploi_evaluateur'
+        db_table = 'emploi_pieces'
         verbose_name = "pièce jointe"
         verbose_name_plural = "pièces jointes"
 
diff --git a/src/auf.django.emploi/auf/django/emploi/settings.py b/src/auf.django.emploi/auf/django/emploi/settings.py
new file mode 100644 (file)
index 0000000..101b2a1
--- /dev/null
@@ -0,0 +1,17 @@
+# -*- encoding: utf-8 -*-
+
+import os
+from django.conf import settings
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = getattr(settings, 'OE_MEDIA_ROOT', 
+                        os.path.join(os.path.dirname(__file__), 'media'))
+PRIVE_MEDIA_ROOT = getattr(settings, 'OE_PRIV_MEDIA_ROOT', 
+                        os.path.join(os.path.dirname(__file__), 'media_prive'))
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = '/media/'
+PRIVE_MEDIA_URL = '/prive/'