CRUD tickets ok, before migration update models

This commit is contained in:
yann 2025-04-25 14:51:34 +02:00
parent f74751e7e4
commit 5ac3817aed
20 changed files with 236 additions and 74 deletions

View File

@ -133,9 +133,9 @@ LOGOUT_REDIRECT_URL = 'login'
AUTH_USER_MODEL = 'authentication.User' AUTH_USER_MODEL = 'authentication.User'
MEDIA_URL = 'media/' MEDIA_URL = 'media/uploads/'
MEDIA_ROOT = BASE_DIR.joinpath(MEDIA_URL) MEDIA_ROOT = BASE_DIR.joinpath('media/uploads/')

View File

@ -40,6 +40,13 @@ urlpatterns = [
path('subscribed/', reviews.views.subscribed, name='subscribed'), path('subscribed/', reviews.views.subscribed, name='subscribed'),
path('ticket/add/', reviews.views.create_ticket, name='ticket-add'), path('ticket/add/', reviews.views.create_ticket, name='ticket-add'),
path('review/add/', reviews.views.create_review, name='review-add'), path('review/add/', reviews.views.create_review, name='review-add'),
path('ticket/<int:ticket_id>/', reviews.views.ticket, name='ticket-detail'),
path('ticket/<int:ticket_id>/update/', reviews.views.update_ticket, name='ticket-update'),
path('ticket/<int:ticket_id>/delete/', reviews.views.delete_ticket, name='ticket-delete'),
path('review/<int:review_id>/', reviews.views.review, name='review-detail'),
path('review/<int:review_id>/update/', reviews.views.update_review, name='review-update'),
path('review/<int:review_id>/delete/', reviews.views.delete_review, name='review-delete'),
path('confirm/', reviews.views.delete_confirm, name='delete-confirm'),
] ]
if settings.DEBUG: if settings.DEBUG:

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 305 KiB

View File

@ -6,3 +6,12 @@ class TicketForm(forms.ModelForm):
class Meta: class Meta:
model = models.Ticket model = models.Ticket
fields = ['title', 'body', 'image'] fields = ['title', 'body', 'image']
class ReviewForm(forms.ModelForm):
CHOICES = [0, 1, 2, 3, 4, 5]
rating = forms.ChoiceField(widget=forms.RadioSelect, choices=CHOICES)
class Meta:
model = models.Review
fields = ['headline', 'body']

View File

@ -20,8 +20,8 @@ class Review(models.Model):
rating = models.PositiveSmallIntegerField( rating = models.PositiveSmallIntegerField(
# validates that rating must be between 0 and 5 # validates that rating must be between 0 and 5
validators=[MinValueValidator(0), MaxValueValidator(5)]) validators=[MinValueValidator(0), MaxValueValidator(5)])
headline = models.CharField(max_length=128) headline = models.CharField("titre", max_length=128)
body = models.CharField(max_length=8192, blank=True) body = models.CharField("description", max_length=8192, blank=True)
user = models.ForeignKey( user = models.ForeignKey(
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE) to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
time_created = models.DateTimeField(auto_now_add=True) time_created = models.DateTimeField(auto_now_add=True)
@ -30,10 +30,10 @@ class Review(models.Model):
class UserFollows(models.Model): class UserFollows(models.Model):
# Your UserFollows model definition goes here # Your UserFollows model definition goes here
user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE) user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
followed_user = models.ForeignKey(to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
class Meta: class Meta:
# ensures we don't get multiple UserFollows instances # ensures we don't get multiple UserFollows instances
# for unique user-user_followed pairs # for unique user-user_followed pairs
pass unique_together = ('user', 'followed_user', )
#unique_together = ('user', 'followed_user', )

View File

@ -1,29 +0,0 @@
{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row d-flex justify-content-center">
<div class="col-md-auto form-group mt-5">
<h2> Créer un ticket </h2>
</div>
</div>
<div class="row d-flex justify-content-center mt-5">
<div class="col-md-auto form-group justify-content-center">
<form method='post' enctype='multipart/form-data'>
{% csrf_token %}
<label for='title'> Titre: </label>
<div class="d-flex justify-content-center mb-4">{{ ticket_form.title }}</div>
<label for='body'>Description: </label>
<div class="d-flex justify-content-center mb-4">{{ ticket_form.body }}</div>
<label for='image'>Image: </label>
<div class="d-flex justify-content-center mb-4">{{ ticket_form.image }}</div>
<div class="d-flex justify-content-end">
<button type='submit' class='btn btn-primary ml-auto'> Envoyer</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,9 @@
{% extends 'base.html' %}
{% block content %}
<div class="d-flex align-items-center justify-content-center">
<p> Suppression effectuée </p>
</div>
{% endblock %}

View File

@ -3,11 +3,11 @@
{% block content %} {% block content %}
<div class="container"> <div class="container">
<div class="row"> <div class="row">
<div class="d-flex justify-content-center my-5"> <div class="d-flex justify-content-center mt-5">
<h2> Bienvenue {{ request.user }}</h2> <h2> Bienvenue {{ request.user }}</h2>
</div> </div>
</div> </div>
<div class="row d-flex justify-content-center mt-5"> <div class="row d-flex justify-content-center mt-4 mb-3">
<div class="col-3 d-flex justify-content-center"> <div class="col-3 d-flex justify-content-center">
<a href="{% url 'ticket-add' %}" type="button" class="btn btn-primary">Demander une critique</a> <a href="{% url 'ticket-add' %}" type="button" class="btn btn-primary">Demander une critique</a>
</div> </div>
@ -15,6 +15,12 @@
<a href="{% url 'review-add' %}" type="button" class="btn btn-primary">Créer une critique</a> <a href="{% url 'review-add' %}" type="button" class="btn btn-primary">Créer une critique</a>
</div> </div>
</div> </div>
<div class="row">
{% for ticket in tickets %}
{% include 'reviews/ticket_detail.html' %}
{% endfor %}
</div>
</div> </div>
{% endblock %} {% endblock %}

View File

@ -0,0 +1,13 @@
<form method='post' enctype='multipart/form-data'>
{% csrf_token %}
<label for='headline'> Titre: </label>
<div class="d-flex justify-content-center mb-4">{{ review_form.headline }}</div>
<label for='rating'>Note: </label>
<div class="d-flex justify-content-center mb-4">{{ review_form.rating }}</div>
<label for='body'>Description: </label>
<div class="d-flex justify-content-center mb-4">{{ review_form.body }}</div>
<div class="d-flex justify-content-end">
<button type='submit' class='btn btn-primary ml-auto'> Envoyer</button>
</div>
</form>

View File

@ -0,0 +1,7 @@
{% extends 'base.html' %}
{% block content %}
{% include 'reviews/ticket_detail.html' %}
{% endblock %}

View File

@ -0,0 +1,16 @@
{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row d-flex justify-content-center">
<div class="col-md-auto form-group mt-5">
<h2> Créer un ticket </h2>
</div>
</div>
<div class="d-flex justify-content-center mt-5">
{% include 'reviews/ticket_form.html' %}
</div>
</div>
{% endblock %}

View File

@ -0,0 +1,12 @@
{% extends 'base.html' %}
{% block content %}
<div class="d-flex justify-content-center align-self-center">
<form method="post">
{% csrf_token %}
<p> Êtes vous sûr de vouloir supprimer {{ ticket.title }} ? </p>
<button type="submit" class="btn btn-warning">Supprimer</button>
</form>
{% endblock %}

View File

@ -0,0 +1,28 @@
<div class="row border border-2 border-secondary-subtle my-3">
<div class="col-8">
{% if request.user == ticket.user %}
vous avez demandé une critique
{% else %}
{{ ticket.user }} a demandé une critique
{% endif %}
</div>
<div class="col-4 d-flex justify-content-end">
{{ ticket.time_created }}
</div>
<p> {{ ticket.title }} </p>
<p> {{ ticket.body }} </p>
<div class="col-3 mb-2">
<img src="{{ ticket.image.url }}" class="img" style="width: 200px; height: auto" alt="Couverture de {{ ticket.title }}">
</div>
<div class="col-4 d-flex justify-content-end mb-2">
{% if request.user == ticket.user %}
<div class="col-3 align-self-end">
<a href="{% url 'ticket-update' ticket.id %}" type="button" class="btn btn-primary">Modifier</a>
</div>
<div class="col-3 align-self-end">
<a href="{% url 'ticket-delete' ticket.id %}" type="button" class="btn btn-danger">Supprimer</a>
</div>
{% endif %}
</div>
</div>

View File

@ -0,0 +1,13 @@
<form method='post' enctype='multipart/form-data'>
{% csrf_token %}
<label for='title'> Titre: </label>
<div class="d-flex justify-content-center mb-4">{{ ticket_form.title }}</div>
<label for='body'>Description: </label>
<div class="d-flex justify-content-center mb-4">{{ ticket_form.body }}</div>
<label for='image'>Image: </label>
<div class="d-flex justify-content-center mb-4">{{ ticket_form.image }}</div>
<div class="d-flex justify-content-end">
<button type='submit' class='btn btn-primary ml-auto'> Envoyer</button>
</div>
</form>

View File

@ -0,0 +1,16 @@
{% extends 'base.html' %}
{% block content %}
<div class="container">
<div class="row d-flex align-items-center">
<h2> Modifier la demande {{ ticket.title }}</h2>
</div>
<div class="row">
{% include 'reviews/ticket_form.html' %}
</div>
</div>
{% endblock %}

View File

@ -1,21 +1,35 @@
from django.shortcuts import render, redirect from django.shortcuts import render, redirect
from django.contrib.auth.decorators import login_required
from reviews.models import Ticket from reviews.models import Ticket
from reviews.forms import TicketForm from reviews.forms import TicketForm
@login_required
def home(request): def home(request):
return render(request, 'reviews/home.html') tickets = Ticket.objects.all()
return render(request, 'reviews/home.html', {'tickets': tickets})
@login_required
def flux(request): def flux(request):
return render(request, 'reviews/flux.html') return render(request, 'reviews/flux.html')
@login_required
def posts(request): def posts(request):
return render(request, 'reviews/posts.html') return render(request, 'reviews/posts.html')
@login_required
def subscribed(request): def subscribed(request):
return render(request, 'reviews/subscribed.html') return render(request, 'reviews/subscribed.html')
@login_required
def ticket(request, ticket_id):
ticket = Ticket.objects.get(id=ticket_id)
return render(request,
'reviews/ticket.html',
{'ticket': ticket})
@login_required
def create_ticket(request): def create_ticket(request):
tickets = Ticket.objects.all()
ticket_form = TicketForm() ticket_form = TicketForm()
if request.method == 'POST': if request.method == 'POST':
ticket_form = TicketForm(request.POST, request.FILES) ticket_form = TicketForm(request.POST, request.FILES)
@ -23,17 +37,55 @@ def create_ticket(request):
ticket = ticket_form.save(commit=False) ticket = ticket_form.save(commit=False)
ticket.user = request.user ticket.user = request.user
ticket.save() ticket.save()
return redirect('home')
return render(request,
'reviews/ticket_create.html',
context = {'ticket_form': ticket_form, 'tickets': tickets})
@login_required
def update_ticket(request, ticket_id):
ticket = Ticket.objects.get(id=ticket_id)
if request.method == 'POST':
ticket_form = TicketForm(request.POST, instance=ticket)
if ticket_form.is_valid():
ticket = ticket_form.save()
return redirect('home')
else:
ticket_form = TicketForm(instance=ticket)
return render(request, return render(request,
'reviews/create_ticket.html', 'reviews/ticket_update.html',
context = {'ticket_form': ticket_form}) {'ticket_form': ticket_form})
@login_required
def delete_ticket(request, ticket_id):
ticket = Ticket.objects.get(id=ticket_id)
if request.method == 'POST':
ticket.delete()
return redirect('home')
return render(request,
'reviews/ticket_delete.html',
{'ticket': ticket})
def review(request):
pass
def create_review(request): def create_review(request):
pass pass
def update_review(request):
pass
def delete_review(request):
pass
def follow_user(request): def follow_user(request):
pass pass
def unfollow_user(request): def unfollow_user(request):
pass pass
def delete_confirm(request, truc_id):
render (request,
'reviews/delete_confirm.html')

View File

@ -1,3 +1,4 @@
<!DOCTYPE html>
<html lang="fr"> <html lang="fr">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
@ -14,29 +15,13 @@
<div class="col d-flex justify-content-center"> <div class="col d-flex justify-content-center">
<h1> LITReview </h1> <h1> LITReview </h1>
</div> </div>
{% if user.is_authenticated %} {% include 'nav.html' %}
<ul class="navbar-nav">
<li class="nav-item">
<a href="{% url 'home' %}" class="nav-link {% if navbar == 'home' %}active{% endif %}">Flux</a>
</li>
<li class="nav-item">
<a href="{% url 'posts' %}" class="nav-link {% if navbar == 'posts' %}active{% endif %}">Posts</a>
</li>
<li class="nav-item">
<a href="{% url 'subscribed' %}" class="nav-link {% if navbar == 'subscribed' %}active{% endif %}">Abonnements</a>
</li>
<form class="form-inline" method="post" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit" class="btn btn-light">Se déconnecter</button>
</form>
</ul>
{% endif %}
</div> </div>
</nav> </nav>
</header> </header>
{% block content %}{% endblock %} {% block content %}{% endblock %}
</body> </body>
</html> </html>

View File

@ -0,0 +1,18 @@
{% if user.is_authenticated %}
<ul class="navbar-nav z-index=2">
<li class="nav-item">
<a href="{% url 'home' %}" class="nav-link {% if navbar == 'home' %}active{% endif %}">Flux</a>
</li>
<li class="nav-item">
<a href="{% url 'posts' %}" class="nav-link {% if navbar == 'posts' %}active{% endif %}">Posts</a>
</li>
<li class="nav-item">
<a href="{% url 'subscribed' %}" class="nav-link {% if navbar == 'subscribed' %}active{% endif %}">Abonnements</a>
</li>
<form class="form-inline" method="post" action="{% url 'logout' %}">
{% csrf_token %}
<button type="submit" class="btn btn-light">Se déconnecter</button>
</form>
</ul>
{% endif %}