Début de l'interface d'ajout de stages
This commit is contained in:
parent
45a009d9d5
commit
692b64ee84
13 changed files with 228 additions and 9 deletions
|
@ -79,7 +79,7 @@ DATABASES = {
|
||||||
# Internationalization
|
# Internationalization
|
||||||
# https://docs.djangoproject.com/en/1.7/topics/i18n/
|
# https://docs.djangoproject.com/en/1.7/topics/i18n/
|
||||||
|
|
||||||
LANGUAGE_CODE = 'en-us'
|
LANGUAGE_CODE = 'fr-fr'
|
||||||
|
|
||||||
TIME_ZONE = 'UTC'
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,8 @@ from django.conf.urls import patterns, include, url
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
# Examples:
|
|
||||||
# url(r'^$', 'experiENS.views.home', name='home'),
|
|
||||||
# url(r'^blog/', include('blog.urls')),
|
|
||||||
|
|
||||||
url(r'^admin/', include(admin.site.urls)),
|
url(r'^admin/', include(admin.site.urls)),
|
||||||
|
url(r'^accounts/login/$', 'django_cas_ng.views.login', name = "cas_login_view"),
|
||||||
|
url(r'^accounts/logout/$', 'django_cas_ng.views.logout'),
|
||||||
|
url(r'^', include('monstage.urls', namespace="monstage")),
|
||||||
)
|
)
|
||||||
|
|
41
monstage/migrations/0002_auto_20150612_2003.py
Normal file
41
monstage/migrations/0002_auto_20150612_2003.py
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('monstage', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='lieu',
|
||||||
|
options={'verbose_name': 'Lieu', 'verbose_name_plural': 'Lieux'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='lieustage',
|
||||||
|
options={'verbose_name': 'Avis sur un lieu de stage', 'verbose_name_plural': 'Avis sur un lieu de stage'},
|
||||||
|
),
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='stage',
|
||||||
|
options={'verbose_name': 'Stage', 'verbose_name_plural': 'Stages'},
|
||||||
|
),
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='stage',
|
||||||
|
old_name='user',
|
||||||
|
new_name='profil_user',
|
||||||
|
),
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='stagematiere',
|
||||||
|
name='users',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='stage',
|
||||||
|
name='matieres',
|
||||||
|
field=models.ManyToManyField(related_name='stages', to='monstage.StageMatiere'),
|
||||||
|
preserve_default=True,
|
||||||
|
),
|
||||||
|
]
|
|
@ -66,7 +66,7 @@ class StageMatiere(models.Model):
|
||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
class Stage(models.Model):
|
class Stage(models.Model):
|
||||||
user = models.ForeignKey(Normalien, related_name = "stages")
|
profil_user = models.ForeignKey(Normalien, related_name = "stages")
|
||||||
published = models.BooleanField(_("Visible publiquement"), default = False)
|
published = models.BooleanField(_("Visible publiquement"), default = False)
|
||||||
type_stage = models.CharField (_(u"Type"),
|
type_stage = models.CharField (_(u"Type"),
|
||||||
default = "stage",
|
default = "stage",
|
||||||
|
@ -78,6 +78,7 @@ class Stage(models.Model):
|
||||||
encadrants = models.CharField(_(u"Encadrants"), max_length = 500, blank = True)
|
encadrants = models.CharField(_(u"Encadrants"), max_length = 500, blank = True)
|
||||||
lieux = models.ManyToManyField(Lieu, related_name = "stages", through = "LieuStage")
|
lieux = models.ManyToManyField(Lieu, related_name = "stages", through = "LieuStage")
|
||||||
matieres = models.ManyToManyField(StageMatiere, related_name = "stages")
|
matieres = models.ManyToManyField(StageMatiere, related_name = "stages")
|
||||||
|
# TODO : thematiques
|
||||||
|
|
||||||
# Avis
|
# Avis
|
||||||
avis_encadrants = models.TextField(_(u"Avis sur les encadrants"), blank = True)
|
avis_encadrants = models.TextField(_(u"Avis sur les encadrants"), blank = True)
|
||||||
|
@ -86,7 +87,7 @@ class Stage(models.Model):
|
||||||
avis_admin = models.TextField(_(u"Visa et administratif"), blank = True)
|
avis_admin = models.TextField(_(u"Visa et administratif"), blank = True)
|
||||||
|
|
||||||
def __unicode__(self):
|
def __unicode__(self):
|
||||||
return u"%s : %s" % (self.user.profil.username, self.sujet)
|
return u"%s : %s" % (self.profil_user.user.username, self.sujet)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Stage"
|
verbose_name = "Stage"
|
||||||
|
|
15
monstage/templates/monstage/index.html
Normal file
15
monstage/templates/monstage/index.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% extends "skeleton.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Bonjour {{ user.first_name }} !</h1>
|
||||||
|
<p><a href="{% url 'monstage:profil_edit' %}">Modifier mon profil</a></p>
|
||||||
|
<h2>Mes stages</h2>
|
||||||
|
<ul>
|
||||||
|
{% for stage in stages %}
|
||||||
|
<li><a href="{% url 'monstage:stage' stage.id %}">{{ stage.sujet }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
<li><a href="{% url 'monstage:stage_add' %}">Ajouter un stage</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
19
monstage/templates/monstage/profil.html
Normal file
19
monstage/templates/monstage/profil.html
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
{% extends "skeleton.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Profil de {{ profil.user.username }}</h1>
|
||||||
|
<p><a href="{% url 'monstage:index' %}">Retour</a></p>
|
||||||
|
<p>Prénom : {{ profil.user.first_name }}</p>
|
||||||
|
<p>Nom : {{ profil.user.last_name }}</p>
|
||||||
|
<h2>Ses stages</h2>
|
||||||
|
{% if stages %}
|
||||||
|
<ul>
|
||||||
|
{% for stage in stages %}
|
||||||
|
<li><a href="{% url 'monstage:stage' stage.id %}">{{ stage.sujet }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
{% else %}
|
||||||
|
<p>Aucun stage pour le moment</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
|
14
monstage/templates/monstage/profil_edit.html
Normal file
14
monstage/templates/monstage/profil_edit.html
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{% extends "skeleton.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Modifier son profil</h1>
|
||||||
|
<p><a href="{% url 'monstage:index' %}">Retour</a></p>
|
||||||
|
<form action="{% url 'monstage:profil_edit' %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
<label for="first_name">Prénom : </label><input type="text" name="first_name" id="first_name" value="{{ user.first_name }}" /> <br/>
|
||||||
|
<label for="last_name">Nom : </label><input type="text" name="last_name" id="last_name" value="{{ user.last_name }}" /> <br/>
|
||||||
|
<input type="submit" value="Enregistrer" />
|
||||||
|
</form>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
9
monstage/templates/monstage/stage.html
Normal file
9
monstage/templates/monstage/stage.html
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{% extends "skeleton.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>{{ stage.sujet }}</h1>
|
||||||
|
<p><a href="{% url 'monstage:index' %}">Retour</a></p>
|
||||||
|
<p>Stage de <a href="{% url 'monstage:profil' stage.profil_user.user.username %}">{{ stage.profil_user.user.first_name }} {{ stage.profil_user.user.last_name }}</a></p>
|
||||||
|
<p>Du {{ stage.start_date }} au {{ stage.end_date }}</p>
|
||||||
|
{% endblock %}
|
||||||
|
|
12
monstage/templates/monstage/stage_add.html
Normal file
12
monstage/templates/monstage/stage_add.html
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{% extends "skeleton.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Ajouter un stage</h1>
|
||||||
|
<p><a href="{% url 'monstage:index' %}">Retour</a></p>
|
||||||
|
<form action="{% url 'monstage:stage_add' %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form.as_p }}
|
||||||
|
<input type="submit" value="Etape suivante" />
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
|
|
12
monstage/templates/monstage/stage_edit_lieu.html
Normal file
12
monstage/templates/monstage/stage_edit_lieu.html
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{% extends "skeleton.html" %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<h1>Lieux du stage "{{ stage.sujet }}"</h1>
|
||||||
|
<p><a href="{% url 'monstage:index' %}">Retour</a></p>
|
||||||
|
<form action="{% url 'monstage:stage_add' %}" method="post">
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form.as_p }}
|
||||||
|
<input type="submit" value="Etape suivante" />
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
|
|
10
monstage/templates/skeleton.html
Normal file
10
monstage/templates/skeleton.html
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>ExperiENS</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
13
monstage/urls.py
Normal file
13
monstage/urls.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from django.conf.urls import patterns, url
|
||||||
|
|
||||||
|
from monstage import views
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
url(r'^$', views.index, name='index'),
|
||||||
|
url(r'^profil/show/(?P<profil_id>\w+)/$', views.profil, name='profil'),
|
||||||
|
url(r'^profil/edit/$', views.profil_edit, name='profil_edit'),
|
||||||
|
url(r'^stage/(?P<stage_id>\d+)/$', views.stage, name='stage'),
|
||||||
|
url(r'^stage/new/$', views.stage_add, name='stage_add'),
|
||||||
|
url(r'^stage/(?P<stage_id>\d+)/edit/$', views.stage_edit, name='stage_edit'),
|
||||||
|
url(r'^stage/(?P<stage_id>\d+)/edit/lieu/$', views.stage_edit_lieu, name='stage_edit_lieu'),
|
||||||
|
)
|
|
@ -1,3 +1,77 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import get_object_or_404, render
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.http import HttpResponseRedirect, HttpResponse, HttpResponseForbidden
|
||||||
|
from django.core.urlresolvers import reverse
|
||||||
|
from django import forms
|
||||||
|
|
||||||
# Create your views here.
|
from monstage.models import *
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def index(request):
|
||||||
|
stages = Stage.objects.filter( profil_user = request.user.profil )
|
||||||
|
return render(request, 'monstage/index.html', {"stages" : stages})
|
||||||
|
|
||||||
|
#
|
||||||
|
# Utilisateurs et profils
|
||||||
|
#
|
||||||
|
|
||||||
|
def profil(request, profil_id):
|
||||||
|
user = get_object_or_404( User, username = profil_id )
|
||||||
|
profil = user.profil
|
||||||
|
stages = Stage.objects.filter( profil_user = profil )
|
||||||
|
return render(request, 'monstage/profil.html', {'profil': profil, 'stages': stages})
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def profil_edit(request):
|
||||||
|
if request.POST:
|
||||||
|
user = request.user
|
||||||
|
user.first_name = request.POST['first_name']
|
||||||
|
user.last_name = request.POST['last_name']
|
||||||
|
user.save()
|
||||||
|
return HttpResponseRedirect(reverse('monstage:profil', args=(request.user.username,)))
|
||||||
|
else:
|
||||||
|
(profil, _) = Normalien.objects.get_or_create( user = request.user )
|
||||||
|
return render(request, 'monstage/profil_edit.html', {'normalien': profil})
|
||||||
|
|
||||||
|
#
|
||||||
|
# Stages
|
||||||
|
#
|
||||||
|
|
||||||
|
def stage(request, stage_id):
|
||||||
|
stage = get_object_or_404( Stage, pk = stage_id)
|
||||||
|
return render(request, 'monstage/stage.html', {'stage': stage})
|
||||||
|
|
||||||
|
class StageForm(forms.ModelForm):
|
||||||
|
def __init__(self, *args, **kw):
|
||||||
|
super(StageForm, self).__init__(*args, **kw)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = Stage
|
||||||
|
fields = ("type_stage", "start_date", "end_date", "matieres", "sujet", "encadrants")
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def stage_add(request):
|
||||||
|
if request.POST:
|
||||||
|
form = StageForm(request.POST)
|
||||||
|
if form.is_valid:
|
||||||
|
new_stage = form.save(commit = False)
|
||||||
|
new_stage.user = request.user.profil
|
||||||
|
new_stage.save()
|
||||||
|
return HttpResponseRedirect(reverse('monstage:stage_edit_lieu', args=(new_stage.id,)))
|
||||||
|
else:
|
||||||
|
form = StageForm()
|
||||||
|
return render(request, 'monstage/stage_add.html', { 'form': form })
|
||||||
|
|
||||||
|
def stage_edit_lieu(request, stage_id):
|
||||||
|
stage = get_object_or_404( Stage, pk = stage_id)
|
||||||
|
if stage.profil_user != request.user.profil:
|
||||||
|
return HttpResponseForbidden("Ce stage ne vous appartient pas")
|
||||||
|
return render(request, 'monstage/stage_edit_lieu.html', { 'stage': stage })
|
||||||
|
|
||||||
|
def stage_edit(request, stage_id):
|
||||||
|
stage = get_object_or_404( Stage, pk = stage_id)
|
||||||
|
return render(request, 'monstage/stage.html', {'stage': stage})
|
||||||
|
|
||||||
|
def detail(request, question_id):
|
||||||
|
question = get_object_or_404(Question, pk=question_id)
|
||||||
|
return render(request, 'monstage/detail.html', {'question': question})
|
Loading…
Reference in a new issue