model = Utilisateur
fields = ('nom', 'prenom', 'courriel', 'genre')
+ def clean_courriel(self):
+ """On veut s'assurer qu'il n'y ait pas d'autre utilisateur actif
+ avec le même courriel."""
+ courriel = self.cleaned_data['courriel']
+ existing = Personne.objects.filter(courriel=courriel, actif=True).count()
+ if existing:
+ raise forms.ValidationError('Il existe déjà une fiche pour cette adresse électronique')
+ return courriel
+
class PersonneInscriptionForm(PersonneForm):
password = forms.CharField(widget=forms.PasswordInput(), label="Mot de passe")
password_confirmation = forms.CharField(widget=forms.PasswordInput(), label="Confirmez votre mot de passe")
class PublicationForm(forms.ModelForm):
class Meta:
model = Publication
- fields = ('titre', 'revue', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
+ fields = ('titre', 'revue', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url', 'publication_affichage')
-class TheseForm(PublicationForm):
- titre = forms.CharField(required=True, label="Titre de la thèse ou du mémoire")
- annee = forms.IntegerField(required=True, label="Année de soutenance (réalisée ou prévue)")
- editeur = forms.CharField(required=True, label="Directeur de thèse ou de mémoire")
- lieu_edition = forms.CharField(required=True, label="Établissement de soutenance")
+PublicationFormSet = inlineformset_factory(Chercheur, Publication, form=PublicationForm, extra=1)
+
+class TheseForm(forms.ModelForm):
class Meta:
- model = Publication
- fields = ('titre', 'annee', 'editeur', 'lieu_edition', 'nb_pages', 'url')
+ model = These
+ fields = ('titre', 'annee', 'directeur', 'etablissement', 'nb_pages', 'url')
class ExpertiseForm(forms.ModelForm):
organisme_demandeur_visible = forms.ChoiceField(
self.chercheur = ChercheurForm(data=data, prefix='chercheur', instance=chercheur)
self.groupes = GroupesForm(data=data, prefix='chercheur', chercheur=chercheur)
self.personne = personne_form_class(data=data, prefix='personne', instance=chercheur and chercheur.personne.utilisateur)
- self.publication1 = PublicationForm(data=data, prefix='publication1', instance=chercheur and chercheur.publication1)
- self.publication2 = PublicationForm(data=data, prefix='publication2', instance=chercheur and chercheur.publication2)
- self.publication3 = PublicationForm(data=data, prefix='publication3', instance=chercheur and chercheur.publication3)
- self.publication4 = PublicationForm(data=data, prefix='publication4', instance=chercheur and chercheur.publication4)
- self.these = TheseForm(data=data, prefix='these', instance=chercheur and chercheur.these)
self.expertises = ExpertiseFormSet(data=data, prefix='expertise', instance=chercheur)
+ self.these = TheseForm(data=data, prefix='these', instance=chercheur and chercheur.these)
+ self.publications = PublicationFormSet(data=data, prefix='publication', instance=chercheur)
@property
def has_errors(self):
return bool(self.chercheur.errors or self.personne.errors or self.groupes.errors or
- self.publication1.errors or self.publication2.errors or self.publication3.errors or
- self.publication4.errors or self.these.errors or self.expertises.errors)
+ self.these.errors or self.publications.errors or self.expertises.errors)
def is_valid(self):
return self.chercheur.is_valid() and self.personne.is_valid() and self.groupes.is_valid() and \
- self.publication1.is_valid() and self.publication2.is_valid() and \
- self.publication3.is_valid() and self.publication4.is_valid() and \
- self.these.is_valid() and self.expertises.is_valid()
+ self.these.is_valid() and self.publications.is_valid() and self.expertises.is_valid()
def save(self):
if self.is_valid():
# Enregistrer d'abord les clés étrangères car on doit les stocker dans
# l'objet chercheur.
chercheur.personne = self.personne.save()
- if self.publication1.cleaned_data['titre']:
- chercheur.publication1 = self.publication1.save()
- if self.publication2.cleaned_data['titre']:
- chercheur.publication2 = self.publication2.save()
- if self.publication3.cleaned_data['titre']:
- chercheur.publication3 = self.publication3.save()
- if self.publication4.cleaned_data['titre']:
- chercheur.publication4 = self.publication4.save()
- chercheur.these = self.these.save()
# Puis enregistrer le chercheur lui-même.
self.chercheur.save()
- # Puis les many-to-many puisqu'on a besoin d'un id.
+ # Puis les objets qui ont des clés étrangères vers nous
+ # puisqu'on a besoin d'un id.
self.groupes.chercheur = chercheur
self.groupes.save()
+ self.these.instance.chercheur = chercheur
+ self.these.save()
+ self.publications.instance = chercheur
+ self.publications.save()
self.expertises.instance = chercheur
self.expertises.save()
email = cleaned_data.get("email")
if email:
try:
- Utilisateur.objects.get(courriel=email)
+ Utilisateur.objects.get(courriel=email, actif=True)
except:
raise forms.ValidationError("Cette adresse n'existe pas dans notre base de données.")
return email
class Personne(models.Model):
id = models.AutoField(primary_key=True)
- salutation = models.CharField(max_length=128, null = True, blank = True)
+ salutation = models.CharField(max_length=128, null=True, blank=True)
nom = models.CharField(max_length=255)
- prenom = models.CharField(max_length=128, verbose_name = 'Prénom')
- courriel = models.EmailField(max_length=128, unique=True, verbose_name="Adresse électronique")
- fonction = models.CharField(max_length=128, null = True, blank = True)
+ prenom = models.CharField(max_length=128, verbose_name='prénom')
+ courriel = models.EmailField(max_length=128, verbose_name="adresse électronique")
+ fonction = models.CharField(max_length=128, null=True, blank=True)
date_naissance = models.DateField(null=True, blank=True)
- sousfonction = models.CharField(max_length=128, null = True, blank = True,
- verbose_name = 'Sous-fonction')
- mobile = models.CharField(max_length=32, null = True, blank = True,
- verbose_name = 'Numéro de téléphone portable ')
+ sousfonction = models.CharField(max_length=128, null=True, blank=True, verbose_name='sous-fonction')
+ mobile = models.CharField(max_length=32, null=True, blank=True, verbose_name='numéro de téléphone portable')
genre = models.CharField(max_length=1, choices=GENRE_CHOICES)
- commentaire = models.TextField(verbose_name = 'Commentaires', null = True,
- blank = True)
- actif = models.BooleanField(editable = False)
+ commentaire = models.TextField(verbose_name='commentaires', null=True, blank=True)
+ actif = models.BooleanField(editable=False, default=True)
def __unicode__(self):
return u"%s %s, %s" % (self.prenom, self.nom, self.courriel)
groupes = models.ManyToManyField('Groupe', through='ChercheurGroupe', blank=True, verbose_name='Domaines de recherche')
- #Refactoring, mettre les publications comme etant des many2many;
- publication1 = models.ForeignKey('Publication',
- db_column='publication1', null=True,
- blank=True, editable=False,
- related_name='publication1',
- verbose_name='Publication 1')
- publication2 = models.ForeignKey('Publication',
- db_column='publication2', null=True,
- blank=True, editable=False,
- related_name='publication2',
- verbose_name = 'Publication 2')
- publication3 = models.ForeignKey('Publication',
- db_column='publication3', null=True,
- blank=True, editable=False,
- related_name='publication3',
- verbose_name = 'Publication 3')
- publication4 = models.ForeignKey('Publication',
- db_column='publication4', null=True,
- blank=True, editable=False,
- related_name='publication4',
- verbose_name = 'Publication 4')
-
- these = models.ForeignKey('Publication', db_column='these', null=True,
- blank=True, related_name='These', editable=False)
-
# Activités en francophonie
membre_instance_auf = models.BooleanField(default=False, verbose_name="est ou a déjà été membre d'une instance de l'AUF")
membre_instance_auf_details = models.CharField(max_length=255, blank=True, verbose_name="détails")
super(Chercheur, self).save()
class Publication(models.Model):
- id = models.AutoField(primary_key=True, db_column='id')
- titre = models.CharField(max_length=255, db_column='titre', null=True, blank=True, verbose_name = 'Titre')
- revue = models.CharField(max_length=255, db_column='revue', null=True, blank=True, verbose_name = 'Revue')
- annee = models.IntegerField(db_column='annee', null=True, blank=True, verbose_name='Année de publication')
- editeur = models.CharField(max_length=255, db_column='editeur', null=True, blank=True, verbose_name = 'Éditeur')
- lieu_edition = models.CharField(max_length=255, db_column='lieu_edition', null=True, blank=True, verbose_name = 'Lieu d\'édition')
- nb_pages = models.CharField(max_length=255, db_column='nb_pages', null=True, blank=True, verbose_name = 'Nombre de pages')
- url = models.CharField(max_length=255, db_column='url', null=True, blank=True, verbose_name = 'Lien vers la publication')
+ chercheur = models.ForeignKey(Chercheur, related_name='publications')
+ titre = models.CharField(max_length=255, null=True, blank=True, verbose_name='titre')
+ revue = models.CharField(max_length=255, null=True, blank=True, verbose_name='Revue')
+ annee = models.IntegerField(null=True, blank=True, verbose_name='Année de publication')
+ editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='Éditeur')
+ lieu_edition = models.CharField(max_length=255, null=True, blank=True, verbose_name="Lieu d'édition")
+ nb_pages = models.CharField(max_length=255, null=True, blank=True, verbose_name='Nombre de pages')
+ url = models.CharField(max_length=255, null=True, blank=True, verbose_name='Lien vers la publication')
#Migration des publications depuis l'ancien repertoire de chercheurs
- publication_affichage = models.TextField(verbose_name = 'Publication', null = True,
- blank = True)
- actif = models.BooleanField(editable = False, db_column='actif')
+ publication_affichage = models.TextField(verbose_name='Publication', null=True, blank=True)
+ actif = models.BooleanField(editable=False)
def __unicode__(self):
- return u"%s" % (self.titre)
+ return self.titre
+class These(models.Model):
+ chercheur = models.OneToOneField(Chercheur, primary_key=True)
+ titre = models.CharField(max_length=255, verbose_name='Titre de la thèse ou du mémoire')
+ annee = models.IntegerField(verbose_name='Année de soutenance (réalisée ou prévue)')
+ directeur = models.CharField(max_length=255, verbose_name='Directeur de thèse ou de mémoire')
+ etablissement = models.CharField(max_length=255, verbose_name='Établissement de soutenance')
+ nb_pages = models.IntegerField(verbose_name='Nombre de pages', blank=True, null=True)
+ url = models.CharField(max_length=255, verbose_name='Lien vers la publication', blank=True)
+
+ def __unicode__(self):
+ return self.titre
+
class Expertise(models.Model):
id = models.AutoField(primary_key=True, db_column='id')
chercheur = models.ForeignKey(Chercheur, related_name='expertises')
if request.method == "POST":
form = SendPasswordForm(data=request.POST)
if form.is_valid():
- u = Utilisateur.objects.get(courriel=form.cleaned_data['email'])
+ u = Utilisateur.objects.get(courriel=form.cleaned_data['email'], actif=True)
code = u.get_new_password_code()
link = "%s/accounts/new_password/%s/%s/" % (settings.SITE_ROOT_URL, u.courriel, code)
context_instance = RequestContext(request))
def new_password(request, email, code):
- u = Utilisateur.objects.get(courriel=email)
+ u = Utilisateur.objects.get(courriel=email, actif=True)
original_code = u.get_new_password_code()
message=""
if(code == original_code):
def desinscription(request):
"""Désinscription du chercheur"""
try:
- chercheur = Chercheur.objects.get(personne__courriel=request.user.email)
+ chercheur = Chercheur.objects.get(personne__courriel=request.user.email, personne__actif=True)
except Chercheur.DoesNotExist:
return HttpResponseRedirect(url('chercheurs.views.chercheur_login'))
if request.method == 'POST':
return render_to_response("chercheurs/edit.html",
dict(forms=forms, chercheur=chercheur),
- context_instance = RequestContext(request))
+ context_instance=RequestContext(request))
@login_required()
def perso(request):
user_sep = Utilisateur.objects.none()
if request.user.is_authenticated():
try:
- user_chercheur = Chercheur.objects.get(personne__courriel=request.user.email)
+ user_chercheur = Chercheur.objects.get(personne__courriel=request.user.email, personne__actif=True)
user_sep = Utilisateur.objects.get(id=user_chercheur.personne_id)
except:
pass
fieldset { clear:both; padding:10px; margin:0 0 0 0; position:relative }
fieldset { border-color:#000000; border-width:1px 0 0 0; border-style:solid none none none; }
fieldset { font-size:100%; }
-fieldset fieldset { border:1px solid #ccc; background:#fafafa; margin:10px }
+fieldset fieldset { border:1px solid #ccc; background:#fafafa; margin:10px; padding: 15px; }
legend { font-size:150%; font-weight:bold; color:#000000; margin:0 0 0 0; padding:0 5px; }
label {
.horizontal-radio-buttons ul { margin-left:0 }
.horizontal-radio-buttons li { display:inline }
-.delete-row { position:absolute; top:10px; right:10px }
-.add-row { float:right; margin-right:21px }
+.delete-row { position:absolute; top:5px; right:5px }
+.add-row { float:right; margin-right:16px }
.cadre { width: 60%; margin: 100px auto; padding: 20px; background: #f9f9f9; border: 1px solid #aaa }
deleteText: 'supprimer cette expertise',
formCssClass: 'dynamic-form-expertises'
});
+ $('#publications fieldset').formset({
+ prefix: 'publication',
+ addText: 'ajouter une publication',
+ deleteText: 'supprimer cette publication',
+ formCssClass: 'dynamic-form-publications'
+ });
update_etablissement_autre()
$('#id_chercheur-etablissement').change(update_etablissement_autre)
});
+-- Le chercheur n'a pas besoin d'une colonne "actif". C'est la "personne" qui a
+-- le champ "actif".
+
ALTER TABLE chercheurs_chercheur DROP COLUMN actif;
+
+-- On déplace les thèses dans leur propre table pour les isoler des
+-- publications.
+
+CREATE TABLE `chercheurs_these` (
+ `chercheur_id` integer NOT NULL PRIMARY KEY,
+ `titre` varchar(255) NOT NULL,
+ `annee` integer NOT NULL,
+ `directeur` varchar(255) NOT NULL,
+ `etablissement` varchar(255) NOT NULL,
+ `nb_pages` integer,
+ `url` varchar(255) NOT NULL
+)
+;
+ALTER TABLE `chercheurs_these` ADD CONSTRAINT `chercheur_id_refs_id_727f1a45` FOREIGN KEY (`chercheur_id`) REFERENCES `chercheurs_chercheur` (`id`);
+
+INSERT INTO chercheurs_these (chercheur_id, titre, annee, directeur, etablissement, nb_pages, url)
+SELECT c.id, p.titre, p.annee, p.editeur, p.lieu_edition, NULLIF(p.nb_pages, ''), p.url
+FROM chercheurs_publication p
+INNER JOIN chercheurs_chercheur c ON c.these = p.id;
+
+DELETE p FROM chercheurs_publication p
+INNER JOIN chercheurs_chercheur c ON c.these = p.id;
+
+ALTER TABLE chercheurs_chercheur DROP COLUMN these;
+
+-- Les publications auront maintenant une foreign key vers les chercheurs
+-- plutôt que le contraire.
+
+ALTER TABLE chercheurs_publication ADD COLUMN `chercheur_id` integer NOT NULL AFTER id;
+ALTER TABLE `chercheurs_publication` ADD CONSTRAINT `chercheur_id_refs_id_4bd3fee4` FOREIGN KEY (`chercheur_id`) REFERENCES `chercheurs_chercheur` (`id`);
+
+UPDATE chercheurs_publication p
+INNER JOIN chercheurs_chercheur c ON p.id IN (c.publication1, c.publication2, c.publication3, c.publication4)
+SET p.chercheur_id = c.id;
+
+ALTER TABLE chercheurs_chercheur
+ DROP COLUMN publication1,
+ DROP COLUMN publication2,
+ DROP COLUMN publication3,
+ DROP COLUMN publication4;
+
+-- On ne peut pas à la fois forcer une clé unique sur le courriel et conserver
+-- les comptes inactifs dans la table.
+
+ALTER TABLE chercheurs_personne
+ DROP KEY courriel,
+ ADD KEY courriel (courriel);
<div style="clear:both"></div>
</div>
</fieldset>
+
+<fieldset id="publications">
+ <legend>Publications</legend>
+ {{ forms.publications.management_form }}
+ {% for form in forms.publications.forms %}
+ <fieldset>
+ <table>
+ {% if form.initial.publication_affichage %}
+ {% form_field form.publication_affichage %}
+ {% else %}
+ {% form_field form.titre %}
+ {% form_field form.revue %}
+ {% form_field form.annee %}
+ {% form_field form.editeur %}
+ {% form_field form.lieu_edition %}
+ {% form_field form.nb_pages %}
+ {% form_field form.url %}
+ {% endif %}
+ </table>
+ {{ form.id }}
+ {{ form.DELETE }}
+ </fieldset>
+ {% endfor %}
+</fieldset>
{% block contenu %}
<h4>{{chercheur.personne.prenom}} {{chercheur.personne.nom}}</h4>
-<form method="post">
+<form method="post" action="">
{% include "chercheurs/chercheur_form.html" %}
- <fieldset>
- <legend>Publications</legend>
- <div>
- <div class="infotip">
- <strong>Renseignements préalablements enregistrés</strong>
- <p>{{forms.publication1.instance.publication_affichage|default:"-"}}</p>
- </div>
- <div class="publication">
- {% with forms.publication1 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- </div>
- <div style="clear:both"></div>
- </div>
- <p id="show_publications">+ Autres publications</p>
- <div class="publications_autre">
- <h6>- Publication 2</h6>
- <div class="infotip">
- <strong>Renseignements préalablements enregistrés</strong>
- <p>{{forms.publication2.instance.publication_affichage|default:"-"}}</p>
- </div>
- <div class="publication">
- {% with forms.publication2 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- </div>
- <div style="clear:both"></div>
- <h6>- Publication 3</h6>
- <div class="infotip">
- <strong>Renseignements préalablements enregistrés</strong>
- <p>{{forms.publication3.instance.publication_affichage|default:"-"}}</p>
- </div>
- <div class="publication">
- {% with forms.publication3 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- </div>
- <div style="clear:both"></div>
- <h6>- Publication 4</h6>
- <div class="infotip">
- <strong>Renseignements préalablements enregistrés</strong>
- <p>{{forms.publication4.instance.publication_affichage|default:"-"}}</p>
- </div>
- <div class="publication">
- {% with forms.publication4 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- </div>
- <div style="clear:both"></div>
- </div>
- </fieldset>
-
<input type="submit" value="Sauvegarder" />
</form>
{% endblock %}
{% endfor %}
{% endif %}
- <h5>Publications</h5>
- <table id="publications">
- {% if chercheur.these %}
- <tr class="souligne">
- <td class="label">Thèse ou mémoire:</td>
- {% with chercheur.these as publication %}{% include "chercheurs/publication_display.html" %}{% endwith %}
- </tr>
- {% endif %}
- {% if chercheur.publication1 or chercheur.publication2 or chercheur.publication3 or chercheur.publication4 %}
- <tr>
- <td class="label">Publications:</td>
- {% with chercheur.publication1 as publication %}{% include "chercheurs/publication_display.html" %}{% endwith %}
- </tr>
+ {% if chercheur.these %}
+ <h5>Thèse ou mémoire</h5>
+ <table>
<tr>
- <td class="label"></td>
- {% with chercheur.publication2 as publication %}{% include "chercheurs/publication_display.html" %}{% endwith %}
+ <td class="label">Thèse ou mémoire:</td>
+ <td>
+ {% if chercheur.these.url %}
+ <i><a href="{{ chercheur.these.url }}">{{ chercheur.these.titre }}</a></i>,
+ {% else %}
+ <i>{{ chercheur.these.titre }}</i>,
+ {% endif %}
+ {{ chercheur.these.etablissement }},
+ {{ chercheur.these.annee }}{% if chercheur.these.nb_pages %},
+ {{ chercheur.these.nb_pages }} pages{% endif %}.
+ </td>
</tr>
<tr>
- <td class="label"></td>
- {% with chercheur.publication3 as publication %}{% include "chercheurs/publication_display.html" %}{% endwith %}
+ <td class="label">Directeur:</td>
+ <td>{{ chercheur.these.directeur }}</td>
</tr>
+ </table>
+ {% endif %}
+
+ {% if chercheur.publications %}
+ <h5>Publications</h5>
+ <table id="publications">
+ {% for publication in chercheur.publications.all %}
<tr>
- <td class="label"></td>
- {% with chercheur.publication4 as publication %}{% include "chercheurs/publication_display.html" %}{% endwith %}
+ {% if forloop.first %}
+ <td class="label">Publications:</td>
+ {% else %}
+ <td></td>
+ {% endif %}
+ {% include "chercheurs/publication_display.html" %}
</tr>
- {% endif %}
+ {% endfor %}
</table>
+ {% endif %}
</div>
<form method="post">
{% include "chercheurs/chercheur_form.html" %}
- <fieldset>
- <legend>Publications</legend>
- <div>
- <div class="publication">
- {% with forms.publication1 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- </div>
- <div style="clear:both"></div>
- </div>
- <p id="show_publications">+ Autres publications</p>
- <div class="publications_autre">
- <h6>- Publication 2</h6>
- {% with forms.publication2 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- <h6>- Publication 3</h6>
- {% with forms.publication3 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- <h6>- Publication 4</h6>
- {% with forms.publication4 as form %}
- {% include "table_form.html" %}
- {% endwith %}
- </div>
- </fieldset>
- <br />
<input type="submit" name="Submit" value="Inscription" class="bouton" />
</form>
{% endblock %}