diff --git a/Ernestophone/__pycache__/settings.cpython-34.pyc b/Ernestophone/__pycache__/settings.cpython-34.pyc
index 4d0b30b..2ceeb75 100644
Binary files a/Ernestophone/__pycache__/settings.cpython-34.pyc and b/Ernestophone/__pycache__/settings.cpython-34.pyc differ
diff --git a/Ernestophone/__pycache__/urls.cpython-34.pyc b/Ernestophone/__pycache__/urls.cpython-34.pyc
index e2d42ae..2633fdf 100644
Binary files a/Ernestophone/__pycache__/urls.cpython-34.pyc and b/Ernestophone/__pycache__/urls.cpython-34.pyc differ
diff --git a/Ernestophone/settings.py b/Ernestophone/settings.py
index 5ea6bff..c86685d 100644
--- a/Ernestophone/settings.py
+++ b/Ernestophone/settings.py
@@ -40,6 +40,7 @@ INSTALLED_APPS = (
'gestion',
'partitions',
'calendrier',
+ 'propositions',
)
MIDDLEWARE_CLASSES = (
diff --git a/Ernestophone/urls.py b/Ernestophone/urls.py
index 5966e7f..2b6b4ba 100644
--- a/Ernestophone/urls.py
+++ b/Ernestophone/urls.py
@@ -14,6 +14,8 @@ urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^partitions/', include('partitions.urls')),
url(r'^calendar/', include('calendrier.urls')),
+ url(r'^propositions/', include('propositions.urls')),
+ url(r'^divers/', 'gestion.views.divers'),
)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
diff --git a/calendrier/__pycache__/forms.cpython-34.pyc b/calendrier/__pycache__/forms.cpython-34.pyc
index 0b2dd81..cf38687 100644
Binary files a/calendrier/__pycache__/forms.cpython-34.pyc and b/calendrier/__pycache__/forms.cpython-34.pyc differ
diff --git a/calendrier/__pycache__/models.cpython-34.pyc b/calendrier/__pycache__/models.cpython-34.pyc
index 33b25eb..dfecff1 100644
Binary files a/calendrier/__pycache__/models.cpython-34.pyc and b/calendrier/__pycache__/models.cpython-34.pyc differ
diff --git a/calendrier/__pycache__/urls.cpython-34.pyc b/calendrier/__pycache__/urls.cpython-34.pyc
index e9573fb..f039f5c 100644
Binary files a/calendrier/__pycache__/urls.cpython-34.pyc and b/calendrier/__pycache__/urls.cpython-34.pyc differ
diff --git a/calendrier/__pycache__/views.cpython-34.pyc b/calendrier/__pycache__/views.cpython-34.pyc
index 5ae82eb..f5bc7f5 100644
Binary files a/calendrier/__pycache__/views.cpython-34.pyc and b/calendrier/__pycache__/views.cpython-34.pyc differ
diff --git a/calendrier/calend.py b/calendrier/calend.py
index 08af175..a061a4f 100644
--- a/calendrier/calend.py
+++ b/calendrier/calend.py
@@ -19,7 +19,7 @@ class EventCalendar(HTMLCalendar):
cssclass += ' filled'
body = []
for ev in self.events[day]:
- body.append('' % ev.id)
+ body.append(' ' % ev.id)
body.append(esc(ev.nom))
body.append(' ')
return self.day_cell(cssclass, '
%d
%s' % (day, ''.join(body)))
diff --git a/calendrier/forms.py b/calendrier/forms.py
index 4060bb1..a9ff200 100644
--- a/calendrier/forms.py
+++ b/calendrier/forms.py
@@ -1,7 +1,9 @@
from django import forms
-from calendrier.models import Event
+from calendrier.models import Event, Participants
class EventForm(forms.ModelForm):
+ sendmail = forms.BooleanField(initial=False, label="Envoyer l'invitation à la liste fanfare")
+ message = forms.CharField(max_length=2000, widget=forms.Textarea(attrs={"placeholder":"Remplir ici pour remplacer le mail automatique"}), required=False)
class Meta:
model = Event
widgets = {
@@ -10,4 +12,8 @@ class EventForm(forms.ModelForm):
'debut': forms.TextInput(attrs={"placeholder": 'hh:mm'}),
'fin': forms.TextInput(attrs={"placeholder": 'hh:mm facultatif'})
}
-
+
+class ParticipantsForm(forms.ModelForm):
+ class Meta:
+ model = Participants
+ fields = ('reponse', )
diff --git a/calendrier/models.py b/calendrier/models.py
index 0f9c730..24ebcce 100644
--- a/calendrier/models.py
+++ b/calendrier/models.py
@@ -1,14 +1,31 @@
from django.db import models
+from gestion.models import ErnestoUser
+
+ANSWERS = (
+ ('oui', 'Oui'),
+ ('non', 'Non'),
+ ('pe', 'Peut-être'),
+ )
class Event(models.Model):
nom = models.CharField(max_length=100)
date = models.DateField()
debut = models.TimeField()
fin = models.TimeField(blank=True, null=True)
+ slug = models.CharField(max_length=7, editable=False, unique=True)
lieu = models.CharField(max_length=200)
description = models.TextField(blank=True)
calendrier = models.BooleanField(default=False, verbose_name="Afficher dans le calendrier")
def __str__(self):
return self.nom
+
+ class Meta:
+ verbose_name = "Événement"
+
+class Participants(models.Model):
+ event = models.ForeignKey(Event)
+ participant = models.ForeignKey(ErnestoUser)
+ reponse = models.CharField("Réponse", max_length = 20, default = "non", choices = ANSWERS)
+
# Create your models here.
diff --git a/calendrier/urls.py b/calendrier/urls.py
index 7f74d90..c318270 100644
--- a/calendrier/urls.py
+++ b/calendrier/urls.py
@@ -1,10 +1,15 @@
from django.conf.urls import patterns, url
-from calendrier.views import EventUpdate
+from calendrier.views import EventUpdate, EventDelete
urlpatterns = patterns('calendrier.views',
url(r'^new$', 'create_event'),
url(r'^$', 'home'),
url(r'^edition/(?P\d+)$', EventUpdate.as_view()),
+ url(r'^supprimer/(?P\d+)$', EventDelete.as_view()),
+ url(r'(?P\d+)/reponse/?', 'reponse'),
+ url(r'(?P\w{6})/(?P\w{6})/oui', 'repouidir'),
+ url(r'(?P\w{6})/(?P\w{6})/pe', 'reppedir'),
+ url(r'(?P\w{6})/(?P\w{6})/non', 'repnondir'),
url(r'(?P\d+)/(?P\d+)/(?P\d+)/?', 'view_event'),
url(r'(?P\d+)/(?P\d+)/?$', 'calendar'),
url(r'(?P\d+)/?', 'view_eventbis'),
diff --git a/calendrier/views.py b/calendrier/views.py
index a567515..5a5f80c 100644
--- a/calendrier/views.py
+++ b/calendrier/views.py
@@ -1,15 +1,24 @@
from django.shortcuts import render
-from calendrier.forms import EventForm
-from calendrier.models import Event
+from calendrier.forms import EventForm, ParticipantsForm
+from calendrier.models import Event, Participants
from django.utils.safestring import mark_safe
-from django.views.generic import UpdateView
+from django.views.generic import UpdateView, DeleteView
from django.core.urlresolvers import reverse_lazy
from partitions.decorators import chef_required
+from django.contrib.auth.decorators import login_required
+from gestion.models import ErnestoUser
+from django.utils.decorators import method_decorator
+
+import smtplib
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
from calendrier.calend import EventCalendar
from calendar import monthrange
from datetime import *
+from propositions.utils import generer
+
def named_month(pMonthNumber):
return date(1900, pMonthNumber, 1).strftime('%B')
@@ -57,6 +66,10 @@ def view_event(request, pYear, pMonth, id):
nom = ev.nom.capitalize
fin = False
desc = False
+ part = ev.participants_set.all()
+ nboui = len(part.filter(reponse="oui"))
+ nbpe = len(part.filter(reponse="pe"))
+ nbnon = len(part.filter(reponse="non"))
if ev.fin:
fin = True
if ev.description:
@@ -65,9 +78,13 @@ def view_event(request, pYear, pMonth, id):
def view_eventbis(request, id):
ev = Event.objects.get(id=id)
+ part = ev.participants_set.all()
nom = ev.nom.capitalize
fin = False
desc = False
+ nboui = len(part.filter(reponse="oui"))
+ nbpe = len(part.filter(reponse="pe"))
+ nbnon = len(part.filter(reponse="non"))
if ev.fin:
fin = True
if ev.description:
@@ -79,20 +96,134 @@ def create_event(request):
if request.method == "POST":
form = EventForm(request.POST)
if form.is_valid():
-
- form.save()
+ temp = True
+ while temp:
+ code = generer()
+ try:
+ Event.objects.get(slug=code)
+ except:
+ temp=False
+ sendmail = form.cleaned_data["sendmail"]
+ nom = form.cleaned_data["nom"]
+ date = form.cleaned_data["date"]
+ date = date.strftime('%d/%m/%Y')
+ debut = form.cleaned_data["debut"]
+ message = form.cleaned_data["message"]
+ obj = form.save(commit=False)
+ id= obj.id
+ obj.slug = code
+ obj.save()
envoi = True
-
+ if sendmail:
+ try:
+ smtpObj = smtplib.SMTP('clipper.ens.fr', 25)
+ sender = 'fanfare@ens.fr'
+ receivers = 'aymeric.fromherz@ens.fr'
+ msg = MIMEMultipart("alternative")
+ msg["Subject"] = nom + ", le " + date
+ msg["From"] = sender
+ msg["To"] = receivers
+ text = "Bonjour, un évémenent a été créé."
+ if message != '':
+ text = message
+ text+= '\nPour répondre, allez sur www.ernestophone.ens.fr/calendar/' + id + '/reponse'
+ text = MIMEText(text, 'plain')
+ msg.attach(text)
+ smtpObj.sendmail(sender, receivers, msg.as_string())
+ except:
+ erreur = "Une erreur est survenue, le mail n'a pas pu être envoyé."
else:
form = EventForm()
return render(request, "calendrier/create.html", locals())
+@login_required
+def reponse(request, id):
+ part = request.user.profile
+ ev = Event.objects.get(id=id)
+ if request.method == "POST":
+ form = ParticipantsForm(request.POST)
+ if form.is_valid():
+ try:
+ p = Participants.objects.get(event=ev, participant=part)
+ p.delete()
+ except Participants.DoesNotExist:
+ pass
+ obj = form.save(commit=False)
+ obj.event = ev
+ obj.participant = part
+ obj.save()
+ envoi = True
+ else:
+ form = ParticipantsForm()
+ return render(request, "calendrier/reponse.html", locals())
+
+def repouidir(request, codeus, codeev):
+ part = ErnestoUser.objects.get(slug=codeus)
+ ev = Event.objects.get(slug=codeev)
+ try:
+ p = Participants.objects.get(event=ev, participant=part)
+ p.delete()
+ except Participants.DoesNotExist:
+ pass
+ obj = Participants()
+ obj.participant = part
+ obj.event = ev
+ obj.reponse="oui"
+ obj.save()
+ envoi = True
+ return render(request,"calendrier/home.html", locals())
+
+
+def reppedir(request, codeus, codeev):
+ part = ErnestoUser.objects.get(slug=codeus)
+ ev = Event.objects.get(slug=codeev)
+ try:
+ p = Participants.objects.get(event=ev, participant=part)
+ p.delete()
+ except Participants.DoesNotExist:
+ pass
+ obj = Participants()
+ obj.participant = part
+ obj.event = ev
+ obj.reponse="pe"
+ obj.save()
+ envoi = True
+ return render(request,"calendrier/home.html", locals())
+
+def repnondir(request, codeus, codeev):
+ part = ErnestoUser.objects.get(slug=codeus)
+ ev = Event.objects.get(slug=codeev)
+ try:
+ p = Participants.objects.get(event=ev, participant=part)
+ p.delete()
+ except Participants.DoesNotExist:
+ pass
+ obj = Participants()
+ obj.participant = part
+ obj.event = ev
+ obj.reponse="non"
+ obj.save()
+ envoi = True
+ return render(request,"calendrier/home.html", locals())
+
class EventUpdate(UpdateView):
model = Event
template_name = "calendrier/update.html"
form_class = EventForm
success_url = reverse_lazy(home)
-
+ @method_decorator(chef_required)
+ def dispatch(self, *args, **kwargs):
+ return super(EventUpdate, self).dispatch(*args, **kwargs)
+
+class EventDelete(DeleteView):
+ model = Event
+ template_name = "calendrier/delete.html"
+ success_url = reverse_lazy(home)
+
+ @method_decorator(chef_required)
+ def dispatch(self, *args, **kwargs):
+ return super(EventDelete, self).dispatch(*args, **kwargs)
+
# Create your views here.
diff --git a/db.sqlite3 b/db.sqlite3
index dcbfef0..d4695ab 100644
Binary files a/db.sqlite3 and b/db.sqlite3 differ
diff --git a/gestion/__pycache__/admin.cpython-34.pyc b/gestion/__pycache__/admin.cpython-34.pyc
index 572a33b..177ee13 100644
Binary files a/gestion/__pycache__/admin.cpython-34.pyc and b/gestion/__pycache__/admin.cpython-34.pyc differ
diff --git a/gestion/__pycache__/models.cpython-34.pyc b/gestion/__pycache__/models.cpython-34.pyc
index 9cb23d1..2a7ec6e 100644
Binary files a/gestion/__pycache__/models.cpython-34.pyc and b/gestion/__pycache__/models.cpython-34.pyc differ
diff --git a/gestion/__pycache__/views.cpython-34.pyc b/gestion/__pycache__/views.cpython-34.pyc
index b77b9fe..d411948 100644
Binary files a/gestion/__pycache__/views.cpython-34.pyc and b/gestion/__pycache__/views.cpython-34.pyc differ
diff --git a/gestion/admin.py b/gestion/admin.py
index 0ae28dc..ecb6c8c 100644
--- a/gestion/admin.py
+++ b/gestion/admin.py
@@ -3,6 +3,7 @@ from django.contrib.auth.models import User, Group
from gestion.models import ErnestoUser
from django.contrib.auth.admin import UserAdmin
from calendrier.models import Event
+from propositions.models import Prop
class UserProfileInline(admin.StackedInline):
model = ErnestoUser
@@ -38,4 +39,5 @@ admin.site.unregister(User)
admin.site.unregister(Group)
admin.site.register(User, UserProfileAdmin)
admin.site.register(Event)
+admin.site.register(Prop)
# Register your models here.
diff --git a/gestion/models.py b/gestion/models.py
index b310427..79722f6 100644
--- a/gestion/models.py
+++ b/gestion/models.py
@@ -9,12 +9,15 @@ class ErnestoUser(models.Model):
is_chef = models.BooleanField("Chef Fanfare", default=False)
phone = models.CharField("Téléphone", max_length=20, blank=True)
instru = models.CharField("Instrument joué", max_length=40, blank=True)
+ slug = models.CharField(max_length=7, editable=False, unique=True)
class Meta:
verbose_name = "Profil Ernestophoniste"
- verbose_name_plural = "Profils Ernestophonistes"
+ verbose_name_plural = "Profil Ernestophoniste"
def __unicode__(self):
return unicode(self.user.username)
+ def __str__(self):
+ return self.user.username
# Create your models here.
diff --git a/gestion/views.py b/gestion/views.py
index 0b51963..3cc2561 100644
--- a/gestion/views.py
+++ b/gestion/views.py
@@ -11,6 +11,7 @@ import smtplib
from gestion.forms import InscriptionMembreForm, RegistrationFormUser
from gestion.models import ErnestoUser
+from propositions.utils import generer
from calendrier.views import calendar
@@ -24,11 +25,20 @@ def inscription_membre(request):
if not (comp_form.cleaned_data['validation'] == "Pouet-ta-mere"):
error = "Le champ Validation ne correspond pas à celui attendu"
return render(request, "gestion/registration.html", locals())
- member = user_form.save()
+ member = user_form.save(commit=False)
+ temp = True
+ while temp:
+ code = generer()
+ try:
+ ErnestoUser.objects.get(slug=code)
+ except:
+ temp=False
member.save()
(profile, _) = ErnestoUser.objects.get_or_create(user = member)
comp_form = InscriptionMembreForm(requbis, instance = profile)
- comp_form.save()
+ obj = comp_form.save(commit=False)
+ obj.slug=code
+ obj.save()
envoi = True
return render(request, 'gestion/thanks.html', locals())
else:
@@ -53,6 +63,7 @@ def login(request):
pass
return django_login_view(request, template_name = 'login.html', )
-
+def divers(request):
+ return render(request, "gestion/divers.html", locals())
# Create your views here.
diff --git a/propositions/__init__.py b/propositions/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/propositions/__pycache__/__init__.cpython-34.pyc b/propositions/__pycache__/__init__.cpython-34.pyc
new file mode 100644
index 0000000..50165c4
Binary files /dev/null and b/propositions/__pycache__/__init__.cpython-34.pyc differ
diff --git a/propositions/__pycache__/admin.cpython-34.pyc b/propositions/__pycache__/admin.cpython-34.pyc
new file mode 100644
index 0000000..f1c6aa7
Binary files /dev/null and b/propositions/__pycache__/admin.cpython-34.pyc differ
diff --git a/propositions/__pycache__/forms.cpython-34.pyc b/propositions/__pycache__/forms.cpython-34.pyc
new file mode 100644
index 0000000..8e477b1
Binary files /dev/null and b/propositions/__pycache__/forms.cpython-34.pyc differ
diff --git a/propositions/__pycache__/models.cpython-34.pyc b/propositions/__pycache__/models.cpython-34.pyc
new file mode 100644
index 0000000..0c60811
Binary files /dev/null and b/propositions/__pycache__/models.cpython-34.pyc differ
diff --git a/propositions/__pycache__/urls.cpython-34.pyc b/propositions/__pycache__/urls.cpython-34.pyc
new file mode 100644
index 0000000..39044ec
Binary files /dev/null and b/propositions/__pycache__/urls.cpython-34.pyc differ
diff --git a/propositions/__pycache__/utils.cpython-34.pyc b/propositions/__pycache__/utils.cpython-34.pyc
new file mode 100644
index 0000000..c9f9852
Binary files /dev/null and b/propositions/__pycache__/utils.cpython-34.pyc differ
diff --git a/propositions/__pycache__/views.cpython-34.pyc b/propositions/__pycache__/views.cpython-34.pyc
new file mode 100644
index 0000000..3163ba5
Binary files /dev/null and b/propositions/__pycache__/views.cpython-34.pyc differ
diff --git a/propositions/admin.py b/propositions/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/propositions/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/propositions/forms.py b/propositions/forms.py
new file mode 100644
index 0000000..1d6ef95
--- /dev/null
+++ b/propositions/forms.py
@@ -0,0 +1,12 @@
+from django import forms
+from propositions.models import Prop
+
+class PropForm(forms.ModelForm):
+ class Meta:
+ model = Prop
+ fields = ('nom', 'artiste', 'lien')
+ widgets = {
+ 'lien': forms.TextInput(attrs={"placeholder": "facultatif"}),
+ 'nom': forms.TextInput(attrs={"placeholder": "Nom du morceau"}),
+ 'artiste': forms.TextInput(attrs={"placeholder": "facultatif"}),
+ }
diff --git a/propositions/models.py b/propositions/models.py
new file mode 100644
index 0000000..fedc48e
--- /dev/null
+++ b/propositions/models.py
@@ -0,0 +1,29 @@
+from django.db import models
+from gestion.models import ErnestoUser
+
+REP = (
+ ('oui', 'Oui'),
+ ('non', 'Non'),
+ )
+
+class Prop(models.Model):
+ nom = models.CharField(max_length=100)
+ artiste = models.CharField(blank=True, max_length=100)
+ user = models.ForeignKey(ErnestoUser, verbose_name="Proposé par")
+ lien = models.URLField(blank=True)
+ nboui = models.IntegerField(default=0, verbose_name="oui")
+ nbnon = models.IntegerField(default=0, verbose_name="non")
+
+ def __str__(self):
+ return self.nom
+
+ class Meta:
+ verbose_name="Proposition"
+
+class Reponses(models.Model):
+ prop = models.ForeignKey(Prop)
+ part = models.ForeignKey(ErnestoUser)
+ reponse = models.CharField("Réponse", max_length=20, blank=True, choices=REP)
+
+# Create your models here.
+
diff --git a/propositions/templatetags/__pycache__/getresponse.cpython-34.pyc b/propositions/templatetags/__pycache__/getresponse.cpython-34.pyc
new file mode 100644
index 0000000..366b7f5
Binary files /dev/null and b/propositions/templatetags/__pycache__/getresponse.cpython-34.pyc differ
diff --git a/propositions/templatetags/getresponse.py b/propositions/templatetags/getresponse.py
new file mode 100644
index 0000000..83378c3
--- /dev/null
+++ b/propositions/templatetags/getresponse.py
@@ -0,0 +1,12 @@
+from django import template
+from propositions.models import Reponses
+
+register = template.Library()
+
+@register.inclusion_tag("propositions/reponse.html")
+def getresponse(user, prop):
+ try:
+ rep = Reponses.objects.get(prop=prop, part=user)
+ return {"reponse": rep.reponse}
+ except Reponses.DoesNotExist:
+ return {}
diff --git a/propositions/tests.py b/propositions/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/propositions/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/propositions/urls.py b/propositions/urls.py
new file mode 100644
index 0000000..85282de
--- /dev/null
+++ b/propositions/urls.py
@@ -0,0 +1,10 @@
+from django.conf.urls import patterns, url
+from propositions.views import PropDelete
+
+urlpatterns = patterns('propositions.views',
+ url(r'^$', 'liste'),
+ url(r'^new/?$', 'create_prop'),
+ url(r'^(?P\d+)/oui/?$', 'repoui'),
+ url(r'^(?P\d+)/non/?$', 'repnon'),
+ url(r'^(?P\d+)/supprimer/?$', PropDelete.as_view()),
+ )
diff --git a/propositions/utils.py b/propositions/utils.py
new file mode 100644
index 0000000..c4d5797
--- /dev/null
+++ b/propositions/utils.py
@@ -0,0 +1,7 @@
+import string
+import random
+
+def generer(*args):
+ caracteres = string.ascii_letters + string.digits
+ aleatoire = [random.choice(caracteres) for _ in range(6)]
+ return ''.join(aleatoire)
diff --git a/propositions/views.py b/propositions/views.py
new file mode 100644
index 0000000..198afae
--- /dev/null
+++ b/propositions/views.py
@@ -0,0 +1,101 @@
+from django.shortcuts import render, redirect
+from django.core.urlresolvers import reverse_lazy
+from django.contrib.auth.decorators import login_required
+from django.views.generic import DeleteView
+from django.utils.decorators import method_decorator
+from django.http import HttpResponseRedirect
+
+import string
+import random
+
+from propositions.forms import PropForm
+from propositions.models import Prop
+from propositions.models import Reponses
+from propositions.utils import generer
+from gestion.models import ErnestoUser
+
+@login_required
+def create_prop(request):
+ if request.method == "POST":
+ form = PropForm(request.POST)
+ if form.is_valid():
+ obj = form.save(commit=False)
+ obj.nboui = 0
+ obj.nbnon = 0
+ obj.user = request.user.profile
+ obj.save()
+ envoi = True
+ else:
+ form = PropForm()
+ return render(request, "propositions/create.html", locals())
+
+@login_required
+def liste(request):
+ props = Prop.objects.all().order_by('-nboui', 'nbnon', 'nom')
+ n = len(props)
+ return render(request, 'propositions/liste.html', locals())
+
+
+@login_required
+def repoui(request, id):
+ prop = Prop.objects.get(id=id)
+ participant = request.user.profile
+ try:
+ p = Reponses.objects.get(prop=prop, part=participant)
+ if p.reponse == "oui":
+ prop.nboui -= 1
+ else:
+ prop.nbnon-=1
+ p.delete()
+ except Reponses.DoesNotExist:
+ pass
+ rep = Reponses()
+ rep.prop = prop
+ rep.part = participant
+ rep.reponse = "oui"
+ rep.save()
+ prop.nboui += 1
+ prop.save()
+ return redirect('propositions.views.liste')
+
+class PropDelete(DeleteView):
+ model = Prop
+ template_name= "propositions/delete.html"
+ success_url = reverse_lazy(liste)
+
+ @method_decorator(login_required)
+ def dispatch(self, *args, **kwargs):
+ return super(PropDelete, self).dispatch(*args, **kwargs)
+
+ def delete(self, request, *args, **kwargs):
+ self.object = self.get_object()
+ success_url = self.get_success_url()
+ if not ((self.object.user == self.request.user.profile) or self.request.user.profile.is_chef):
+ return redirect('propositions.views.liste')
+ else:
+ self.object.delete()
+ return HttpResponseRedirect(success_url)
+
+@login_required
+def repnon(request, id):
+ prop = Prop.objects.get(id=id)
+ participant = request.user.profile
+ try:
+ p = Reponses.objects.get(prop=prop, part=participant)
+ if p.reponse == "oui":
+ prop.nboui -= 1
+ else:
+ prop.nbnon -= 1
+ p.delete()
+ except Reponses.DoesNotExist:
+ pass
+ rep = Reponses()
+ rep.prop = prop
+ rep.part = participant
+ rep.reponse = "non"
+ rep.save()
+ prop.nbnon += 1
+ prop.save()
+ return redirect('propositions.views.liste')
+
+# Create your views here.
diff --git a/static/Favicon.ico b/static/Favicon.ico
new file mode 100644
index 0000000..923da54
Binary files /dev/null and b/static/Favicon.ico differ
diff --git a/static/FondErnesto.gif b/static/FondErnesto.gif
new file mode 100644
index 0000000..b32a2bf
Binary files /dev/null and b/static/FondErnesto.gif differ
diff --git a/static/css/ernesto.css b/static/css/ernesto.css
new file mode 100644
index 0000000..1839f50
--- /dev/null
+++ b/static/css/ernesto.css
@@ -0,0 +1,149 @@
+@import url("http://fonts.googleapis.com/css?family=Lobster");
+
+html, body {
+ height: 100%;
+}
+
+h1 {
+ font: 36px Lobster;
+ margin-bottom: 0.8em;
+ text-align: center;
+}
+
+a {
+ color: #e4522f;
+ font-weight: bold;
+}
+
+body {
+ background: none repeat scroll 0% 0% #45312D;
+}
+
+th {
+ padding-right: 10px;
+}
+
+
+td {
+ padding-right: 10px;
+}
+
+td.oui {
+ background-color: #409526;
+}
+
+td.pe {
+ background-color: #E68200;
+}
+
+td.non {
+ background-color: #C30909;
+}
+
+#page {
+ background: none repeat scroll 0% 0% #ffffff;
+ min-height: 100%;
+ margin: 0px auto;
+ max-width: 800px;
+}
+
+#page section {
+ padding: 20px;
+}
+
+header {
+ background: none repeat scroll 0% 0% #e4522f;
+ overflow: hidden;
+}
+
+#menu {
+ list-style-type: none;
+ max-width: 85%;
+ padding: 0px;
+ text-align: right;
+ margin-bottom:0;
+}
+
+#menu li {
+ display: inline-block;
+ font-size: 1.2em;
+ margin: 0px;
+ padding: 0px;
+}
+
+#menu a {
+ color: #ffffff;
+ font-weight: bold;
+}
+
+#menu li > * {
+ display: inline-block;
+ padding: 30px 10px;
+}
+
+#menu a:hover {
+ background: none repeat scroll 0% 0% #ffffff;
+ color: #e4522f;
+ text-decoration: none;
+}
+
+#logo_ernesto {
+ float: left;
+ width: 15%;
+}
+
+#logo_ernesto img {
+ width: 100%;
+}
+
+#menu {
+ float: right;
+}
+
+label {
+ width: 230px;
+}
+
+textarea, input {
+ vertical-align: top;
+}
+
+form p {
+ border-top: 1px solid #f7e4e0;
+ padding-top: 5px;
+}
+
+.fichier, .telecharger, .supprimer {
+ display: inline-block;
+ margin: 3px;
+ padding: 2px 3px;
+}
+
+.telecharger:hover, .supprimer:hover {
+ color: #ffffff;
+ text-decoration: none;
+}
+
+.fichier {
+ color: #1d90d2;
+ display: inline-block;
+ min-width: 20%;
+}
+
+.supprimer {
+ border: 1px solid #cc0000;
+ color: #cc0000;
+}
+
+.supprimer:hover {
+ background: none repeat scroll 0% 0% #cc0000;
+}
+
+.telecharger:hover {
+ background: none repeat scroll 0% 0% #6cb828;
+}
+
+.telecharger {
+ border: 1px solid #6cb828;
+ color: #6cb828;
+}
diff --git a/static/css/main.css b/static/css/main.css
index 944df1d..4900553 100644
--- a/static/css/main.css
+++ b/static/css/main.css
@@ -20,3 +20,4 @@ header li
margin-right: 15px;
display: inline-block;
}
+
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..3271745
Binary files /dev/null and b/static/logo.png differ
diff --git a/templates/calendrier/create.html b/templates/calendrier/create.html
index e0b42bf..d9177fd 100644
--- a/templates/calendrier/create.html
+++ b/templates/calendrier/create.html
@@ -3,11 +3,14 @@
{% block titre%}Création d'Évènement{% endblock %}
{% block content %}
-{% if envoi %}Votre message a bien été envoyé !{% endif %}
-
+{% if envoi %}L'événement a bien été créé !{% endif %}
+
+{% if erreur %}
+{{ erreur }}
+{% endif %}
{% endblock %}
diff --git a/templates/calendrier/delete.html b/templates/calendrier/delete.html
new file mode 100644
index 0000000..0ab2aa9
--- /dev/null
+++ b/templates/calendrier/delete.html
@@ -0,0 +1,10 @@
+{% extends "base.html" %}
+
+{% block titre %}Suppression d'un événement{% endblock %}
+
+{% block content %}
+{% endblock %}
diff --git a/templates/calendrier/home.html b/templates/calendrier/home.html
index 147464c..842a308 100644
--- a/templates/calendrier/home.html
+++ b/templates/calendrier/home.html
@@ -11,6 +11,14 @@
{% block content %}
L'Ernestophone, la fanfare de l'École normale supérieure
+
+
+Fanfaron de passage, musicien intrigué, Ernestophoniste en quête de sensations fortes ou de partitions, ou tout simplement internaute égaré, l'Ernestophone te souhaite la bienvenue sur son son site !
+
+
+L'Ernestophone, c'est la fanfare de l'École normale supérieure, (re)créée en septembre 2011, pour le plus grand bonheur des petits. Et des grands.
+
+
diff --git a/templates/calendrier/reponse.html b/templates/calendrier/reponse.html
new file mode 100644
index 0000000..fc7a784
--- /dev/null
+++ b/templates/calendrier/reponse.html
@@ -0,0 +1,17 @@
+{% extends "base.html" %}
+
+{% block titre %}Participation à un événement{% endblock %}
+
+{% block content %}
+{% if envoi %}Votre réponse a été enregistrée !
{% endif %}
+
+
+Retour à l'événement
+ Voulez vous participer à l'événement {{ ev.nom }}, le {{ ev.date }} à {{ ev.debut|time:"H:i" }} ?
+
+
+{% endblock %}
diff --git a/templates/calendrier/view_event.html b/templates/calendrier/view_event.html
index 114e98e..afcae11 100644
--- a/templates/calendrier/view_event.html
+++ b/templates/calendrier/view_event.html
@@ -3,8 +3,13 @@
{% block titre %}{{ nom }}{% endblock %}
{% block content %}
+
+{% if user.is_authenticated %}
+
+
Participants
+
{{ nboui }} ont répondu oui, {{ nbpe }} peut-être, et {{ nbnon }} non
+
+{% if part %}
+Ernestophoniste
+Réponse
+
+{% endif %}
+{% for p in part %}
+
+{{ p.participant.user.username }}
+{% if p.reponse == "oui" %}
+{% elif p.reponse == "pe" %}
+{% elif p.reponse == "non" %}
+{% else %}
+{% endif %}
+
+{% empty %}
+Pas de réponse pour l'instant
+{% endfor %}
+
+
+{% endif %}
{% endblock %}
diff --git a/templates/gestion/base.html b/templates/gestion/base.html
index 30508f8..ce702f0 100644
--- a/templates/gestion/base.html
+++ b/templates/gestion/base.html
@@ -7,28 +7,38 @@
{% block titre %}{% endblock %}
-
+
{% block extrahead %}{% endblock %}
+
{% block header %}
-
+
+
+
+
+
+
+
{% endblock %}
+
{% block content %}
{% endblock %}
+
+