authentication works, navbar to adjust, models started not done
This commit is contained in:
parent
ee6120147c
commit
f227705e28
@ -56,7 +56,9 @@ ROOT_URLCONF = 'LITReview.urls'
|
|||||||
TEMPLATES = [
|
TEMPLATES = [
|
||||||
{
|
{
|
||||||
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
'DIRS': [],
|
'DIRS': [
|
||||||
|
BASE_DIR.joinpath('templates'),
|
||||||
|
],
|
||||||
'APP_DIRS': True,
|
'APP_DIRS': True,
|
||||||
'OPTIONS': {
|
'OPTIONS': {
|
||||||
'context_processors': [
|
'context_processors': [
|
||||||
@ -123,6 +125,14 @@ STATIC_URL = 'static/'
|
|||||||
|
|
||||||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
|
LOGIN_REDIRECT_URL = 'home'
|
||||||
|
|
||||||
|
LOGIN_URL = 'login'
|
||||||
|
|
||||||
|
LOGOUT_REDIRECT_URL = 'login'
|
||||||
|
|
||||||
AUTH_USER_MODEL = 'authentication.User'
|
AUTH_USER_MODEL = 'authentication.User'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,7 +16,24 @@ Including another URLconf
|
|||||||
"""
|
"""
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
from django.contrib.auth.views import LoginView, LogoutView, PasswordChangeView, PasswordChangeDoneView
|
||||||
|
import authentication.views, reviews.views
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('admin/', admin.site.urls),
|
path('admin/', admin.site.urls),
|
||||||
|
path('home/', reviews.views.home, name='home'),
|
||||||
|
# path('', LoginView.as_view(
|
||||||
|
path('', authentication.views.login_page, name='login'),
|
||||||
|
# template_name='authentication/login.html',
|
||||||
|
# redirect_authenticated_user=True), name='login'),
|
||||||
|
path('pwd-change/', PasswordChangeView.as_view(
|
||||||
|
template_name='authentication/pwd_change.html'), name='pwd-change'),
|
||||||
|
path('pwd-change-done/', PasswordChangeDoneView.as_view(
|
||||||
|
template_name='authentication/pwd_change_done.html'), name='pwd-change-done'),
|
||||||
|
path('logout/', LogoutView.as_view(next_page='login'), name='logout'),
|
||||||
|
path('register/', authentication.views.register_page, name='register'),
|
||||||
|
path('flux/', reviews.views.flux, name='flux'),
|
||||||
|
path('posts/', reviews.views.posts, name='posts'),
|
||||||
|
path('subscribed/', reviews.views.subscribed, name='subscribed'),
|
||||||
]
|
]
|
||||||
|
14
LITReview/authentication/forms.py
Normal file
14
LITReview/authentication/forms.py
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
from django import forms
|
||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.auth.forms import UserCreationForm
|
||||||
|
|
||||||
|
|
||||||
|
class LoginForm(forms.Form):
|
||||||
|
username = forms.CharField(max_length=63, label='Nom d’utilisateur')
|
||||||
|
password = forms.CharField(max_length=63, widget=forms.PasswordInput, label='Mot de passe')
|
||||||
|
|
||||||
|
class RegisterForm(UserCreationForm):
|
||||||
|
class Meta(UserCreationForm.Meta):
|
||||||
|
model = get_user_model()
|
||||||
|
fields = ('username',)
|
||||||
|
|
@ -0,0 +1,17 @@
|
|||||||
|
# Generated by Django 5.2 on 2025-04-18 13:34
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('authentication', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='user',
|
||||||
|
name='account_id',
|
||||||
|
),
|
||||||
|
]
|
@ -3,5 +3,4 @@ from django.contrib.auth.models import AbstractUser
|
|||||||
|
|
||||||
|
|
||||||
class User(AbstractUser):
|
class User(AbstractUser):
|
||||||
account_id = models.CharField(max_length=10, unique=True)
|
pass
|
||||||
|
|
||||||
|
41
LITReview/authentication/templates/authentication/login.html
Normal file
41
LITReview/authentication/templates/authentication/login.html
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div class="container" style="height: 100vh">
|
||||||
|
<div class="row h-100 align-items-center">
|
||||||
|
<div class="col d-flex align-items-center justify-content-center">
|
||||||
|
|
||||||
|
<div class="justify-content-center">
|
||||||
|
<div class="align-self-center">
|
||||||
|
<h2>Inscrivez-vous</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="justify-content-end">
|
||||||
|
<a href="{% url 'register' %}" type="button" class="btn btn-primary">S'inscrire</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col d-flex align-items-center justify-content-center">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<h2>Connectez-vous</h2>
|
||||||
|
<form method='post'>
|
||||||
|
{% csrf_token %}
|
||||||
|
<div class="form-group p-3">
|
||||||
|
{{ form.username }}
|
||||||
|
</div>
|
||||||
|
<div class="form-group p-3">
|
||||||
|
{{ form.password }}
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-primary self-align-right">Se connecter</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
@ -0,0 +1,22 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block content %}
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center mt-10">
|
||||||
|
<div class="col text-center">
|
||||||
|
<h2>Inscrivez-vous</h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-3 d-flex align-items-end">
|
||||||
|
<a href="{% url 'login' %}" class="btn btn-primary">Retourner</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-3 d-flex align-items-end">
|
||||||
|
<form method='post'>
|
||||||
|
{% csrf_token %}
|
||||||
|
{{ form.as_p }}
|
||||||
|
<button type="submit" class="btn btn-primary">S'inscrire</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
@ -1,3 +1,40 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render, redirect
|
||||||
|
from django.contrib.auth import login, logout, authenticate
|
||||||
|
from django.conf import settings
|
||||||
|
from django import forms
|
||||||
|
from authentication.forms import LoginForm, RegisterForm
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
|
def login_page(request):
|
||||||
|
form = LoginForm()
|
||||||
|
message = ""
|
||||||
|
|
||||||
|
if request.method == 'POST':
|
||||||
|
form = LoginForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
user = authenticate(
|
||||||
|
username=form.cleaned_data['username'],
|
||||||
|
password=form.cleaned_data['password'],
|
||||||
|
)
|
||||||
|
if user is not None:
|
||||||
|
login(request, user)
|
||||||
|
return redirect('home')
|
||||||
|
else:
|
||||||
|
message = "Identifiants invalides"
|
||||||
|
|
||||||
|
print(request.POST)
|
||||||
|
|
||||||
|
return render(request,
|
||||||
|
'authentication/login.html',
|
||||||
|
{'form': form})
|
||||||
|
|
||||||
|
|
||||||
|
def register_page(request):
|
||||||
|
form = RegisterForm()
|
||||||
|
if request.method == 'POST':
|
||||||
|
form = RegisterForm(request.POST)
|
||||||
|
if form.is_valid():
|
||||||
|
user = form.save()
|
||||||
|
login(request, user)
|
||||||
|
return redirect(settings.LOGIN_REDIRECT_URL)
|
||||||
|
return render(request, 'authentication/register.html', {'form': form})
|
||||||
|
@ -1,3 +1,38 @@
|
|||||||
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
||||||
|
from django.conf import settings
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
|
class Ticket(models.Model):
|
||||||
|
# Your Ticket model definition goes here
|
||||||
|
title = models.CharField(max_length=100)
|
||||||
|
topic = models.CharField(max_length=100)
|
||||||
|
body = models.CharField(max_length=8192)
|
||||||
|
user = models.ForeignKey(
|
||||||
|
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
||||||
|
image = models.ImageField(upload_to="uploads/")
|
||||||
|
time_created = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class Review(models.Model):
|
||||||
|
ticket = models.ForeignKey(to=Ticket, on_delete=models.CASCADE)
|
||||||
|
rating = models.PositiveSmallIntegerField(
|
||||||
|
# validates that rating must be between 0 and 5
|
||||||
|
validators=[MinValueValidator(0), MaxValueValidator(5)])
|
||||||
|
headline = models.CharField(max_length=128)
|
||||||
|
body = models.CharField(max_length=8192, blank=True)
|
||||||
|
user = models.ForeignKey(
|
||||||
|
to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
||||||
|
time_created = models.DateTimeField(auto_now_add=True)
|
||||||
|
|
||||||
|
|
||||||
|
class UserFollows(models.Model):
|
||||||
|
# Your UserFollows model definition goes here
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
# ensures we don't get multiple UserFollows instances
|
||||||
|
# for unique user-user_followed pairs
|
||||||
|
pass
|
||||||
|
#unique_together = ('user', 'followed_user', )
|
||||||
|
pass
|
||||||
|
12
LITReview/reviews/templates/reviews/flux.html
Normal file
12
LITReview/reviews/templates/reviews/flux.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block nav %}
|
||||||
|
<nav>
|
||||||
|
<a href="{% url 'flux' %}">Flux</a>
|
||||||
|
<a href="{% url 'posts' %}">Posts</a>
|
||||||
|
<a href="{% url 'subscribed' %}">Abonnements</a>
|
||||||
|
<a href="{% url 'logout' %}">Se déconnecter</a>
|
||||||
|
</nav>
|
||||||
|
{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h2> Flux </h2>
|
||||||
|
{% endblock %}
|
17
LITReview/reviews/templates/reviews/home.html
Normal file
17
LITReview/reviews/templates/reviews/home.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block nav %}
|
||||||
|
<nav class="navbar navbar-light ml-auto">
|
||||||
|
<a href="{% url 'flux' %}">Flux</a>
|
||||||
|
<a href="{% url 'posts' %}">Posts</a>
|
||||||
|
<a href="{% url 'subscribed' %}">Abonnements</a>
|
||||||
|
<form class="form-inline" method="post" action="{% url 'logout' %}">
|
||||||
|
{% csrf_token %}
|
||||||
|
<button type="submit" class="btn btn-light">Se déconnecter</button>
|
||||||
|
</form>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h2> Bienvenue {{ user.name }}</h2>
|
||||||
|
{% endblock %}
|
12
LITReview/reviews/templates/reviews/posts.html
Normal file
12
LITReview/reviews/templates/reviews/posts.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block nav %}
|
||||||
|
<nav>
|
||||||
|
<a href="{% url 'flux' %}">Flux</a>
|
||||||
|
<a href="{% url 'posts' %}">Posts</a>
|
||||||
|
<a href="{% url 'subscribed' %}">Abonnements</a>
|
||||||
|
<a href="{% url 'logout' %}">Se déconnecter</a>
|
||||||
|
</nav>
|
||||||
|
{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h2> Posts </h2>
|
||||||
|
{% endblock %}
|
12
LITReview/reviews/templates/reviews/subscribed.html
Normal file
12
LITReview/reviews/templates/reviews/subscribed.html
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{% extends 'base.html' %}
|
||||||
|
{% block nav %}
|
||||||
|
<nav>
|
||||||
|
<a href="{% url 'flux' %}">Flux</a>
|
||||||
|
<a href="{% url 'posts' %}">Posts</a>
|
||||||
|
<a href="{% url 'subscribed' %}">Abonnements</a>
|
||||||
|
<a href="{% url 'logout' %}">Se déconnecter</a>
|
||||||
|
</nav>
|
||||||
|
{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
<h2> Subscribed </h2>
|
||||||
|
{% endblock %}
|
@ -1,3 +1,15 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
# Create your views here.
|
def home(request):
|
||||||
|
return render(request, 'reviews/home.html')
|
||||||
|
|
||||||
|
def flux(request):
|
||||||
|
return render(request, 'reviews/flux.html')
|
||||||
|
|
||||||
|
def posts(request):
|
||||||
|
return render(request, 'reviews/posts.html')
|
||||||
|
|
||||||
|
def subscribed(request):
|
||||||
|
return render(request, 'reviews/subscribed.html')
|
||||||
|
|
||||||
|
|
||||||
|
24
LITReview/templates/base.html
Normal file
24
LITReview/templates/base.html
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<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">
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="container-fluid border border-3 border-secondary-subtle">
|
||||||
|
<div class="row text-center">
|
||||||
|
<h1> LITReview </h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% block nav %}{% endblock %}
|
||||||
|
</header>
|
||||||
|
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user