CRUD tickets ok, before migration update models
This commit is contained in:
parent
f74751e7e4
commit
5ac3817aed
@ -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/')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
BIN
LITReview/media/uploads/crocblanc.jpg
Normal file
BIN
LITReview/media/uploads/crocblanc.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 110 KiB |
BIN
LITReview/media/uploads/crusoe.jpg
Normal file
BIN
LITReview/media/uploads/crusoe.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 305 KiB |
@ -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']
|
||||||
|
|
||||||
|
@ -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', )
|
|
||||||
|
|
||||||
|
@ -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 %}
|
|
9
LITReview/reviews/templates/reviews/delete_confirm.html
Normal file
9
LITReview/reviews/templates/reviews/delete_confirm.html
Normal 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 %}
|
@ -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 %}
|
||||||
|
13
LITReview/reviews/templates/reviews/review_form.html
Normal file
13
LITReview/reviews/templates/reviews/review_form.html
Normal 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>
|
||||||
|
|
7
LITReview/reviews/templates/reviews/ticket.html
Normal file
7
LITReview/reviews/templates/reviews/ticket.html
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
{% include 'reviews/ticket_detail.html' %}
|
||||||
|
|
||||||
|
{% endblock %}
|
16
LITReview/reviews/templates/reviews/ticket_create.html
Normal file
16
LITReview/reviews/templates/reviews/ticket_create.html
Normal 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 %}
|
12
LITReview/reviews/templates/reviews/ticket_delete.html
Normal file
12
LITReview/reviews/templates/reviews/ticket_delete.html
Normal 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 %}
|
||||||
|
|
||||||
|
|
28
LITReview/reviews/templates/reviews/ticket_detail.html
Normal file
28
LITReview/reviews/templates/reviews/ticket_detail.html
Normal 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>
|
13
LITReview/reviews/templates/reviews/ticket_form.html
Normal file
13
LITReview/reviews/templates/reviews/ticket_form.html
Normal 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>
|
||||||
|
|
16
LITReview/reviews/templates/reviews/ticket_update.html
Normal file
16
LITReview/reviews/templates/reviews/ticket_update.html
Normal 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 %}
|
||||||
|
|
||||||
|
|
@ -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')
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
<html lang="fr">
|
<html lang="fr">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
<title> LITReview </title>
|
<title> LITReview </title>
|
||||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.5/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-SgOJa3DmI69IUzQ2PVdRZhwQ+dy64/BUtbMJw1MZ8t5HZApcHrRKUc4W0kG879m7" crossorigin="anonymous">
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.5/dist/css/bootstrap.min.css" rel="stylesheet" integrity="s ha384-SgOJa3DmI69IUzQ2PVdRZhwQ+dy64/BUtbMJw1MZ8t5HZApcHrRKUc4W0kG879m7" crossorigin="anonymous">
|
||||||
<style>
|
<style>
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
@ -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>
|
||||||
|
|
||||||
|
18
LITReview/templates/nav.html
Normal file
18
LITReview/templates/nav.html
Normal 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 %}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user