diff --git a/Ernestophone/settings/common.py b/Ernestophone/settings/common.py index 05994aa..a75edd7 100644 --- a/Ernestophone/settings/common.py +++ b/Ernestophone/settings/common.py @@ -35,6 +35,7 @@ ACCOUNT_CREATION_PASS = import_secret("ACCOUNT_CREATION_PASS") BASE_DIR = os.path.join(os.path.dirname(__file__), "..", "..") INSTALLED_APPS = [ + "propositions", "trombonoscope", "actu", "colorful", diff --git a/calendrier/migrations/0008_auto_20220322_1454.py b/calendrier/migrations/0008_auto_20220322_1454.py new file mode 100644 index 0000000..bbaadca --- /dev/null +++ b/calendrier/migrations/0008_auto_20220322_1454.py @@ -0,0 +1,17 @@ +# Generated by Django 2.2.27 on 2022-03-22 13:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('calendrier', '0007_auto_20220314_2320'), + ] + + operations = [ + migrations.AddConstraint( + model_name='participants', + constraint=models.UniqueConstraint(fields=('event', 'participant'), name='reponse unique aux event'), + ), + ] diff --git a/propositions/__init__.py b/propositions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/propositions/admin.py b/propositions/admin.py new file mode 100644 index 0000000..e69de29 diff --git a/propositions/migrations/0001_initial.py b/propositions/migrations/0001_initial.py new file mode 100644 index 0000000..344f68c --- /dev/null +++ b/propositions/migrations/0001_initial.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('gestion', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Prop', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('nom', models.CharField(max_length=100)), + ('artiste', models.CharField(max_length=100, blank=True)), + ('lien', models.URLField(blank=True)), + ('nboui', models.IntegerField(verbose_name='oui', default=0)), + ('nbnon', models.IntegerField(verbose_name='non', default=0)), + ('user', models.ForeignKey(verbose_name='Proposé par', to='gestion.ErnestoUser', on_delete=models.CASCADE)), + ], + options={ + 'verbose_name': 'Proposition', + }, + ), + migrations.CreateModel( + name='Reponses', + fields=[ + ('id', models.AutoField(primary_key=True, verbose_name='ID', auto_created=True, serialize=False)), + ('reponse', models.CharField(verbose_name='Réponse', choices=[('oui', 'Oui'), ('non', 'Non')], max_length=20, blank=True)), + ('part', models.ForeignKey(to='gestion.ErnestoUser', on_delete=models.CASCADE)), + ('prop', models.ForeignKey(to='propositions.Prop', on_delete=models.CASCADE)), + ], + ), + ] diff --git a/propositions/migrations/0002_nom_verbose_name.py b/propositions/migrations/0002_nom_verbose_name.py new file mode 100644 index 0000000..02d1ef9 --- /dev/null +++ b/propositions/migrations/0002_nom_verbose_name.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-01-04 23:01 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('propositions', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='prop', + name='nom', + field=models.CharField(max_length=100, verbose_name='nom du morceau'), + ), + ] diff --git a/propositions/migrations/0003_reponse_renaming_and_cleaning.py b/propositions/migrations/0003_reponse_renaming_and_cleaning.py new file mode 100644 index 0000000..6489374 --- /dev/null +++ b/propositions/migrations/0003_reponse_renaming_and_cleaning.py @@ -0,0 +1,75 @@ +# Generated by Django 2.2.9 on 2020-01-05 13:32 + +from django.conf import settings +from django.db import migrations, models + + +def move_profile_to_user(apps, schema_editor): + Reponses = apps.get_model("propositions", "reponses") + for answer in Reponses.objects.all(): + answer.user = answer.part.user + answer.save() + + +def move_user_to_profile(apps, schema_editor): + # One should do something similar to ``move_profile_to_user`` AND make the + # ``part`` field temporarily nullable in the operations below. + # => Grosse flemme + raise NotImplementedError("Who uses migrations backwards anyway?") + + +class Migration(migrations.Migration): + + dependencies = [ + ("gestion", "0001_initial"), + ("propositions", "0002_nom_verbose_name"), + ] + + operations = [ + migrations.AlterModelOptions( + name="reponses", + options={ + "verbose_name": "Réponse à une proposition", + "verbose_name_plural": "Réponses à une proposition", + }, + ), + migrations.RenameField( + model_name="reponses", old_name="prop", new_name="proposition", + ), + migrations.AddField( + model_name="reponses", + name="user", + field=models.ForeignKey( + on_delete=models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + null=True, + ), + ), + migrations.RunPython(move_profile_to_user, move_user_to_profile), + migrations.AlterField( + model_name="reponses", + name="user", + field=models.ForeignKey( + on_delete=models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + null=False, + ), + ), + migrations.RemoveField(model_name="reponses", name="part"), + migrations.AddField( + model_name="reponses", + name="answer", + field=models.CharField( + choices=[("oui", "Oui"), ("non", "Non")], + default="non", + max_length=3, + verbose_name="Réponse", + ), + preserve_default=False, + ), + migrations.AlterUniqueTogether( + name="reponses", unique_together={("proposition", "user")}, + ), + migrations.RemoveField(model_name="reponses", name="reponse",), + migrations.RenameModel(old_name="reponses", new_name="answer"), + ] diff --git a/propositions/migrations/0004_prop_renaming_and_cleaning.py b/propositions/migrations/0004_prop_renaming_and_cleaning.py new file mode 100644 index 0000000..0a4efea --- /dev/null +++ b/propositions/migrations/0004_prop_renaming_and_cleaning.py @@ -0,0 +1,43 @@ +# Generated by Django 2.2.9 on 2020-01-05 14:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("propositions", "0003_reponse_renaming_and_cleaning"), + ] + + operations = [ + migrations.AlterModelOptions( + name="prop", + options={ + "verbose_name": "Proposition de morceau", + "verbose_name_plural": "Propositions de morceaux", + }, + ), + migrations.RenameField( + model_name="prop", old_name="artiste", new_name="artist", + ), + migrations.RenameField(model_name="prop", old_name="lien", new_name="link"), + migrations.RenameField(model_name="prop", old_name="nom", new_name="name"), + migrations.RenameField(model_name="prop", old_name="nbnon", new_name="nb_no"), + migrations.RenameField(model_name="prop", old_name="nboui", new_name="nb_yes"), + migrations.AlterField( + model_name="prop", + name="nb_no", + field=models.IntegerField(default=0, verbose_name="nombre de réponses non"), + ), + migrations.AlterField( + model_name="prop", + name="nb_yes", + field=models.IntegerField(default=0, verbose_name="nombre de réponses oui"), + ), + migrations.RenameModel(old_name="prop", new_name="proposition"), + migrations.AlterField( + model_name='answer', + name='proposition', + field=models.ForeignKey(on_delete=models.deletion.CASCADE, to='propositions.Proposition'), + ), + ] diff --git a/propositions/migrations/0005_remove_nb_yes_no_fields.py b/propositions/migrations/0005_remove_nb_yes_no_fields.py new file mode 100644 index 0000000..4f09c1e --- /dev/null +++ b/propositions/migrations/0005_remove_nb_yes_no_fields.py @@ -0,0 +1,24 @@ +# Generated by Django 2.2.9 on 2020-01-05 15:26 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("propositions", "0004_prop_renaming_and_cleaning"), + ] + + operations = [ + migrations.RemoveField(model_name="proposition", name="nb_no",), + migrations.RemoveField(model_name="proposition", name="nb_yes",), + migrations.AlterField( + model_name="answer", + name="proposition", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="propositions.Proposition", + ), + ), + ] diff --git a/propositions/migrations/0006_proposition_profile_to_user.py b/propositions/migrations/0006_proposition_profile_to_user.py new file mode 100644 index 0000000..d0ebd6a --- /dev/null +++ b/propositions/migrations/0006_proposition_profile_to_user.py @@ -0,0 +1,53 @@ +# Generated by Django 2.2.9 on 2020-01-05 16:28 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +def move_profile_to_user(apps, schema_editor): + Proposition = apps.get_model("propositions", "Proposition") + for proposition in Proposition.objects.all(): + proposition.user = proposition.profile.user + proposition.save() + + +def move_user_to_profile(apps, schema_editor): + # One should do something similar to ``move_profile_to_user`` AND make the + # ``profile`` field temporarily nullable in the operations below. + # => Grosse flemme + raise NotImplementedError("Who uses migrations backwards anyway?") + + +class Migration(migrations.Migration): + + dependencies = [ + ("propositions", "0005_remove_nb_yes_no_fields"), + ] + + operations = [ + migrations.RenameField( + model_name="proposition", old_name="user", new_name="profile" + ), + migrations.AddField( + model_name="proposition", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + verbose_name="Proposé par", + null=True, + ), + ), + migrations.RunPython(move_profile_to_user, move_user_to_profile), + migrations.RemoveField(model_name="proposition", name="profile"), + migrations.AlterField( + model_name="proposition", + name="user", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to=settings.AUTH_USER_MODEL, + verbose_name="Proposé par", + ), + ), + ] diff --git a/propositions/migrations/0007_auto_20220322_1455.py b/propositions/migrations/0007_auto_20220322_1455.py new file mode 100644 index 0000000..f5e278e --- /dev/null +++ b/propositions/migrations/0007_auto_20220322_1455.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.27 on 2022-03-22 13:55 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('propositions', '0006_proposition_profile_to_user'), + ] + + operations = [ + migrations.AlterField( + model_name='answer', + name='proposition', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='propositions.Proposition'), + ), + ] diff --git a/propositions/migrations/__init__.py b/propositions/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/propositions/models.py b/propositions/models.py new file mode 100644 index 0000000..1c6dcfa --- /dev/null +++ b/propositions/models.py @@ -0,0 +1,34 @@ +from django.contrib.auth import get_user_model +from django.db import models + +User = get_user_model() + + +class Proposition(models.Model): + name = models.CharField(max_length=100, verbose_name="nom du morceau") + artist = models.CharField(blank=True, max_length=100) + user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="Proposé par") + link = models.URLField(blank=True) + + def __str__(self): + return self.name + + class Meta: + verbose_name = "Proposition de morceau" + verbose_name_plural = "Propositions de morceaux" + + +class Answer(models.Model): + YES = "oui" + NO = "non" + + REP_CHOICES = [(YES, "Oui"), (NO, "Non")] + + proposition = models.ForeignKey(Proposition, on_delete=models.CASCADE) + user = models.ForeignKey(User, on_delete=models.CASCADE) + answer = models.CharField("Réponse", max_length=3, choices=REP_CHOICES) + + class Meta: + unique_together = ("proposition", "user") + verbose_name = "Réponse à une proposition" + verbose_name_plural = "Réponses à une proposition" diff --git a/propositions/templates/propositions/create.html b/propositions/templates/propositions/create.html new file mode 100644 index 0000000..0d72e5d --- /dev/null +++ b/propositions/templates/propositions/create.html @@ -0,0 +1,14 @@ +{% extends "gestion/base.html" %} + +{% block titre %}Proposition de morceau{% endblock %} + +{% block content %} + +
+ + +{% endblock %} diff --git a/propositions/templates/propositions/delete.html b/propositions/templates/propositions/delete.html new file mode 100644 index 0000000..27645af --- /dev/null +++ b/propositions/templates/propositions/delete.html @@ -0,0 +1,10 @@ +{% extends "gestion/base.html" %} + +{% block titre %}Suppression d'une proposition{% endblock %} +{% block content %} +{% endblock %} diff --git a/propositions/templates/propositions/liste.html b/propositions/templates/propositions/liste.html new file mode 100644 index 0000000..02e5ca1 --- /dev/null +++ b/propositions/templates/propositions/liste.html @@ -0,0 +1,44 @@ +{% extends "gestion/base.html" %} + +{% block titre %}Propositions de morceau{% endblock %} + +{% block content %} ++ | Oui | +Non | ++ | + | + | + |
---|---|---|---|---|---|---|
+ {% if p.link %}{% endif %} + {{ p.name }}{% if p.artist %} - {{ p.artist }}{% endif %} + {% if p.link %}{% endif %} + | +{{ p.nb_yes }} | +{{ p.nb_no }} | +Oui | +Non | +{% if p.user_answer %}Vous avez voté {{ p.user_answer }}{% endif %} | ++ {% if p.user == request.user or request.user.profile.is_chef %} + Supprimer + {% endif %} + | +