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 %}
{% csrf_token %} {{ form.as_p }} - +
{% 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 %}
+ {% csrf_token %} +

Voulez vous vraiment supprimer l'événement {{ object }}?

+ +
+{% 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/propositions/voteok.html b/templates/propositions/voteok.html new file mode 100644 index 0000000..4512974 --- /dev/null +++ b/templates/propositions/voteok.html @@ -0,0 +1,5 @@ +{% extends "base.html" %} +{% block titre %}Vote pris en compte{% endblock %} +{% block content %}

Votre vote a été pris en compte

+

Voir la liste des propositions

{% endblock %} +
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" }} ?
+ +
+ {% csrf_token %} + {{ form.as_p }} + +
+{% 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.profile.is_chef %}

Modifier l'événement

+

Supprimer l'événement

+{% endif %} +{% if user.is_authenticated %} +

Répondre à l'événement

{% endif %}

{{ nom }}

{{ev.date}}

@@ -17,5 +22,30 @@ {% if desc %}

{{ev.description }}

{% endif %} - +
+{% if user.is_authenticated %} +
+

Participants

+

{{ nboui }} ont répondu oui, {{ nbpe }} peut-être, et {{ nbnon }} non

+ +{% if part %} + + + +{% endif %} +{% for p in part %} + + +{% if p.reponse == "oui" %} +{% elif p.reponse == "pe" %} +{% elif p.reponse == "non" %} +{% else %} +{% endif %} + +{% empty %} +Pas de réponse pour l'instant +{% endfor %} +
ErnestophonisteRéponse
{{ p.participant.user.username }}
+
+{% 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 %} - +
+ L'Ernestophone +
+ + {% endblock %}
+
{% block content %} {% endblock %} +
+
diff --git a/templates/gestion/divers.html b/templates/gestion/divers.html new file mode 100644 index 0000000..16e41cd --- /dev/null +++ b/templates/gestion/divers.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} +{% block titre %}Divers{% endblock %} +{% block content %} +

Divers

+ +{% endblock %} diff --git a/templates/gestion/login.html b/templates/gestion/login.html index fc11148..e6ce0b5 100644 --- a/templates/gestion/login.html +++ b/templates/gestion/login.html @@ -2,6 +2,7 @@ {% block titre %}Connexion{% endblock %} {% block content %}

Connexion

+
{% if form.errors %}

Mot de passe ou nom d'utilisateur incorrect

{% endif %} @@ -12,16 +13,18 @@ {% csrf_token %} - + - +
{{ form.username }}
{{ form.password }}
+ {% if next %} {% else %} {% endif %} +
{% endblock %} diff --git a/templates/partitions/liste.html b/templates/partitions/liste.html index 6d94bc0..c5ee2cd 100644 --- a/templates/partitions/liste.html +++ b/templates/partitions/liste.html @@ -4,16 +4,22 @@ {% if suppression %}

{{ suppression }}

{% endif %} +{% if user.is_authenticated %}

Ajouter un morceau

+{% endif %} + {% endblock %} diff --git a/templates/partitions/listepart.html b/templates/partitions/listepart.html index b2bfa43..c1f0823 100644 --- a/templates/partitions/listepart.html +++ b/templates/partitions/listepart.html @@ -6,19 +6,22 @@ {% if suppression %}

{{ suppression }}

{% endif %} +
    {% for p in part %} {% if user.is_authenticated and ".pdf" in p.part.url %} -

    {{ p.nom }} +

  • {{ p.nom }} {% elif user.is_authenticated and ".mp3" in p.part.url %} -

    {{ p.nom }} -{% else %}

    {{ p.nom }} +

  • {{ p.nom }} +{% else %}
  • {{ p.nom }} {% endif %} -{% if user.is_authenticated %}Télécharger{% endif %}

    +{% if user.is_authenticated %}Télécharger{% endif %} {% if user.profile.is_chef %} -

    Supprimer

    +Supprimer {% endif %} +
  • {% empty %}

    Pas de partitions pour le moment

    {% endfor %} +

Ajouter un média

{% endblock %} diff --git a/templates/propositions/create.html b/templates/propositions/create.html new file mode 100644 index 0000000..bef2072 --- /dev/null +++ b/templates/propositions/create.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} + +{%block titre %}Proposition de morceau{% endblock %} + +{% block content %} +

Retour aux propositions

+{% if envoi %}

Votre proposition a été enregistrée.{% endif %} +

+ {% csrf_token %} + {{ form.as_p }} + +
+{% endblock %} diff --git a/templates/propositions/delete.html b/templates/propositions/delete.html new file mode 100644 index 0000000..1dfe550 --- /dev/null +++ b/templates/propositions/delete.html @@ -0,0 +1,10 @@ +{% extends "base.html" %} + +{% block titre %}Suppression d'une proposition{% endblock %} +{% block content %}
+ {% csrf_token %} +

Retour aux propositions

+

Voulez vous vraiment supprimer la proposition {{ object }}?

+ +
+{% endblock %} diff --git a/templates/propositions/liste.html b/templates/propositions/liste.html new file mode 100644 index 0000000..22963de --- /dev/null +++ b/templates/propositions/liste.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} +{% load getresponse %} +{% block titre %}Propositions de morceau{% endblock %} +{% block content %}

Liste des propositions

+{% if error %} +

{{ error }}

+{% endif %} +

Proposer un morceau

+{% if n > 0 %} + + +{% for p in props %} + + +{% getresponse request.user.profile p %} + +{% endfor %} +
OuiNon
{% if p.lien %}{% endif %}{{ p.nom }}{% if p.artiste %} - {{ p.artiste }}{% endif %}{% if p.lien %}{% endif %}{{p.nboui }}{{ p.nbnon }}OuiNon{% if p.user == request.user.profile or request.user.profile.is_chef %}Supprimer{% endif %}
+{% else %} +Pas de proposition pour le moment +{% endif %} +{% endblock %} diff --git a/templates/propositions/reponse.html b/templates/propositions/reponse.html new file mode 100644 index 0000000..e5ee7f3 --- /dev/null +++ b/templates/propositions/reponse.html @@ -0,0 +1 @@ +
{% if reponse %}Vous avez voté {{ reponse }}{%endif%}