This commit is contained in:
R1kM 2015-07-22 16:08:59 -04:00
parent ed2fafe61a
commit 20a02d1013
57 changed files with 698 additions and 44 deletions

View file

@ -40,6 +40,7 @@ INSTALLED_APPS = (
'gestion',
'partitions',
'calendrier',
'propositions',
)
MIDDLEWARE_CLASSES = (

View file

@ -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)

View file

@ -19,7 +19,7 @@ class EventCalendar(HTMLCalendar):
cssclass += ' filled'
body = []
for ev in self.events[day]:
body.append('<a href="calendar/%s">' % ev.id)
body.append('<a href="/calendar/%s">' % ev.id)
body.append(esc(ev.nom))
body.append('</a><br/>')
return self.day_cell(cssclass, '<div class="dayNumber">%d</div> %s' % (day, ''.join(body)))

View file

@ -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 = {
@ -11,3 +13,7 @@ class EventForm(forms.ModelForm):
'fin': forms.TextInput(attrs={"placeholder": 'hh:mm facultatif'})
}
class ParticipantsForm(forms.ModelForm):
class Meta:
model = Participants
fields = ('reponse', )

View file

@ -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.

View file

@ -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<pk>\d+)$', EventUpdate.as_view()),
url(r'^supprimer/(?P<pk>\d+)$', EventDelete.as_view()),
url(r'(?P<id>\d+)/reponse/?', 'reponse'),
url(r'(?P<codeus>\w{6})/(?P<codeev>\w{6})/oui', 'repouidir'),
url(r'(?P<codeus>\w{6})/(?P<codeev>\w{6})/pe', 'reppedir'),
url(r'(?P<codeus>\w{6})/(?P<codeev>\w{6})/non', 'repnondir'),
url(r'(?P<pYear>\d+)/(?P<pMonth>\d+)/(?P<id>\d+)/?', 'view_event'),
url(r'(?P<pYear>\d+)/(?P<pMonth>\d+)/?$', 'calendar'),
url(r'(?P<id>\d+)/?', 'view_eventbis'),

View file

@ -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.

Binary file not shown.

View file

@ -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.

View file

@ -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.

View file

@ -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.

0
propositions/__init__.py Normal file
View file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
propositions/admin.py Normal file
View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

12
propositions/forms.py Normal file
View file

@ -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"}),
}

29
propositions/models.py Normal file
View file

@ -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.

View file

@ -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 {}

3
propositions/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
propositions/urls.py Normal file
View file

@ -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<id>\d+)/oui/?$', 'repoui'),
url(r'^(?P<id>\d+)/non/?$', 'repnon'),
url(r'^(?P<pk>\d+)/supprimer/?$', PropDelete.as_view()),
)

7
propositions/utils.py Normal file
View file

@ -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)

101
propositions/views.py Normal file
View file

@ -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.

BIN
static/Favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 766 B

BIN
static/FondErnesto.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

149
static/css/ernesto.css Normal file
View file

@ -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;
}

View file

@ -20,3 +20,4 @@ header li
margin-right: 15px;
display: inline-block;
}

BIN
static/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View file

@ -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 %}
<br>
{% if erreur %}
{{ erreur }}
{% endif %}
<form action="{% url 'calendrier.views.create_event' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
<input type="submit" value="Enregistrer" />
</form>
{% endblock %}

View file

@ -0,0 +1,10 @@
{% extends "base.html" %}
{% block titre %}Suppression d'un événement{% endblock %}
{% block content %}<form action="" method="post">
{% csrf_token %}
<p>Voulez vous vraiment supprimer l'événement {{ object }}?</p>
<input type="submit" value="Oui" />
</form>
{% endblock %}

View file

@ -11,6 +11,14 @@
{% block content %}
<h1>L'Ernestophone, la fanfare de l'École normale supérieure</h1>
<div id="description">
<p>
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 !
</p>
<p>
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.
</p>
</div>
<table width="100%">
<tr>
<td width="20%" align="left">

View file

@ -0,0 +1,17 @@
{% extends "base.html" %}
{% block titre %}Participation à un événement{% endblock %}
{% block content %}
{% if envoi %}<p>Votre réponse a été enregistrée !</p>{% endif %}
<p><a href="{% url 'calendrier.views.view_eventbis' id %}">Retour à l'événement</a></p>
<div> Voulez vous participer à l'événement {{ ev.nom }}, le {{ ev.date }} à {{ ev.debut|time:"H:i" }} ?</div>
<form action="{% url 'calendrier.views.reponse' id %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Valider" />
</form>
{% endblock %}

View file

@ -3,8 +3,13 @@
{% block titre %}{{ nom }}{% endblock %}
{% block content %}
<div id="viewevent">
{% if user.profile.is_chef %}
<p><a href="/calendar/edition/{{ev.id}}">Modifier l'événement</a></p>
<p><a href="/calendar/supprimer/{{ev.id}}">Supprimer l'événement</a></p>
{% endif %}
{% if user.is_authenticated %}
<p><a href="{% url 'calendrier.views.reponse' id %}">Répondre à l'événement</a></p>
{% endif %}
<p>{{ nom }}</p>
<p>{{ev.date}}</p>
@ -17,5 +22,30 @@
{% if desc %}
<p>{{ev.description }}</p>
{% endif %}
</div>
{% if user.is_authenticated %}
<div id="doodle">
<h4>Participants</h4>
<p><b>{{ nboui }}</b> ont répondu oui, <b>{{ nbpe }}</b> peut-être, et <b>{{ nbnon }}</b> non</p>
<table>
{% if part %}<tr>
<th>Ernestophoniste</th>
<th>Réponse</th>
</tr>
{% endif %}
{% for p in part %}
<tr>
<td>{{ p.participant.user.username }}</td>
{% if p.reponse == "oui" %}<td class="oui"></td>
{% elif p.reponse == "pe" %}<td class="pe"></td>
{% elif p.reponse == "non" %}<td class="non"></td>
{% else %}<td></td>
{% endif %}
</tr>
{% empty %}
Pas de réponse pour l'instant
{% endfor %}
</table>
</div>
{% endif %}
{% endblock %}

View file

@ -7,28 +7,38 @@
<meta charset="utf-8" />
<title>{% block titre %}{% endblock %}</title>
<link rel="stylesheet" href={% static 'css/bootstrap.css' %} />
<link rel="stylesheet" href={% static 'css/main.css' %} />
<link rel="stylesheet" href={% static 'css/ernesto.css' %} />
{% block extrahead %}{% endblock %}
</head>
<body>
<div id="page">
<header>
{% block header %}
<ul id="menu">
<li><a href = '/'>Accueil</a></li>
{% if user.is_authenticated %}
<li>Vous êtes connecté en tant que {{user.username }}</li>
<li><a href = '/logout/'>Déconnexion</a></li>
{% if user.profile.is_chef %}
<li><a href = '/admin/'>Administration</a></li>
{% endif %}
{% else %}
<li><a href='/login/'>Connexion</a></li>
<li><a href='/registration/'>Créer un compte</a></li>
{% endif %}
<li><a href="{% url "partitions.views.liste" %}">Partitions</a></li>
</ul>
<div id="logo_ernesto">
<a href='/'><img src="{%static "logo.png" %}" alt="L'Ernestophone" /></a>
</div>
<nav>
<ul id="menu">
<li><a href="{% url 'partitions.views.liste' %}">Partitions</a></li>
{% if user.is_authenticated %}
{% if user.profile.is_chef %}
<li><a href = '/admin/'>Administration</a></li>
{% endif %}
<li><a href='/divers/'>Divers</a></li>
<li>Connecté en tant que {{user.username }}</li>
<li><a href = '/logout/'>Déconnexion</a></li>
{% else %}
<li><a href='/login/'>Connexion</a></li>
<li><a href='/registration/'>Créer un compte</a></li>
{% endif %}
</ul>
</nav>
{% endblock %}</header>
<section id="content">
{% block content %}
{% endblock %}
</section>
</div>
</body>
</html>

View file

@ -0,0 +1,8 @@
{% extends "base.html" %}
{% block titre %}Divers{% endblock %}
{% block content %}
<h1>Divers</h1>
<ul>
<li><a href="{% url "propositions.views.liste" %}">Propositions de morceaux</a></li>
</ul>
{% endblock %}

View file

@ -2,6 +2,7 @@
{% block titre %}Connexion{% endblock %}
{% block content %}
<h1>Connexion</h1>
<div id="Connexion">
{% if form.errors %}
<p>Mot de passe ou nom d'utilisateur incorrect</p>
{% endif %}
@ -12,16 +13,18 @@
{% csrf_token %}
<table>
<tr>
<td>{{ form.username }}</td>
<td><input type="{{ form.username.type }}" name="login" placeholder="Login"/></td>
</tr>
<tr>
<td>{{ form.password }}</td>
<td><input type="password" name="{{ form.password.name }}" placeholder="Password"/></td>
</tr>
</table>
<input type="submit" value="Connexion" />
</form>
{% if next %}
<input type="hidden" name="next" value={{ next }} />
{% else %}
<input type="hidden" name="next" value="/" />
{% endif %}
</div>
{% endblock %}

View file

@ -4,16 +4,22 @@
{% if suppression %}
<p>{{ suppression }}</p>
{% endif %}
{% if user.is_authenticated %}
<h3><a href="{% url "partitions.views.ajouter_morceau" %}">Ajouter un morceau</a></h3>
{% endif %}
<ul class="filelist">
{% for part in partitions %}
<li>
{% if not user.is_authenticated %}
<p>{{ part.nom }} - {{ part.auteur }}</p>
{{ part.nom }} - {{ part.auteur }}
{% endif %}
{% if user.is_authenticated %}
<p><a href="{% url "partitions.views.listepart" part.nom part.auteur %}">{{ part.nom }} - {{ part.auteur }}</a></p>
<a href="{% url "partitions.views.listepart" part.nom part.auteur %}" class="fichier">{{ part.nom }} - {{ part.auteur }}</a>
{% endif %}
{% if user.profile.is_chef %}
<p><a href="{% url "partitions.views.conf_delete_morc" part.nom part.auteur %}">Supprimer</a></p>
<a href="{% url "partitions.views.conf_delete_morc" part.nom part.auteur %}" class="supprimer">Supprimer</a>
{% endif %}
</li>
{% endfor %}
</ul>
{% endblock %}

View file

@ -6,19 +6,22 @@
{% if suppression %}
<p>{{ suppression }}</p>
{% endif %}
<ul class="filelist">
{% for p in part %}
{% if user.is_authenticated and ".pdf" in p.part.url %}
<p><a href="{% url "partitions.views.see" nom auteur p.part.url|cuturl %}">{{ p.nom }}</a>
<li><a href="{% url "partitions.views.see" nom auteur p.part.url|cuturl %}" class="fichier">{{ p.nom }}</a>
{% elif user.is_authenticated and ".mp3" in p.part.url %}
<p><a href="{% url "partitions.views.see" nom auteur p.part.url|cuturl %}">{{ p.nom }}</a>
{% else %}<p>{{ p.nom }}
<li><a href="{% url "partitions.views.see" nom auteur p.part.url|cuturl %}" class="fichier">{{ p.nom }}</a>
{% else %}<li>{{ p.nom }}
{% endif %}
{% if user.is_authenticated %}<a href="{% url "partitions.views.download" nom auteur p.part.url|cuturl %}">Télécharger</a>{% endif %} </p>
{% if user.is_authenticated %}<a href="{% url "partitions.views.download" nom auteur p.part.url|cuturl %}" class="telecharger">Télécharger</a>{% endif %}
{% if user.profile.is_chef %}
<p><a href="{% url "partitions.views.conf_delete" nom auteur p.pk %}">Supprimer</a> </p>
<a href="{% url "partitions.views.conf_delete" nom auteur p.pk %}" class="supprimer">Supprimer</a>
{% endif %}
</li>
{% empty %}
<p> Pas de partitions pour le moment </p>
{% endfor %}
</ul>
<p><a href="{% url "partitions.views.upload" p.nom p.auteur %}">Ajouter un média</a></p>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends "base.html" %}
{%block titre %}Proposition de morceau{% endblock %}
{% block content %}
<p><a href="{% url "propositions.views.liste" %}">Retour aux propositions</a></p>
{% if envoi %}<p>Votre proposition a été enregistrée.{% endif %}
<form action="{% url 'propositions.views.create_prop' %}" method="post">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Enregistrer" />
</form>
{% endblock %}

View file

@ -0,0 +1,10 @@
{% extends "base.html" %}
{% block titre %}Suppression d'une proposition{% endblock %}
{% block content %}<form action="" method="post">
{% csrf_token %}
<p><a href="{% url "propositions.views.liste" %}">Retour aux propositions</a></p>
<p>Voulez vous vraiment supprimer la proposition {{ object }}?</p>
<input type="submit" value="Oui" />
</form>
{% endblock %}

View file

@ -0,0 +1,22 @@
{% extends "base.html" %}
{% load getresponse %}
{% block titre %}Propositions de morceau{% endblock %}
{% block content %}<h1>Liste des propositions</h1>
{% if error %}
<p>{{ error }}</p>
{% endif %}
<p><a href="{% url "propositions.views.create_prop" %}">Proposer un morceau</a></p>
{% if n > 0 %}
<table>
<tr><th></th><th>Oui</th><th>Non</th><th></th><th></th><th></th></tr>
{% for p in props %}
<tr><td>{% if p.lien %}<a href={{p.lien}}>{% endif %}<b>{{ p.nom }}</b>{% if p.artiste %} - {{ p.artiste }}{% endif %}{% if p.lien %}</a>{% endif %}</td>
<td>{{p.nboui }}</td><td>{{ p.nbnon }}</td><td><a href="{% url "propositions.views.repoui" p.id %}">Oui</a></td><td><a href="{% url "propositions.views.repnon" p.id %}">Non</a></td>
{% getresponse request.user.profile p %}<td>{% if p.user == request.user.profile or request.user.profile.is_chef %}<a href=/propositions/{{p.id}}/supprimer/>Supprimer</a>{% endif %}</td></tr>
{% endfor %}
</table>
{% else %}
Pas de proposition pour le moment
{% endif %}
{% endblock %}

View file

@ -0,0 +1 @@
<td>{% if reponse %}Vous avez voté {{ reponse }}{%endif%}</td>

View file

@ -0,0 +1,5 @@
{% extends "base.html" %}
{% block titre %}Vote pris en compte{% endblock %}
{% block content %}<p>Votre vote a été pris en compte</p>
<p><a href="{% url "propositions.views.liste" %}">Voir la liste des propositions</a></p>{% endblock %}