From bb30f917db74e7f8b180157084f43b70762f2c34 Mon Sep 17 00:00:00 2001
From: Sofiane Lasri <alasri250@gmail.com>
Date: Wed, 31 May 2023 11:08:30 +0200
Subject: [PATCH] =?UTF-8?q?TP8=20termin=C3=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 webpizza/applipizza/forms.py                  |  9 ++-
 .../applipizza/migrations/0002_pizza_image.py | 18 +++++
 webpizza/applipizza/models.py                 |  7 +-
 .../static/applipizza/css/styles.css          | 10 +++
 .../formulaireModificationPizza.html          | 78 +++++++++++++++++++
 .../templates/applipizza/pizza.html           | 32 ++++----
 .../templates/applipizza/pizzas.html          |  4 +-
 webpizza/applipizza/views.py                  | 75 ++++++++++++++----
 webpizza/webpizza/settings.py                 |  2 +
 webpizza/webpizza/urls.py                     |  8 ++
 10 files changed, 206 insertions(+), 37 deletions(-)
 create mode 100644 webpizza/applipizza/migrations/0002_pizza_image.py
 create mode 100644 webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html

diff --git a/webpizza/applipizza/forms.py b/webpizza/applipizza/forms.py
index 42ebb81..d1f7062 100644
--- a/webpizza/applipizza/forms.py
+++ b/webpizza/applipizza/forms.py
@@ -1,6 +1,6 @@
 from django.forms import ModelForm
 
-from applipizza.models import Ingredient, Composition
+from applipizza.models import Ingredient, Composition, Pizza
 
 
 class IngredientForm(ModelForm):
@@ -11,4 +11,9 @@ class IngredientForm(ModelForm):
 class CompositionForm(ModelForm):
     class Meta:
         model = Composition
-        fields = ['ingredient', 'quantite']
\ No newline at end of file
+        fields = ['ingredient', 'quantite']
+
+class PizzaForm(ModelForm):
+    class Meta:
+        model = Pizza
+        fields = ['nom', 'prix', 'image']
diff --git a/webpizza/applipizza/migrations/0002_pizza_image.py b/webpizza/applipizza/migrations/0002_pizza_image.py
new file mode 100644
index 0000000..82247ea
--- /dev/null
+++ b/webpizza/applipizza/migrations/0002_pizza_image.py
@@ -0,0 +1,18 @@
+# Generated by Django 4.2 on 2023-05-23 09:38
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('applipizza', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='pizza',
+            name='image',
+            field=models.ImageField(blank=True, null=True, upload_to='images/'),
+        ),
+    ]
diff --git a/webpizza/applipizza/models.py b/webpizza/applipizza/models.py
index 463778d..7fe83fb 100644
--- a/webpizza/applipizza/models.py
+++ b/webpizza/applipizza/models.py
@@ -1,3 +1,4 @@
+from django.core.validators import validate_image_file_extension
 from django.db import models
 
 
@@ -7,8 +8,9 @@ class Ingredient(models.Model):
     id = models.AutoField(primary_key=True)
     nom = models.CharField(max_length=50, verbose_name="Nom de l'ingrédient")
 
-    def __str__(self) -> str:
-        return self.nom
+
+def __str__(self) -> str:
+    return self.nom
 
 
 # Pizza
@@ -16,6 +18,7 @@ class Pizza(models.Model):
     id = models.AutoField(primary_key=True)
     nom = models.CharField(max_length=50, verbose_name="Nom de la pizza")
     prix = models.FloatField(verbose_name="Prix de la pizza")
+    image = models.ImageField(upload_to='images/', validators=[validate_image_file_extension])
 
     def __str__(self) -> str:
         return self.nom
diff --git a/webpizza/applipizza/static/applipizza/css/styles.css b/webpizza/applipizza/static/applipizza/css/styles.css
index 34727ea..4f99233 100644
--- a/webpizza/applipizza/static/applipizza/css/styles.css
+++ b/webpizza/applipizza/static/applipizza/css/styles.css
@@ -95,6 +95,12 @@ header {
     margin-top: 1rem;
 }
 
+.white-bg {
+    background-color: white;
+    border-radius: 5px;
+    padding: .5rem;
+}
+
 .page-content .container {
     box-sizing: border-box;
     background-color: white;
@@ -102,6 +108,10 @@ header {
     padding: .5rem;
 }
 
+.page-content .container.no-padding {
+    padding: 0;
+}
+
 footer {
     background-color: #EFEFEF;
     left: 0;
diff --git a/webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html b/webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html
new file mode 100644
index 0000000..d0f66c4
--- /dev/null
+++ b/webpizza/applipizza/templates/applipizza/formulaireModificationPizza.html
@@ -0,0 +1,78 @@
+{% extends 'applipizza/base.html' %}
+
+{% load static %}
+
+{% block title %}
+    Lasri Del Arte - Pizza {{ pizza }}
+{% endblock %}
+
+{% block content %}
+    <div class="container">
+        <h2>Modifier la pizza {{ pizza }}</h2>
+        <p>Ici vous pouvez modifier la pizza.</p>
+
+        <h3>Ajouter un ingrédient</h3>
+        <form action="/pizza/{{ pizza.id }}/update/post" method="post" enctype="multipart/form-data" class="form-stacked">
+            {% csrf_token %}
+            {% for field in form %}
+                {% if field.errors %}
+                    <div class="clearfix error">
+                    <label for="{{ field.id_for_label }}">{{ field.label }}</label>
+                    <div class="input">
+                        {{ field }}
+                        <span class="help-inline">
+                                {% for error in field.errors %}
+                                    {{ error }}
+                                {% endfor %}
+                            </span>
+                    </div>
+                {% else %}
+                    <div class="clearfix">
+                        <label for="{{ field.id_for_label }}">{{ field.label }}</label>
+                        <div class="input">
+                            {{ field }}
+                        </div>
+                    </div>
+                {% endif %}
+            {% endfor %}
+            <div class="actions">
+                <input type="submit" value="Enregistrer" class="btn success">
+                <button type="reset" class="btn">Annuler</button>
+            </div>
+        </form>
+    </div>
+{% endblock %}
+
+{% block javascripts %}
+    <script type="text/javascript" src="{% static 'applipizza/js/bootstrap-alerts.js' %}"></script>
+    <script type="text/javascript" src="{% static 'applipizza/js/jquery.tablesorter.min.js' %}"></script>
+    <script type="text/javascript">
+        $(document).ready(function () {
+            $('#composition').tablesorter({sortList: [[0, 1]]});
+        });
+
+        var form = $('form');
+        var formRequiredFields = form.find('input[required]');
+        var formSubmitButton = form.find('input[type=submit]');
+
+        // We disable form validation
+        form.attr('novalidate', 'novalidate');
+        form.submit(function (e) {
+            formRequiredFields.each(function () {
+                if ($(this).val() == '') {
+                    console.log('empty');
+                    e.preventDefault();
+                    $(this).parent().append('<span class="help-inline">Ce champ est obligatoire</span>');
+                    $(this).parent().parent().addClass('error');
+                } else {
+                    if ($(this).parent().find('span.help-inline').length > 0) {
+                        $(this).parent().find('span.help-inline').remove();
+                        $(this).parent().parent().removeClass('error');
+                    }
+                }
+            });
+        });
+        // We disable the submit button
+        //formSubmitButton.attr('disabled', 'disabled');
+    </script>
+{% endblock %}
\ No newline at end of file
diff --git a/webpizza/applipizza/templates/applipizza/pizza.html b/webpizza/applipizza/templates/applipizza/pizza.html
index 3f1235a..34f68d9 100644
--- a/webpizza/applipizza/templates/applipizza/pizza.html
+++ b/webpizza/applipizza/templates/applipizza/pizza.html
@@ -8,6 +8,20 @@
 
 {% block content %}
     <div class="container">
+        {% if status %}
+            {% if status == 'success' %}
+                <div class="alert-message success" data-alert>
+                    <a class="close" href="#">×</a>
+                    <p><strong>Opération réussie !</strong></p>
+                </div>
+            {% endif %}
+            {% if status == 'error' %}
+                <div class="alert-message error" data-alert>
+                    <a class="close" href="#">×</a>
+                    <p><strong>Erreur !</strong> L'opération a échouée.</p>
+                </div>
+            {% endif %}
+        {% endif %}
         <h2>Pizza {{ pizza }}</h2>
         <p>Une délicieuse pizza traditionnelle.</p>
 
@@ -30,20 +44,6 @@
             </tbody>
         </table>
 
-        {% if status %}
-            {% if status == 'success' %}
-                <div class="alert-message success" data-alert>
-                    <a class="close" href="#">×</a>
-                    <p><strong>Enregistré !</strong> L'ingrédient {{ nomIngredient }} a bien été ajouté.</p>
-                </div>
-            {% endif %}
-            {% if status == 'error' %}
-                <div class="alert-message error" data-alert>
-                    <a class="close" href="#">×</a>
-                    <p><strong>Erreur !</strong> L'ingrédient n'a pas pu être ajouté.</p>
-                </div>
-            {% endif %}
-        {% endif %}
         <h3>Ajouter un ingrédient</h3>
         <form action="/pizza/{{ pizza.id }}/addIngredient" method="post" class="form-stacked">
             {% csrf_token %}
@@ -69,8 +69,10 @@
                 {% endif %}
             {% endfor %}
             <div class="actions">
-                <input type="submit" value="Ajouter" class="btn primary">
+                <input type="submit" value="Ajouter" class="btn success">
                 <button type="reset" class="btn">Annuler</button>
+                <a href="/pizza/{{ pizza.id }}/update" class="btn info">Modifier la pizza</a>
+                <a href="/pizza/{{ pizza.id }}/delete" class="btn danger">Supprimer la pizza</a>
             </div>
         </form>
     </div>
diff --git a/webpizza/applipizza/templates/applipizza/pizzas.html b/webpizza/applipizza/templates/applipizza/pizzas.html
index 8ceba09..5b75430 100644
--- a/webpizza/applipizza/templates/applipizza/pizzas.html
+++ b/webpizza/applipizza/templates/applipizza/pizzas.html
@@ -15,7 +15,9 @@
             {% for p in pizzas %}
             <div class="card">
                 <div class="header">
-                    <img class="logo" src="{% static 'applipizza/img/margherita.jpg' %}" alt="{{ p.nom }}">
+                    <div class="logo">
+                        <img src="{% get_media_prefix %}{{ p.image }}" alt="{{ p.nom }}">
+                    </div>
                 </div>
                 <div class="body">
                     <h5>{{ p.nom }}</h5>
diff --git a/webpizza/applipizza/views.py b/webpizza/applipizza/views.py
index 4b12dc5..a1e15ff 100644
--- a/webpizza/applipizza/views.py
+++ b/webpizza/applipizza/views.py
@@ -1,6 +1,6 @@
 from django.shortcuts import render
 from applipizza.models import Pizza, Ingredient, Composition
-from applipizza.forms import IngredientForm, CompositionForm
+from applipizza.forms import IngredientForm, CompositionForm, PizzaForm
 
 # Create your views here.
 def pizzas(request):
@@ -13,21 +13,7 @@ def pizzas(request):
 
 
 def pizza(request, id):
-    formulaire = CompositionForm()
-
-    pizza = Pizza.objects.get(id=id)
-    composition = Composition.objects.filter(pizza_id=id)
-    compositionArray = []
-    for c in composition:
-        compositionArray.append([Ingredient.objects.get(id=c.ingredient_id).nom, c.quantite])
-    pizza.composition = compositionArray
-
-    return render(
-        request,
-        'applipizza/pizza.html',
-        {'pizza': pizza, 'form': formulaire}
-    )
-
+    return viewPizza(request, id)
 
 def formulaireCreationIngredient(request):
     formulaire = IngredientForm()
@@ -74,8 +60,63 @@ def ajouterIngredientDansPizza(request, id):
         composition = Composition(ingredient=ingredient, quantite=quantite, pizza=pizza)
         composition.save()
 
+        return viewPizza(request, id, 'success')
+
+def supprimerPizza(request, id):
+    pizza = Pizza.objects.get(id=id)
+
+    pizza.delete()
+    composition = Composition.objects.filter(pizza_id=id)
+    composition.delete()
+    pizzas = Pizza.objects.all()
+    return render(
+        request,
+        'applipizza/pizzas.html',
+        {'pizzas': pizzas}
+    )
+
+def modifierPizza(request, id):
+    pizza = Pizza.objects.get(id=id)
+    formulaire = PizzaForm(instance = pizza)
+    return render(
+        request,
+        'applipizza/formulaireModificationPizza.html',
+        {'pizza': pizza, 'form': formulaire}
+    )
+
+def traitementFormulaireModificationPizza(request, id):
+    pizza = Pizza.objects.get(id=id)
+    form = PizzaForm(request.POST, request.FILES)
+
+    if form.is_valid():
+        pizza.nom = form.cleaned_data['nom']
+        pizza.prix = form.cleaned_data['prix']
+        pizza.image = request.FILES['image']
+        pizza.save()
+
+        return viewPizza(request, id, 'success')
+    else:
+        return viewPizza(request, id, 'error')
+
+def viewPizza(request, id, status=None):
+    formulaire = CompositionForm()
+
+    pizza = Pizza.objects.get(id=id)
+    composition = Composition.objects.filter(pizza_id=id)
+    compositionArray = []
+    for c in composition:
+        compositionArray.append([Ingredient.objects.get(id=c.ingredient_id).nom, c.quantite])
+    pizza.composition = compositionArray
+
+    if status==None:
+        return render(
+            request,
+            'applipizza/pizza.html',
+            {"pizza": pizza, 'form': formulaire}
+        )
+    else:
         return render(
             request,
             'applipizza/pizza.html',
-            {"pizza": pizza, "status": "success"}
+            {"pizza": pizza, 'form': formulaire, 'status': status}
         )
\ No newline at end of file
diff --git a/webpizza/webpizza/settings.py b/webpizza/webpizza/settings.py
index 83da29b..51b5d88 100644
--- a/webpizza/webpizza/settings.py
+++ b/webpizza/webpizza/settings.py
@@ -126,3 +126,5 @@ STATIC_URL = 'static/'
 # https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
 
 DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+MEDIA_ROOT = BASE_DIR/'media'
+MEDIA_URL = '/media/'
\ No newline at end of file
diff --git a/webpizza/webpizza/urls.py b/webpizza/webpizza/urls.py
index 5f12bdf..2c66790 100644
--- a/webpizza/webpizza/urls.py
+++ b/webpizza/webpizza/urls.py
@@ -17,12 +17,20 @@ Including another URLconf
 from django.contrib import admin
 from django.urls import path
 from applipizza import views
+from django.conf import settings  # new
+from django.urls import path, include  # new
+from django.conf.urls.static import static  # new
 
 urlpatterns = [
     path('admin/', admin.site.urls),
     path('pizzas/', views.pizzas),
     path('pizza/<int:id>', views.pizza),
     path('pizza/<int:id>/addIngredient', views.ajouterIngredientDansPizza),
+    path('pizza/<int:id>/update', views.modifierPizza),
+    path('pizza/<int:id>/update/post', views.traitementFormulaireModificationPizza),
+    path('pizza/<int:id>/delete', views.supprimerPizza),
     path('ingredients/add', views.formulaireCreationIngredient),
     path('ingredients/add/post', views.creerIngredient),
 ]
+
+urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) #new
\ No newline at end of file
-- 
GitLab