Implement edit and delete

This commit is contained in:
Jannis Portmann 2023-03-31 18:10:38 +02:00
parent 805c3b645e
commit ca9a91c864
4 changed files with 66 additions and 21 deletions

View file

@ -1,6 +1,8 @@
from django.db import models from django.db import models
from django.dispatch import receiver
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils import timezone from django.utils import timezone
from django.core.files.storage import default_storage
class Offer(models.Model): class Offer(models.Model):
@ -16,3 +18,22 @@ class Wish(models.Model):
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)
user = models.ForeignKey(User, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=200) title = models.CharField(max_length=200)
@receiver(models.signals.post_delete, sender=Offer)
def auto_delete_image_on_delete(sender, instance, **kwargs):
"""
Deletes image from filesystem when corresponding `Offer` object is deleted.
"""
if instance.image and os.path.isfile(instance.image.path):
default_storage.delete(instance.image.path)
@receiver(models.signals.pre_save, sender=Offer)
def delete_old_image(sender, instance, **kwargs):
try:
old_image = sender.objects.get(pk=instance.pk).image
except sender.doesNotExist:
return False
default_storage.delete(old_image.path)

View file

@ -38,34 +38,35 @@
</div> </div>
</div> </div>
{% if offer.user == user %} {% if offer.user == user %}
<a href="{% url 'offer_edit' offer.id %}" class="btn btn-info mb-3"><i class="fas fa-pen"></i></a> <a href="{% url 'offer_edit' offer.id %}" class="btn btn-info"><i class="fas fa-pen"></i></a>
<!-- Button trigger modal -->
<button type="button" <button type="button"
class="btn btn-danger mb-3" class="btn btn-danger"
data-toggle="modal" data-bs-toggle="modal"
data-target="#exampleModal"> data-bs-target="#exampleModal">
<i class="fas fa-trash-alt"></i> <i class="fas fa-trash-alt"></i>
</button> </button>
<!-- Modal --> <!-- Modal -->
<div class="modal fade" <div class="modal fade"
id="exampleModal" id="exampleModal"
tabindex="-1" tabindex="-1"
role="dialog"
aria-labelledby="exampleModalLabel" aria-labelledby="exampleModalLabel"
aria-hidden="true"> aria-hidden="true">
<div class="modal-dialog" role="document"> <div class="modal-dialog">
<div class="modal-content"> <div class="modal-content">
<div class="modal-header"> <div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Warning</h5> <h1 class="modal-title fs-5" id="exampleModalLabel">Delete offer</h1>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"> <button type="button"
<span aria-hidden="true">&times;</span> class="btn-close"
</button> data-bs-dismiss="modal"
aria-label="Close"></button>
</div> </div>
<div class="modal-body">Are you sure you want to delete this offer?</div> <div class="modal-body">Do you really want to delete this offer? This can't be undone.</div>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<a type="button" <a href="{% url 'offer_delete' offer.id %}"
class="btn btn-danger" type="button"
href="{% url 'offer_delete' offer.id %}">Delete</a> class="btn btn-danger">Delete</a>
</div> </div>
</div> </div>
</div> </div>

View file

@ -10,8 +10,8 @@ urlpatterns = [
path("offers/", views.list_offers, name="list_offers"), path("offers/", views.list_offers, name="list_offers"),
path("offer/create/", views.create_offer, name="create_offer"), path("offer/create/", views.create_offer, name="create_offer"),
path("offer/<int:offer_id>/", views.offer_detail, name="offer_detail"), path("offer/<int:offer_id>/", views.offer_detail, name="offer_detail"),
path("offer/<int:offer_id>/delete", views.offer_delete, name="offer_delete"), path("offer/<int:offer_id>/delete/", views.offer_delete, name="offer_delete"),
path("offer/<int:offer_id>/edit", views.offer_edit, name="offer_edit"), path("offer/<int:offer_id>/edit/", views.offer_edit, name="offer_edit"),
path("offer/<int:offer_id>/trade", views.offer_trade, name="offer_trade"), path("offer/<int:offer_id>/trade", views.offer_trade, name="offer_trade"),
path('accounts/login/', auth_views.LoginView.as_view(template_name='registration/login.html')), path('accounts/login/', auth_views.LoginView.as_view(template_name='registration/login.html')),
path('accounts/profile/', auth_views.LoginView.as_view(template_name='user/detail.html')), path('accounts/profile/', auth_views.LoginView.as_view(template_name='user/detail.html')),

View file

@ -2,6 +2,7 @@ from django.shortcuts import render, get_object_or_404, redirect
from django.utils import timezone from django.utils import timezone
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.http import HttpResponseForbidden
from .forms import CreateOfferForm from .forms import CreateOfferForm
from .models import Offer, Wish from .models import Offer, Wish
@ -43,14 +44,36 @@ def offer_detail(request, offer_id):
return render(request, "offer/detail.html", {"offer": offer, "wishes": ["Monstera", "Tradescantia"]}) return render(request, "offer/detail.html", {"offer": offer, "wishes": ["Monstera", "Tradescantia"]})
@ login_required @login_required
def offer_delete(request, offer_id): def offer_delete(request, offer_id):
return 0 offer = get_object_or_404(Offer, id=offer_id)
if offer.user != request.user:
return HttpResponseForbidden()
offer.delete()
messages.success(request, "Offer deleted successfully!")
return redirect("list_offers")
@ login_required @login_required
def offer_edit(request, offer_id): def offer_edit(request, offer_id):
return 0 offer = get_object_or_404(Offer, id=offer_id)
if offer.user != request.user:
return HttpResponseForbidden()
if request.method == "POST":
form = CreateOfferForm(request.POST, request.FILES, instance=offer)
if form.is_valid():
offer = form.save(commit=False)
offer.image.name = generate_unique_filename(form.cleaned_data['image'].name)
offer.user = request.user
offer.save()
messages.success(request, "Offer updated successfully!")
return redirect("offer_detail", offer.id)
else:
form = CreateOfferForm(instance=offer)
return render(request, "basic_form.html", {"form": form, "button_label": "Update"})
@ login_required @ login_required