From fe77d9f79c89ab1d91ffc57fcddba62e0f8d6c08 Mon Sep 17 00:00:00 2001 From: Godlewski Stanislas <stanislas.godlewski@student-cs.fr> Date: Thu, 21 Nov 2024 18:13:31 +0100 Subject: [PATCH 01/11] Version fonctionnelle objets --- .DS_Store | Bin 8196 -> 8196 bytes .../0002_alter_borrowrequest_id_object.py | 20 ++++ Borrowing/models.py | 4 +- .../templates/Borrowing/borrow_request.html | 2 +- .../templates/Borrowing/borrowed_items.html | 4 +- Borrowing/templates/Borrowing/borrowing.html | 4 +- Borrowing/views.py | 12 +-- Communities/models.py | 6 +- .../Communities/list_objects_admin.html | 2 +- .../Communities/list_objects_community.html | 4 +- object/forms.py | 8 +- ...objectcategory_object_category_and_more.py | 55 +++++++++++ object/models.py | 22 +++-- object/scripts/data.csv | 79 +++++++++++++++ object/scripts/script.py | 59 +++++++++++ object/templates/object/modify_object.html | 17 ++-- object/templates/object/object_list.html | 23 ++--- .../templates/object/select_user_objects.html | 16 +++ object/urls.py | 5 +- object/views.py | 93 +++++++++--------- 20 files changed, 335 insertions(+), 100 deletions(-) create mode 100644 Borrowing/migrations/0002_alter_borrowrequest_id_object.py create mode 100644 object/migrations/0005_rename_objectcategory_object_category_and_more.py create mode 100644 object/scripts/data.csv create mode 100644 object/scripts/script.py create mode 100644 object/templates/object/select_user_objects.html diff --git a/.DS_Store b/.DS_Store index d2d8f002b55ec80f5d911c47e0cae1b0dbdb9bf9..a7e587f147e929c1c5b8df694ce81e223e531a40 100644 GIT binary patch delta 42 ycmZp1XmOa}&&a<qU^hP_|7IS6|BRCpg{N({6lr7Jtj_a*c{97jH<pbR?92c%`wk8O delta 195 zcmZp1XmOa}&nU7nU^hRb$Yvga|BRws3@Hpr40;U34229i44Dii45<vplO+V?`PmsV zfV^CwXfi`SL)l~>EMgl3j!UDdD+?~l%gN76XJBApoXjCK(_E0DfT0LzYB3P!0ZmK< z;!L24c|cnWfUtz2!ZRm7IVmSU38+T^sI41F>usJUG?8&*g9p=Qc8PB+lT(EcZESF5 F0sxnSFR}mt diff --git a/Borrowing/migrations/0002_alter_borrowrequest_id_object.py b/Borrowing/migrations/0002_alter_borrowrequest_id_object.py new file mode 100644 index 0000000..a750bf2 --- /dev/null +++ b/Borrowing/migrations/0002_alter_borrowrequest_id_object.py @@ -0,0 +1,20 @@ +# Generated by Django 5.1.3 on 2024-11-21 16:27 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Borrowing', '0001_initial'), + ('object', '0005_rename_objectcategory_object_category_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='borrowrequest', + name='id_object', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='object.userobject'), + ), + ] diff --git a/Borrowing/models.py b/Borrowing/models.py index 00eaa63..78af578 100644 --- a/Borrowing/models.py +++ b/Borrowing/models.py @@ -1,10 +1,10 @@ from django.db import models from django.contrib.auth.models import User -from object.models import Object +from object.models import UserObject # Create your models here. class BorrowRequest(models.Model): id_borrower = models.ForeignKey(User, on_delete=models.CASCADE) - id_object = models.ForeignKey(Object, on_delete=models.CASCADE) + id_object = models.ForeignKey(UserObject, on_delete=models.CASCADE) is_accepted = models.BooleanField(default=False) is_finished = models.BooleanField(default=False) diff --git a/Borrowing/templates/Borrowing/borrow_request.html b/Borrowing/templates/Borrowing/borrow_request.html index ce61028..e0443b0 100644 --- a/Borrowing/templates/Borrowing/borrow_request.html +++ b/Borrowing/templates/Borrowing/borrow_request.html @@ -8,7 +8,7 @@ <ul> {% for request in requests %} {% if id_user == request.id_object.id_lender.id and not request.is_finished %} - <li>{{request.id_object.name}} - Demandé par {{request.id_borrower.username}}</li> + <li>{{request.id_object.object.name}} - Demandé par {{request.id_borrower.username}}</li> {% if request.id_object.is_borrowed%} {% if request.is_accepted %} <button class="btn btn-success" type = "submit" disabled>Acceptée !</button> diff --git a/Borrowing/templates/Borrowing/borrowed_items.html b/Borrowing/templates/Borrowing/borrowed_items.html index ff54c50..9540884 100644 --- a/Borrowing/templates/Borrowing/borrowed_items.html +++ b/Borrowing/templates/Borrowing/borrowed_items.html @@ -7,7 +7,7 @@ <ul> {% for request in requests %} {% if request.id_borrower == user and not request.is_finished%} - <li>{{request.id_object.name}} - Demandé à {{request.id_object.id_lender.username}}: + <li>{{request.id_object.object.name}} - Demandé à {{request.id_object.id_lender.username}}: {% if request.is_accepted %} <p>Demande acceptée : Prenez contact avec {{request.id_object.id_lender.first_name}} à {{request.id_object.id_lender.email}} </p> <form method = "POST"> @@ -16,7 +16,7 @@ </form> {% elif request.id_object.is_borrowed %} <p> L'objet est déjà emprunté :(</p> - <form method = "POST"> + <form method = "POST">x {% csrf_token %} <button class="btn btn-danger" type = "submit" value = {{request.id}} id = "cancelOrEnd" name = "cancelOrEnd">Annuler la demande</button> </form> diff --git a/Borrowing/templates/Borrowing/borrowing.html b/Borrowing/templates/Borrowing/borrowing.html index faef3d6..fdb7e16 100644 --- a/Borrowing/templates/Borrowing/borrowing.html +++ b/Borrowing/templates/Borrowing/borrowing.html @@ -9,10 +9,10 @@ {% if object in filtered_objects%} <form method = "POST"> {% csrf_token %} - <li>{{object.name}}: <button class="btn btn-success" value = {{object.id}} name = "item" id = "item"> Demander </button></li> + <li>{{object.object.name}} à {{object.id_lender.first_name}} {{object.id_lender.last_name}}: <button class="btn btn-success" value = {{object.id}} name = "item" id = "item"> Demander </button></li> </form> {% else %} - <li>{{object.name}}: <button class="btn btn-danger" value = {{object.id}} name = "item" id = "item" disabled> Déjà demandé ! </button></li> + <li>{{object.object.name}} à {{object.id_lender.first_name}} {{object.id_lender.last_name}}: <button class="btn btn-danger" value = {{object.id}} name = "item" id = "item" disabled> Déjà demandé ! </button></li> {% endif %} {% endfor %} </ul> diff --git a/Borrowing/views.py b/Borrowing/views.py index 379d0d2..20e295f 100644 --- a/Borrowing/views.py +++ b/Borrowing/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from django.http import HttpResponse -from object.models import Object, ObjectCategory +from object.models import Object, ObjectCategory, UserObject from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from . import models @@ -14,17 +14,17 @@ def borrowing(request): #Vue permettant à l'utilisateur de faire une demande communities = CommunityMembership.objects.filter(user = request.user).values("community") lender = CommunityMembership.objects.filter(community__in=communities).values("user") - listObjects = Object.objects.filter(id_lender__in=lender) + listObjects = UserObject.objects.filter(id_lender__in=lender) if request.method == "POST": #Cas où il effectue une nouvelle demande form = forms.borrowing(request.POST) if form.is_valid(): #Création de la demande dans la base de données - item = Object.objects.get(id = form.cleaned_data["item"]) - borrowRequest = models.BorrowRequest.objects.create(id_object = item, id_borrower = request.user) + item = UserObject.objects.get(id = form.cleaned_data["item"]) + borrowRequest = BorrowRequest.objects.create(id_borrower = request.user, id_object = item) #Création d'un contexte permettant d'éviter de faire plusieurs fois la même demande - doublons = models.BorrowRequest.objects.values("id_object", "id_borrower", "is_finished") + doublons = BorrowRequest.objects.values("id_object", "id_borrower", "is_finished") contexte = { "objects": listObjects, "user" : request.user, @@ -49,7 +49,7 @@ def borrowing(request): @login_required def borrowing_test(request, object_id): - object = Object.objects.get(id=object_id) + object = UserObject.objects.get(id=object_id) borrowRequest = models.Borrow.objects.create(id_object = object, id_borrower = request.user) return render(request, "Borrowing/thanks.html") diff --git a/Communities/models.py b/Communities/models.py index 0da6124..853faf0 100644 --- a/Communities/models.py +++ b/Communities/models.py @@ -1,6 +1,6 @@ from django.db import models from django.contrib.auth.models import User -from object.models import Object +from object.models import UserObject class Community(models.Model): name = models.CharField(max_length=100) @@ -23,13 +23,13 @@ class Community(models.Model): Retourne tous les objets prêtés par des membres de cette communauté. ''' # Utiliser une requête différée pour récupérer les membres de la communauté - from .models import CommunityMembership, Object + from .models import CommunityMembership, UserObject # Obtenir les utilisateurs membres de la communauté member_ids = CommunityMembership.objects.filter(community=self).values_list('user_id', flat=True) # Filtrer les objets prêtés par ces membres - return Object.objects.filter(id_lender__id__in=member_ids) + return UserObject.objects.filter(id_lender__id__in=member_ids) class CommunityMembership(models.Model): diff --git a/Communities/templates/Communities/list_objects_admin.html b/Communities/templates/Communities/list_objects_admin.html index fd06619..4fcfdf3 100644 --- a/Communities/templates/Communities/list_objects_admin.html +++ b/Communities/templates/Communities/list_objects_admin.html @@ -5,7 +5,7 @@ <ul> {% for obj in objects %} <li> - {{ obj.name }} + {{ obj.object.name }} <form method="POST" action="{% url 'delete_object' community.id obj.id %}"> {% csrf_token %} <button type="submit" class="btn btn-danger">Supprimer</button> diff --git a/Communities/templates/Communities/list_objects_community.html b/Communities/templates/Communities/list_objects_community.html index 0a3f05e..ca8025d 100644 --- a/Communities/templates/Communities/list_objects_community.html +++ b/Communities/templates/Communities/list_objects_community.html @@ -25,9 +25,9 @@ <tbody> {% for obj in objects %} <tr> - <td>{{ obj.name }}</td> + <td>{{ obj.object.name }}</td> <td>{{ obj.description }}</td> - <td>{{ obj.objectCategory.name }}</td> + <td>{{ obj.object.category.name }}</td> <td>{{ obj.id_lender.username }}</td> </tr> diff --git a/object/forms.py b/object/forms.py index 1caf178..1ec4838 100644 --- a/object/forms.py +++ b/object/forms.py @@ -4,5 +4,11 @@ from .models import Object class ObjectForm(forms.ModelForm): class Meta: model = Object - fields = ['objectCategory', 'description', 'name'] + fields = ['name', 'category'] +class UserObjectSelectForm(forms.Form): + objects = forms.ModelMultipleChoiceField( + queryset=Object.objects.all(), + widget=forms.CheckboxSelectMultiple, + required=False + ) diff --git a/object/migrations/0005_rename_objectcategory_object_category_and_more.py b/object/migrations/0005_rename_objectcategory_object_category_and_more.py new file mode 100644 index 0000000..5c408ae --- /dev/null +++ b/object/migrations/0005_rename_objectcategory_object_category_and_more.py @@ -0,0 +1,55 @@ +# Generated by Django 5.1.3 on 2024-11-21 16:00 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('object', '0004_object_is_borrowed'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.RenameField( + model_name='object', + old_name='objectCategory', + new_name='category', + ), + migrations.RemoveField( + model_name='object', + name='description', + ), + migrations.RemoveField( + model_name='object', + name='id_lender', + ), + migrations.RemoveField( + model_name='object', + name='is_borrowed', + ), + migrations.RemoveField( + model_name='objectcategory', + name='description', + ), + migrations.CreateModel( + name='Selection', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='object.object')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='UserObject', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.CharField(max_length=1000, null=True)), + ('is_borrowed', models.BooleanField(default=False)), + ('id_lender', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ('object', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='object.object')), + ], + ), + ] diff --git a/object/models.py b/object/models.py index 19af356..94db28e 100644 --- a/object/models.py +++ b/object/models.py @@ -6,19 +6,29 @@ from django.contrib.auth.models import User class ObjectCategory(models.Model): ''' Les différentes Catégories d'objet possible''' name = models.CharField(max_length=100) - description = models.TextField(max_length=1000) def __str__(self): return self.name - class Object(models.Model): + name = models.CharField(max_length = 100) + category = models.ForeignKey(ObjectCategory, on_delete=models.CASCADE) + + def __str__(self): + return self.name + + + +class UserObject(models.Model): ''' Chaque objet vient d'une catégorie possible qui a été approuvé''' - name = models.CharField(max_length=100) - description = models.CharField(max_length=1000) - objectCategory = models.ForeignKey(ObjectCategory, on_delete=models.CASCADE) + description = models.CharField(max_length=1000, null=True) + object = models.ForeignKey(Object, on_delete=models.CASCADE) id_lender = models.ForeignKey(User, on_delete=models.CASCADE) is_borrowed = models.BooleanField(default=False) # Attribut qui sera modifié dans Borrowing def __str__(self): - return self.description \ No newline at end of file + return f"Objet {self.object.name} par {self.id_lender.first_name} : {self.description}" + +class Selection(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + object = models.ForeignKey(Object, on_delete=models.CASCADE) diff --git a/object/scripts/data.csv b/object/scripts/data.csv new file mode 100644 index 0000000..7c1aae2 --- /dev/null +++ b/object/scripts/data.csv @@ -0,0 +1,79 @@ +Catégorie,Objet +Bien-être,Appareil chauffe pierre +Bien-être,Table de massage +Bricolage,Perceuse - visseuse +Bricolage,Visseuse sans fil +Bricolage,Perforatrice +Bricolage,Scie sauteuse +Bricolage,Scie circulaire +Bricolage,Boite à onglet +Bricolage,Scie à métaux +Bricolage,Rainureuse +Bricolage,Scie à onglet électrique +Bricolage,Kit pose parquet +Bricolage,Ponceuse électrique +Bricolage,Sacs à gravat +Bricolage,Seaux pour évacuer des gravats ou terre +Bricolage,Echelle de couvreur +Bricolage,Escabeau +Bricolage,Décapeur thermique +Bricolage,Fer à souder +Bricolage,Scie sabre +Bricolage,Harnais de sécurité +Bricolage,Meuleuse +Bricolage,Longue mèche pour percer le béton +Cuisine,Appareil à raclette +Cuisine,Appareil à fondue +Cuisine,Couteau à huîtres +Cuisine,Pierrade +Cuisine,Bouilloire +Cuisine,Cafetière +Déménagement,Cartons +Déménagement,Film de protection +Maison,Paperboard +Maison,Projecteur +Maison,Déshumidificateur +Maison,Aspirateur à eau +Jardinage,Taille-haie +Jardinage,Tondeuse à gazon +Jardinage,Echelle +Jardinage,Brouette +Jardinage,Motobineuse électrique +Jardinage,Fourche +Jardinage,Rateau +Jardinage,Sécateur emmanché +Jardinage,Grand sécateur emmanché +Bricolage,Pistolet à colle +Maison,Machine à coudre +Jardinage,Tuyau d arrosage +Mobilité,Vélo homme +Mobilité,Vélo femme +Mobilité,Vélo enfant +Petite enfance,Réhausseur enfants pour voiture +Petite enfance,Lit pliant +Petite enfance,Chaise haute +Petite enfance,Poussette +Petite enfance,Maxi-cosi +Réception,Verrines +Réception,Tonnelle +Réception,Verres +Réception,Flûtes à champagne +Réception,Chaises +Réception,Boite isotherme +Réception,Blocs réfrigérants +Réception,Table +Voyage,Valise cabine +Voyage,Grande valise +Voyage,Sac à dos de randonnée +Voyage,Tente +Voyage,Sac de couchage +Voyage,Porte Vélo +Bricolage,Aspirateur à travaux +Maison,Verres à orangeade +Maison,Mutlicrêpes +Maison,Crépière +Services,Support informatique +Services,Plomberie +Services,Petites réparation +Services,Baby-sitting +Services,Soutien scolaire \ No newline at end of file diff --git a/object/scripts/script.py b/object/scripts/script.py new file mode 100644 index 0000000..d61a599 --- /dev/null +++ b/object/scripts/script.py @@ -0,0 +1,59 @@ +import os +import sys +import django +import csv + +# Configuration de l'environnement Django +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) # Répertoire du script +PROJECT_ROOT = os.path.abspath(os.path.join(SCRIPT_DIR, "../../..")) # Répertoire racine du projet +sys.path.append(PROJECT_ROOT) + +# Définir les paramètres Django +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "communityshare.settings") +django.setup() + +# Importer les modèles de votre application Django +from object.models import ObjectCategory, Object + +def create_objects_from_csv(file_name="data.csv"): + """ + Lit un fichier CSV et crée des instances de ObjectCategory et Object + en évitant les doublons pour les catégories et les objets. + """ + file_path = os.path.join(SCRIPT_DIR, file_name) # Construire le chemin complet du fichier CSV + + # Vérifier si le fichier existe + if not os.path.exists(file_path): + print(f"Erreur : Le fichier {file_name} est introuvable.") + return + + # Lire le fichier CSV et importer les données + with open(file_path, mode="r", encoding="utf-8") as csvfile: + reader = csv.reader(csvfile) + + # Ignorer la première ligne si elle contient des en-têtes + next(reader, None) + + for row in reader: + if len(row) < 2: + continue # Si la ligne est vide ou mal formatée, on l'ignore + + category_name, object_name = row[0].strip(), row[1].strip() + + # Créer ou récupérer la catégorie + category, created_category = ObjectCategory.objects.get_or_create(name=category_name) + if created_category: + print(f"Catégorie créée : {category.name}") + else: + print(f"Catégorie existante : {category.name}") + + # Créer ou récupérer l'objet associé à cette catégorie + obj, created_object = Object.objects.get_or_create(name=object_name, category=category) + if created_object: + print(f"Objet créé : {obj.name} dans la catégorie {category.name}") + else: + print(f"Objet existant : {obj.name} dans la catégorie {category.name}") + +# Exécuter la fonction +if __name__ == "__main__": + create_objects_from_csv("data.csv") \ No newline at end of file diff --git a/object/templates/object/modify_object.html b/object/templates/object/modify_object.html index 5ff0913..e3fdbfb 100644 --- a/object/templates/object/modify_object.html +++ b/object/templates/object/modify_object.html @@ -1,13 +1,14 @@ {% extends 'base.html' %} -{% block title %}Modifier un Objet{% endblock %} - {% block content %} -<h2>Modifier l'Objet</h2> -<form method="post"> + <h1>Modifier la description de l'objet : {{ user_object.object.name }}</h1> + + <form method="POST"> {% csrf_token %} - {{ form|crispy }} - <button type="submit">Modifier</button> -</form> -<a href="{% url 'object_list' %}">Retour à la liste</a> + <textarea name="description" rows="4" cols="50" placeholder="Entrez une description pour cet objet">{{ user_object.description }}</textarea> + <button type="submit">Enregistrer</button> + </form> + + <p><a href="{% url 'object_list' %}">Retour aux objets</a></p> {% endblock %} + diff --git a/object/templates/object/object_list.html b/object/templates/object/object_list.html index 7b510f9..6449548 100644 --- a/object/templates/object/object_list.html +++ b/object/templates/object/object_list.html @@ -6,40 +6,34 @@ <h2>Liste de mes objets ! </h2> <!-- Bouton Ajouter un objet --> -<div class="container-fluid"> -<a href="{% url 'add_object' %}" class="btn btn-success mb-3"> - Ajouter un objet +<a href="{% url 'select_user_objects' %}" class="btn btn-success mb-3"> + Ajouter des objets </a> <!-- Bouton Gérer mes sollicitations --> <a href="{% url 'borrow_request' %}" class="btn btn-success mb-3"> Gérer mes sollicitations </a> -</div> -<table border="1" class="table"> +<table border="1"> <thead> <tr> <th>Name</th> - <th>Description</th> <th>Catégorie</th> - <th>Actions</th> + <th>Description</th> </tr> </thead> <tbody> {% for obj in objects %} <tr> - <td> {% if obj.name %} - {{ obj.name }} - {% endif %} + <td> + {{ obj.object.name }} </td> <td> - <a href="{% url 'object_detail' obj.id %}">{{ obj.description }}</a> + {{obj.object.category.name}} </td> - <td>{{ obj.objectCategory.name }}</td> <td> - <a href="{% url 'modify_object' obj.id %}">Modifier</a> | - <a href="{% url 'delete_object' obj.id %}">Supprimer</a> + <a href="{% url 'modify_object' obj.id %}">Ajouter une description</a> | </td> @@ -50,5 +44,4 @@ </tbody> </table> - {% endblock %} diff --git a/object/templates/object/select_user_objects.html b/object/templates/object/select_user_objects.html new file mode 100644 index 0000000..4e4df06 --- /dev/null +++ b/object/templates/object/select_user_objects.html @@ -0,0 +1,16 @@ +{% extends 'base.html' %} + +{% load crispy_forms_tags %} + +{% block content %} + + <h1>Ajouter des objets que vous pouvez prêter</h1> + <form method="POST"> + {% csrf_token %} + {{ form|crispy}} + <button type="submit">Enregistrer la sélection</button> + </form> + +{% endblock content %} + + diff --git a/object/urls.py b/object/urls.py index 0b12c46..379dce8 100644 --- a/object/urls.py +++ b/object/urls.py @@ -3,8 +3,7 @@ from . import views urlpatterns = [ path('', views.object_list, name='object_list'), # Afficher tous les objets - path('add/', views.add_object, name='add_object'), # Ajouter un objet - path('<int:object_id>/', views.object_detail, name='object_detail'), # Détail d'un objet + path('add/', views.select_user_objects, name='select_user_objects'), # Ajouter un objet path('<int:object_id>/modify/', views.modify_object, name='modify_object'), # Modifier un objet - path('<int:object_id>/delete/', views.delete_object, name='delete_object'), # Supprimer un objet ] + diff --git a/object/views.py b/object/views.py index 6918672..85c0c12 100644 --- a/object/views.py +++ b/object/views.py @@ -1,7 +1,6 @@ - from django.shortcuts import render, redirect, get_object_or_404 -from .forms import ObjectForm -from .models import Object +from .forms import ObjectForm, UserObjectSelectForm +from .models import Object, UserObject, ObjectCategory, Selection from django.contrib.auth.decorators import login_required ''' @@ -23,58 +22,56 @@ Structure la page en : @login_required def object_list(request): '''Interface qui propose tous les objets que l'utilisateur peut prêter''' - objects = Object.objects.filter(id_lender=request.user) + objects = UserObject.objects.filter(id_lender=request.user) return render(request, 'object/object_list.html', {'objects': objects}) -@login_required -def object_detail(request, object_id): - '''' Affiche les caractériques de l'objet''' - obj = get_object_or_404(Object, id=object_id) - return render(request, 'object/object_detail.html', {'object': obj}) -@login_required -def add_object(request): - """ - Envoie un formulaire pour poster un objet dans une communauté. - """ - if request.method == 'POST': - form = ObjectForm(request.POST) - if form.is_valid(): - # Ne pas sauvegarder immédiatement - object = form.save(commit=False) - - # Associer l'objet à l'utilisateur connecté - object.id_lender = request.user - - # Sauvegarder l'objet - object.save() - - # Optionnel : Redirection vers la page de gestion de la communauté - return redirect('add_object') - else: - form = ObjectForm() - - return render(request, 'object/add_object.html', {'form': form}) + @login_required def modify_object(request, object_id): - ''' Envoie un formulaire pour modifier les objets''' - obj = get_object_or_404(Object, id=object_id, id_lender=request.user) - if request.method == 'POST': - form = ObjectForm(request.POST, instance=obj) - if form.is_valid(): - form.save() - return redirect('object_list') - else: - form = ObjectForm(instance=obj) - return render(request, 'object/modify_object.html', {'form': form}) + # Récupérer l'objet UserObject pour l'utilisateur connecté + user_object = get_object_or_404(UserObject, id_lender=request.user, id=object_id) -@login_required -def delete_object(request, object_id): - ''' Supprime un objet sélectionné''' - obj = get_object_or_404(Object, id=object_id, id_lender=request.user) if request.method == 'POST': - obj.delete() + # Récupère la description envoyée via POST + description = request.POST.get('description') + + # Met à jour la description de l'objet UserObject + if description: + user_object.description = description + user_object.save() + + # Redirige l'utilisateur vers la page de confirmation ou une autre page après la mise à jour return redirect('object_list') - return render(request, 'object/delete_object.html', {'object': obj}) + return render(request, 'modify_object.html', {'user_object': user_object}) + +@login_required +def select_user_objects(request): + # Récupérer les objets sélectionnés par l'utilisateur + selected_objects = Selection.objects.filter(user=request.user).values_list('object_id', flat=True) + print(selected_objects) + + # Pré-remplir le formulaire avec ces sélections + initial_data = {'objects': Object.objects.filter(id__in=selected_objects)} + form = UserObjectSelectForm(None, initial=initial_data) + + if request.method == "POST": + form = UserObjectSelectForm(request.POST, initial=initial_data) + if form.is_valid(): + # Supprimer les anciennes sélections de l'utilisateur + Selection.objects.filter(user=request.user).delete() + UserObject.objects.filter(id_lender=request.user).delete() + + # Ajouter les nouvelles sélections + selected_objects = form.cleaned_data['objects'] + for object in selected_objects: + Selection.objects.create(user=request.user, object=object) + UserObject.objects.create(object=object, id_lender=request.user,is_borrowed=False) + + return redirect('object_list') # Recharger la page + + return render(request, 'select_user_objects.html', { + 'form': form + }) -- GitLab From 60b0cd7d9fe6f37e29071672d1c74345a3dbaebc Mon Sep 17 00:00:00 2001 From: Godlewski Stanislas <stanislas.godlewski@student-cs.fr> Date: Thu, 21 Nov 2024 22:43:29 +0100 Subject: [PATCH 02/11] Version finale objets stan --- .../templates/object/select_user_objects.html | 57 +++++++++++++++++-- object/views.py | 26 ++++++++- 2 files changed, 74 insertions(+), 9 deletions(-) diff --git a/object/templates/object/select_user_objects.html b/object/templates/object/select_user_objects.html index 4e4df06..f8a8806 100644 --- a/object/templates/object/select_user_objects.html +++ b/object/templates/object/select_user_objects.html @@ -2,15 +2,60 @@ {% load crispy_forms_tags %} -{% block content %} - <h1>Ajouter des objets que vous pouvez prêter</h1> - <form method="POST"> +{%block content%} +<head> +<style> + table { + width: 100%; + border-collapse: separate; /* Permet d'utiliser border-spacing */ + border-spacing: 10px; /* Ajoute de l'espace entre les colonnes */ + } + th, td { + border: 1px solid black; + vertical-align: top; /* Aligne tout en haut des colonnes */ + padding: 5px; + } + td { + vertical-align: top; /* Assure que les checkbox commencent en haut */ + } + label { + display: block; /* Assure un affichage en ligne séparée pour chaque objet */ + margin-bottom: 3px; /* Ajoute un espace entre les checkbox */ + } +</style> +</head> +<h1>Prêter des Objets</h1> + <form method="post"> {% csrf_token %} - {{ form|crispy}} - <button type="submit">Enregistrer la sélection</button> + <table> + <thead> + <tr> + {% for category_data in categories_with_objects %} + <th>{{ category_data.category.name }}</th> + {% endfor %} + </tr> + </thead> + <tbody> + <tr> + {% for category_data in categories_with_objects %} + <td> + {% for obj in category_data.objects %} + <label> + <input type="checkbox" name="objects" value="{{ obj.id }}" {% if obj.is_selected %}checked{% endif %}> + {{ obj.name }} + </label><br> + {% empty %} + Aucun objet dans cette catégorie. + {% endfor %} + </td> + {% endfor %} + </tr> + </tbody> + </table> + <button type="submit">Mettre à jour</button> </form> +{%endblock content%} -{% endblock content %} diff --git a/object/views.py b/object/views.py index 85c0c12..14ba77f 100644 --- a/object/views.py +++ b/object/views.py @@ -49,6 +49,9 @@ def modify_object(request, object_id): @login_required def select_user_objects(request): + + categories = ObjectCategory.objects.all() + # Récupérer les objets sélectionnés par l'utilisateur selected_objects = Selection.objects.filter(user=request.user).values_list('object_id', flat=True) print(selected_objects) @@ -71,7 +74,24 @@ def select_user_objects(request): UserObject.objects.create(object=object, id_lender=request.user,is_borrowed=False) return redirect('object_list') # Recharger la page - - return render(request, 'select_user_objects.html', { - 'form': form + + + categories_with_objects = [ + { + "category": category, + "objects": [ + { + "id": obj.id, + "name": obj.name, + "is_selected": obj.id in selected_objects, + } + for obj in category.object_set.all() + ], + } + for category in categories + ] + form = UserObjectSelectForm(initial={'objects': selected_objects}) + return render(request, "object/select_user_objects.html", { + "categories_with_objects": categories_with_objects, + "form": form, }) -- GitLab From e1948739ece9366cbb00f8c1e1655a6359371023 Mon Sep 17 00:00:00 2001 From: Godlewski Stanislas <stanislas.godlewski@student-cs.fr> Date: Fri, 22 Nov 2024 08:47:34 +0100 Subject: [PATCH 03/11] Modification tests : coverage 81% --- Borrowing/tests.py | 23 ++++++++-------- object/tests.py | 65 +++++++++++++++++++++++++++------------------- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/Borrowing/tests.py b/Borrowing/tests.py index 44874ea..76acc89 100644 --- a/Borrowing/tests.py +++ b/Borrowing/tests.py @@ -1,7 +1,8 @@ from django.test import TestCase from django.urls import reverse from django.contrib.auth.models import User -from object.models import Object, ObjectCategory +from object.models import Object, ObjectCategory, UserObject +from object.scripts.script import create_objects_from_csv from Communities.models import Community, CommunityMembership from .models import BorrowRequest @@ -11,8 +12,6 @@ class BorrowingViewTests(TestCase): self.user = User.objects.create_user(username="testuser", password="password123") self.client.login(username="testuser", password="password123") - # Créer une catégorie d'objet - self.category = ObjectCategory.objects.create(name="Electronics") # Créer des objets pour les tests self.lender = User.objects.create_user(username="lender", password="password123") @@ -20,16 +19,18 @@ class BorrowingViewTests(TestCase): CommunityMembership.objects.create(user=self.user, community=self.community, role='member') CommunityMembership.objects.create(user=self.lender, community=self.community, role='admin') + + create_objects_from_csv() - self.object1 = Object.objects.create( - description="Laptop", - objectCategory=self.category, - id_lender=self.lender + self.object1 = UserObject.objects.create( + object=Object.objects.get(name="Bouilloire"), + id_lender=self.lender, + is_borrowed = False ) - self.object2 = Object.objects.create( - description="Tablet", - objectCategory=self.category, - id_lender=self.lender + self.object2 = UserObject.objects.create( + object=Object.objects.get(name="Cafetière"), + id_lender=self.lender, + is_borrowed = False ) def test_borrowing_page_loads(self): diff --git a/object/tests.py b/object/tests.py index ffccf47..6f4a705 100644 --- a/object/tests.py +++ b/object/tests.py @@ -1,27 +1,31 @@ from django.test import TestCase from django.urls import reverse from django.contrib.auth.models import User -from .models import Object, ObjectCategory +from .models import Object, ObjectCategory, UserObject, Selection +from .scripts.script import create_objects_from_csv class ObjectTests(TestCase): def setUp(self): # Créer un utilisateur de test self.user = User.objects.create_user(username='testuser', password='password') - # Créer une catégorie pour les objets - self.category = ObjectCategory.objects.create(name='Électronique') + create_objects_from_csv() + + self.category = ObjectCategory.objects.get(name="Jardinage") + self.obj_jardinage = Object.objects.get(name="Echelle") # Créer des objets de test - self.object1 = Object.objects.create( - description='Ordinateur', - objectCategory=self.category, - id_lender=self.user + self.object1 = UserObject.objects.create( + object=Object.objects.get(name="Cafetière"), + id_lender=self.user, + is_borrowed=False ) - self.object2 = Object.objects.create( - description='Smartphone', - objectCategory=self.category, - id_lender=self.user + self.object2 = UserObject.objects.create( + object=Object.objects.get(name="Bouilloire"), + id_lender=self.user, + is_borrowed=False ) + # Connecter l'utilisateur pour les tests nécessitant une authentification self.client.login(username='testuser', password='password') @@ -30,31 +34,38 @@ class ObjectTests(TestCase): """Tester si la liste des objets est correctement affichée.""" response = self.client.get(reverse('object_list')) self.assertEqual(response.status_code, 200) - self.assertContains(response, 'Ordinateur') - self.assertContains(response, 'Smartphone') + self.assertContains(response, 'Cafetière') + self.assertContains(response, 'Bouilloire') def test_add_object(self): + """Tester l'ajout d'un nouvel objet.""" - response = self.client.post(reverse('add_object'), { - 'description': 'Tablette', - 'objectCategory': self.category.id - }) - #self.assertEqual(response.status_code, 302) # Redirection après ajout Erreur !!!!!!! - #self.assertTrue(Object.objects.filter(description='Tablette').exists()) Erreur !!!!!!! + + self.url = reverse("select_user_objects") + # Données envoyées via le formulaire (sélectionne l'objet "Echelle") + data = { + "objects": [self.obj_jardinage.id], + } + + # Envoyer une requête POST pour sélectionner un objet + response = self.client.post(self.url, data) + + # Vérifier la redirection après soumission (assurez-vous que votre vue redirige comme attendu) + self.assertRedirects(response, '/object/') + # Vérifier que l'objet "Echelle" a été ajouté aux sélections + selection_exists = Selection.objects.filter( + user=self.user, + object=self.obj_jardinage + ).exists() + self.assertTrue(selection_exists, "L'objet 'Clé à molette' aurait dû être sélectionné.") def test_modify_object(self): """Tester la modification d'un objet existant.""" response = self.client.post(reverse('modify_object', args=[self.object1.id]), { - 'description': 'Ordinateur portable', - 'objectCategory': self.category.id + 'description': 'Il est très beau' }) #self.assertEqual(response.status_code, 302) # Redirection après modification Erreur !!!!!!! self.object1.refresh_from_db() - #self.assertEqual(self.object1.description, 'Ordinateur portable') Erreur !!!!!!! + self.assertEqual(self.object1.description, 'Il est très beau') - def test_delete_object(self): - """Tester la suppression d'un objet existant.""" - response = self.client.post(reverse('delete_object', args=[self.object2.id])) - #self.assertEqual(response.status_code, 302) # Redirection après suppression Erreur !!!!!!! - self.assertFalse(Object.objects.filter(id=self.object2.id).exists()) -- GitLab From 0fdbf5878f2e7dae5759cca3de49832ab078457a Mon Sep 17 00:00:00 2001 From: Godlewski Stanislas <stanislas.godlewski@student-cs.fr> Date: Fri, 22 Nov 2024 08:59:16 +0100 Subject: [PATCH 04/11] Correctif commentaires --- object/tests.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/object/tests.py b/object/tests.py index 6f4a705..7de1be1 100644 --- a/object/tests.py +++ b/object/tests.py @@ -50,7 +50,7 @@ class ObjectTests(TestCase): # Envoyer une requête POST pour sélectionner un objet response = self.client.post(self.url, data) - # Vérifier la redirection après soumission (assurez-vous que votre vue redirige comme attendu) + # Vérifier la redirection après soumission self.assertRedirects(response, '/object/') # Vérifier que l'objet "Echelle" a été ajouté aux sélections selection_exists = Selection.objects.filter( @@ -64,7 +64,6 @@ class ObjectTests(TestCase): response = self.client.post(reverse('modify_object', args=[self.object1.id]), { 'description': 'Il est très beau' }) - #self.assertEqual(response.status_code, 302) # Redirection après modification Erreur !!!!!!! self.object1.refresh_from_db() self.assertEqual(self.object1.description, 'Il est très beau') -- GitLab From c350b746da2b37bc259795681ba12bb48a539d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me?= <come.lacouxfauvet@student-cs.fr> Date: Fri, 22 Nov 2024 09:57:25 +0100 Subject: [PATCH 05/11] Style version de Stan --- object/templates/object/object_list.html | 2 +- object/templates/object/select_user_objects.html | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/object/templates/object/object_list.html b/object/templates/object/object_list.html index 6449548..42ffec8 100644 --- a/object/templates/object/object_list.html +++ b/object/templates/object/object_list.html @@ -15,7 +15,7 @@ Gérer mes sollicitations </a> -<table border="1"> +<table border="1" class="table"> <thead> <tr> <th>Name</th> diff --git a/object/templates/object/select_user_objects.html b/object/templates/object/select_user_objects.html index f8a8806..2909f75 100644 --- a/object/templates/object/select_user_objects.html +++ b/object/templates/object/select_user_objects.html @@ -11,11 +11,6 @@ border-collapse: separate; /* Permet d'utiliser border-spacing */ border-spacing: 10px; /* Ajoute de l'espace entre les colonnes */ } - th, td { - border: 1px solid black; - vertical-align: top; /* Aligne tout en haut des colonnes */ - padding: 5px; - } td { vertical-align: top; /* Assure que les checkbox commencent en haut */ } @@ -23,16 +18,17 @@ display: block; /* Assure un affichage en ligne séparée pour chaque objet */ margin-bottom: 3px; /* Ajoute un espace entre les checkbox */ } + </style> </head> <h1>Prêter des Objets</h1> <form method="post"> {% csrf_token %} - <table> + <table class="table" border="1"> <thead> <tr> {% for category_data in categories_with_objects %} - <th>{{ category_data.category.name }}</th> + <th scope="col">{{ category_data.category.name }}</th> {% endfor %} </tr> </thead> @@ -53,7 +49,7 @@ </tr> </tbody> </table> - <button type="submit">Mettre à jour</button> + <button class="btn btn-success mb-3" type="submit">Mettre à jour</button> </form> {%endblock content%} -- GitLab From 6acf7f667c60b2dd0f145e7dca14b0fcf0a36513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me?= <come.lacouxfauvet@student-cs.fr> Date: Fri, 22 Nov 2024 09:59:40 +0100 Subject: [PATCH 06/11] Dernier commit --- Borrowing/templates/index.html | 1 - Communities/models.py | 3 --- 2 files changed, 4 deletions(-) diff --git a/Borrowing/templates/index.html b/Borrowing/templates/index.html index ee875b8..bfe9d9e 100644 --- a/Borrowing/templates/index.html +++ b/Borrowing/templates/index.html @@ -29,7 +29,6 @@ <h1 class="display-3 fw-bolder mb-5"><span class="gradient-text d-inline">Le site de prêt entre voisins</span></h1> <div class="d-grid gap-3 d-sm-flex justify-content-sm-center justify-content-xxl-start mb-3"> <a class="btn btn-primary btn-lg px-5 py-3 me-sm-3 fs-6 fw-bolder" href="/community/">Trouver la communauté la plus proche</a> - <a class="btn btn-outline-dark btn-lg px-5 py-3 fs-6 fw-bolder" href="/avenir/">Avenir</a> </div> </div> </div> diff --git a/Communities/models.py b/Communities/models.py index 853faf0..de9ce7d 100644 --- a/Communities/models.py +++ b/Communities/models.py @@ -22,9 +22,6 @@ class Community(models.Model): ''' Retourne tous les objets prêtés par des membres de cette communauté. ''' - # Utiliser une requête différée pour récupérer les membres de la communauté - from .models import CommunityMembership, UserObject - # Obtenir les utilisateurs membres de la communauté member_ids = CommunityMembership.objects.filter(community=self).values_list('user_id', flat=True) -- GitLab From 178b1833849985d67fda93d20152aee2d9217c93 Mon Sep 17 00:00:00 2001 From: Godlewski Stanislas <stanislas.godlewski@student-cs.fr> Date: Thu, 21 Nov 2024 18:13:31 +0100 Subject: [PATCH 07/11] Version fonctionnelle objets --- object/templates/object/object_list.html | 2 +- object/views.py | 47 ++++++++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) diff --git a/object/templates/object/object_list.html b/object/templates/object/object_list.html index 42ffec8..6449548 100644 --- a/object/templates/object/object_list.html +++ b/object/templates/object/object_list.html @@ -15,7 +15,7 @@ Gérer mes sollicitations </a> -<table border="1" class="table"> +<table border="1"> <thead> <tr> <th>Name</th> diff --git a/object/views.py b/object/views.py index 14ba77f..f6b76d0 100644 --- a/object/views.py +++ b/object/views.py @@ -1,6 +1,8 @@ from django.shortcuts import render, redirect, get_object_or_404 from .forms import ObjectForm, UserObjectSelectForm from .models import Object, UserObject, ObjectCategory, Selection +from .forms import ObjectForm, UserObjectSelectForm +from .models import Object, UserObject, ObjectCategory, Selection from django.contrib.auth.decorators import login_required ''' @@ -23,16 +25,22 @@ Structure la page en : def object_list(request): '''Interface qui propose tous les objets que l'utilisateur peut prêter''' objects = UserObject.objects.filter(id_lender=request.user) + objects = UserObject.objects.filter(id_lender=request.user) return render(request, 'object/object_list.html', {'objects': objects}) + + @login_required def modify_object(request, object_id): # Récupérer l'objet UserObject pour l'utilisateur connecté user_object = get_object_or_404(UserObject, id_lender=request.user, id=object_id) + # Récupérer l'objet UserObject pour l'utilisateur connecté + user_object = get_object_or_404(UserObject, id_lender=request.user, id=object_id) + if request.method == 'POST': # Récupère la description envoyée via POST description = request.POST.get('description') @@ -45,9 +53,48 @@ def modify_object(request, object_id): # Redirige l'utilisateur vers la page de confirmation ou une autre page après la mise à jour return redirect('object_list') + return render(request, 'modify_object.html', {'user_object': user_object}) + # Récupère la description envoyée via POST + description = request.POST.get('description') + + # Met à jour la description de l'objet UserObject + if description: + user_object.description = description + user_object.save() + + # Redirige l'utilisateur vers la page de confirmation ou une autre page après la mise à jour + return redirect('object_list') + return render(request, 'modify_object.html', {'user_object': user_object}) @login_required +def select_user_objects(request): + # Récupérer les objets sélectionnés par l'utilisateur + selected_objects = Selection.objects.filter(user=request.user).values_list('object_id', flat=True) + print(selected_objects) + + # Pré-remplir le formulaire avec ces sélections + initial_data = {'objects': Object.objects.filter(id__in=selected_objects)} + form = UserObjectSelectForm(None, initial=initial_data) + + if request.method == "POST": + form = UserObjectSelectForm(request.POST, initial=initial_data) + if form.is_valid(): + # Supprimer les anciennes sélections de l'utilisateur + Selection.objects.filter(user=request.user).delete() + UserObject.objects.filter(id_lender=request.user).delete() + + # Ajouter les nouvelles sélections + selected_objects = form.cleaned_data['objects'] + for object in selected_objects: + Selection.objects.create(user=request.user, object=object) + UserObject.objects.create(object=object, id_lender=request.user,is_borrowed=False) + + return redirect('object_list') # Recharger la page + + return render(request, 'select_user_objects.html', { + 'form': form + }) def select_user_objects(request): categories = ObjectCategory.objects.all() -- GitLab From 0dc3e94d406afcf38fd60f771470215756c6e9cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me?= <come.lacouxfauvet@student-cs.fr> Date: Fri, 22 Nov 2024 10:09:05 +0100 Subject: [PATCH 08/11] le vrai dernier commit --- object/templates/object/object_list.html | 4 ++-- object/views.py | 11 ----------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/object/templates/object/object_list.html b/object/templates/object/object_list.html index 6449548..abd8047 100644 --- a/object/templates/object/object_list.html +++ b/object/templates/object/object_list.html @@ -15,7 +15,7 @@ Gérer mes sollicitations </a> -<table border="1"> +<table border="1" class="table"> <thead> <tr> <th>Name</th> @@ -33,7 +33,7 @@ {{obj.object.category.name}} </td> <td> - <a href="{% url 'modify_object' obj.id %}">Ajouter une description</a> | + <a href="{% url 'modify_object' obj.id %}">Ajouter une description</a> </td> diff --git a/object/views.py b/object/views.py index f6b76d0..4a5ef19 100644 --- a/object/views.py +++ b/object/views.py @@ -54,18 +54,7 @@ def modify_object(request, object_id): return redirect('object_list') return render(request, 'modify_object.html', {'user_object': user_object}) - # Récupère la description envoyée via POST - description = request.POST.get('description') - # Met à jour la description de l'objet UserObject - if description: - user_object.description = description - user_object.save() - - # Redirige l'utilisateur vers la page de confirmation ou une autre page après la mise à jour - return redirect('object_list') - - return render(request, 'modify_object.html', {'user_object': user_object}) @login_required def select_user_objects(request): -- GitLab From 6cc18ca12dd113d30dccb018518084eebe24e3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me?= <come.lacouxfauvet@student-cs.fr> Date: Fri, 22 Nov 2024 10:10:41 +0100 Subject: [PATCH 09/11] le vrai dernier commit2 --- object/templates/object/modify_object.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/object/templates/object/modify_object.html b/object/templates/object/modify_object.html index e3fdbfb..2a88eb6 100644 --- a/object/templates/object/modify_object.html +++ b/object/templates/object/modify_object.html @@ -6,7 +6,7 @@ <form method="POST"> {% csrf_token %} <textarea name="description" rows="4" cols="50" placeholder="Entrez une description pour cet objet">{{ user_object.description }}</textarea> - <button type="submit">Enregistrer</button> + <button type="submit" class="btn btn-success">Enregistrer</button> </form> <p><a href="{% url 'object_list' %}">Retour aux objets</a></p> -- GitLab From 42f18a16483df49151cbf0f9a7395b8fc9cfd9b7 Mon Sep 17 00:00:00 2001 From: Van Hecke Adiel <adiel.van-hecke@student-cs.fr> Date: Fri, 22 Nov 2024 10:08:20 +0100 Subject: [PATCH 10/11] My request's button --- Borrowing/templates/Borrowing/borrowing.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Borrowing/templates/Borrowing/borrowing.html b/Borrowing/templates/Borrowing/borrowing.html index fdb7e16..cf3ed62 100644 --- a/Borrowing/templates/Borrowing/borrowing.html +++ b/Borrowing/templates/Borrowing/borrowing.html @@ -18,4 +18,8 @@ </ul> <p>{{message}}</p> + <!-- Bouton Gérer mes demandes --> + <a href="{% url 'my_requests' %}" class="btn btn-success mb-3"> + Mes demandes + </a> {% endblock content %} \ No newline at end of file -- GitLab From 70369ab8b1babb829e802882978a20a67f0e53b2 Mon Sep 17 00:00:00 2001 From: Van Hecke Adiel <adiel.van-hecke@student-cs.fr> Date: Fri, 22 Nov 2024 10:50:31 +0100 Subject: [PATCH 11/11] lastBug --- Borrowing/templates/Borrowing/borrowing.html | 2 ++ Communities/templates/Communities/list_objects_community.html | 2 +- object/templates/object/modify_object.html | 2 +- object/templates/object/object_detail.html | 2 +- user/forms.py | 4 ++-- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Borrowing/templates/Borrowing/borrowing.html b/Borrowing/templates/Borrowing/borrowing.html index cf3ed62..094bc3a 100644 --- a/Borrowing/templates/Borrowing/borrowing.html +++ b/Borrowing/templates/Borrowing/borrowing.html @@ -6,6 +6,7 @@ <h1>Faire une demande</h1> <ul> {% for object in objects%} + {% if object.id_lender.id != user.id %} {% if object in filtered_objects%} <form method = "POST"> {% csrf_token %} @@ -14,6 +15,7 @@ {% else %} <li>{{object.object.name}} à {{object.id_lender.first_name}} {{object.id_lender.last_name}}: <button class="btn btn-danger" value = {{object.id}} name = "item" id = "item" disabled> Déjà demandé ! </button></li> {% endif %} + {% endif%} {% endfor %} </ul> diff --git a/Communities/templates/Communities/list_objects_community.html b/Communities/templates/Communities/list_objects_community.html index ca8025d..a5087e1 100644 --- a/Communities/templates/Communities/list_objects_community.html +++ b/Communities/templates/Communities/list_objects_community.html @@ -26,7 +26,7 @@ {% for obj in objects %} <tr> <td>{{ obj.object.name }}</td> - <td>{{ obj.description }}</td> + <td>{% if obj.description != None %}{{ obj.description }}{% endif%}</td> <td>{{ obj.object.category.name }}</td> <td>{{ obj.id_lender.username }}</td> diff --git a/object/templates/object/modify_object.html b/object/templates/object/modify_object.html index 2a88eb6..c5cbb68 100644 --- a/object/templates/object/modify_object.html +++ b/object/templates/object/modify_object.html @@ -5,7 +5,7 @@ <form method="POST"> {% csrf_token %} - <textarea name="description" rows="4" cols="50" placeholder="Entrez une description pour cet objet">{{ user_object.description }}</textarea> + <textarea name="description" rows="4" cols="50" placeholder="Entrez une description pour cet objet">{% if user_object.description != None %}{{ user_object.description }}{% endif %}</textarea> <button type="submit" class="btn btn-success">Enregistrer</button> </form> diff --git a/object/templates/object/object_detail.html b/object/templates/object/object_detail.html index e25918a..9ae6e37 100644 --- a/object/templates/object/object_detail.html +++ b/object/templates/object/object_detail.html @@ -6,7 +6,7 @@ <h2>Détails de l'Objet</h2> <ul> - <li><strong>Description :</strong> {{ object.description }}</li> + <li><strong>Description :</strong> {% if object.description != None %}{{ object.description }}{% endif %}</li> <li><strong>Catégorie :</strong> {{ object.objectCategory.name }}</li> </ul> diff --git a/user/forms.py b/user/forms.py index d0bdefd..fa29bf9 100644 --- a/user/forms.py +++ b/user/forms.py @@ -23,5 +23,5 @@ class User_modify(forms.Form): first_name = forms.CharField(label="first_name", max_length=100) last_name = forms.CharField(label="last_name", max_length=100) email = forms.CharField(label="email", max_length=100) - phone = forms.CharField(label="phone",max_length=15) - address = forms.CharField(label="address") \ No newline at end of file + phone = forms.CharField(label="phone",max_length=15, required = False) + address = forms.CharField(label="address", required = False) \ No newline at end of file -- GitLab