First Commit

This commit is contained in:
mrtoine 2025-09-12 11:11:44 +02:00
commit ce0758fbbb
496 changed files with 52062 additions and 0 deletions

View file

@ -0,0 +1,41 @@
{% if request.theme_active != '00s' %}
<div class="warning-announce-not-mobile-compatible">
Le design séléctionné n'est pas compatible avec les appareils mobiles. Veuillez choisir un autre design pour une meilleure expérience utilisateur.
</div>
{% endif %}
{% if request.theme_active == 'rpg' %}
<div class="banner-container">
<div class="banner rpg-banner">
<div class="rpg-frame">
<div class="rpg-background">
<div class="rpg-cloud"></div>
<div class="rpg-cloud"></div>
<div class="rpg-tree"></div>
<div class="rpg-tree"></div>
</div>
<div class="rpg-text-box">
<div class="rpg-title">Passion Retro</div>
<div class="rpg-message">
Bienvenue sur le portail web 100% Rétro ! Attention, ce site web n'est pas conseillé aux personnes<br>nées après 2005 sous peine de crise existensielle.
</div>
<div class="rpg-pointer"></div>
</div>
</div>
</div>
</div>
{% else %}
<div class="banner-container">
<div class="banner">
<div class="galaxy-background"></div>
{% if request.theme_active == "80s" %}
<div class="grid"></div>
<div class="sun"></div>
<div class="spaceship">
<div class="engine"></div>
</div>
{% endif %}
<div class="banner-text" id="bannerText">Passion Retro</div>
<div class="slogan">Bienvenue sur le portail web 100% Rétro ! Attention, ce site web n'est pas conseillé aux personnes nées après 2005 sous peine de crise existensielle.</div>
</div>
</div>
{% endif %}

View file

@ -0,0 +1,48 @@
{% extends 'forum_layout.html' %}
{% load forum_extras %}
{% block forum_content %}
<h2>Forum</h2>
<div class="forum">
{% for category in categories %}
<div class="forum-body forum-column category-name"><h3>{{ category.name }}</h3></div>
<div class="forum-header">
<div class="forum-column">Description</div>
<div class="forum-column">Nombre de topics</div>
<div class="forum-column">Dernier Message</div>
</div>
<div class="forum-body">
{% for forum in forums %}
{% if forum.category.id == category.id %}
<div class="forum-row">
<div class="forum-column">
{% if unread_topics|get_item:forum.id %}
<span class="unread-badge"></span>
<strong><a href="{% url 'topic_list' forum.id %}">{{ forum.name }}</a></strong>
{% else %}
<a href="{% url 'topic_list' forum.id %}">{{ forum.name }}</a>
{% endif %}
<br>
<span class="forum-description"><small>{{ forum.description|safe }}</small></span>
</div>
<div class="forum-column">
{{ count_topics|get_item:forum.id|default_if_none:'Aucun' }}
</div>
<div class="forum-column">
{% with last_post=last_posts|get_item:forum.id %}
{% if last_post %}
<strong><a href="{% url 'profile' last_post.author.id %}" class="{{ last_post.author.username_decoration }}">{{ last_post.author.username }}</a></strong> dans <a href="{% url 'post_list' last_post.topic.forum.id last_post.topic.id %}">{{ last_post.topic.title }}</a>
<br>
<small>{{ last_post.created }}</small></span>
{% else %}
Aucun message
{% endif %}
{% endwith %}
</div>
</div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
</div>
{% endblock %}

View file

@ -0,0 +1,22 @@
{% extends 'layout.html' %}
{% load users_custom_tags %}
{% load bbcode_tags %}
{% block content %}
<div class="container">
<h2>Livre d'Or</h2>
<div class="guestbook">
{% for message in guestbook %}
<p>Le {{ message.created }}, <span class="author {{ message.author.username_decoration }}">{{ message.author }}</span> à dit : {{ message.content|bbcode|safe|linebreaksbr }}</p>
{% endfor %}
</div>
<h3 id="form">Laisser un message</h3>
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<!-- <script src='https://www.google.com/recaptcha/api.js'></script>
<div class="g-recaptcha" style="margin-left:50px" data-sitekey="{{ GOOGLE_PUBLIC_KEY }}"></div> -->
<button>Envoyer</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,53 @@
<!-- Ajout du bouton burger -->
<div class="burger-menu">
<button class="burger-icon">
<span></span>
<span></span>
<span></span>
</button>
</div>
<!-- Menu horizontal existant -->
<div class="menu-horizontal">
<ul>
<li><a href="{% url 'home' %}">Accueil</a></li>
<li><a href="{% url 'forum_home' %}">Forum</a></li>
<li>
<a href="{% url 'portal_games' %}">
Portail des jeux
{% if request.user.is_staff and pending_quizes_count > 0 %}
<span class="badge badge-warning">{{ pending_quizes_count }}</span>
{% endif %}
</a>
</li>
<li><a href="{% url 'shop_home' %}" class="new-item-menu">Boutique</a></li>
<li><a href="{% url 'contribute' %}" class="btn btn-add">Contribuer</a></li>
<li><a href="">Technologies</a>
<ul class="dropdown">
{% for tech in request.posts_tech %}
<li><a href="{% url 'view_post' tech.slug %}">{{ tech.title }}</a></li>
{% endfor %}
</ul>
</li>
<li><a href="">Musique</a>
<ul>
{% for music in request.posts_music %}
<li><a href="{% url 'view_post' music.slug %}">{{ music.title }}</a></li>
{% endfor %}
</ul>
</li>
<li><a href="">Films & Series</a>
<ul>
{% for movies in request.posts_movies %}
<li><a href="{% url 'view_post' movies.slug %}">{{ movies.title }}</a></li>
{% endfor %}
</ul>
</li>
<li><a href="">Jeux</a>
<ul class="dropdown">
{% for games in request.posts_games %}
<li><a href="{% url 'view_post' games.slug %}">{{ games.title }}</a></li>
{% endfor %}
</ul>
</li>
</ul>
</div>

View file

@ -0,0 +1,49 @@
<div class="menu">
<h2>Communauté</h2>
<ul>
<li><a href="{% url 'home' %}">Accueil</a></li>
<li><a href="{% url 'forum_home' %}">Forum</a></li>
<li>
<a href="{% url 'portal_games' %}">Portail des jeux</a>
{% if request.user.is_staff and pending_quizes_count > 0 %}
<span class="badge badge-warning">{{ pending_quizes_count }}</span>
{% endif %}
</li>
<li>
<a href="{% url 'shop_home' %}" class="new-item-menu">Boutique</a>
</li>
<li><a href="{% url 'contribute' %}" class="btn btn-add">Contribuer</a></li>
</ul>
</div>
<div class="menu">
<h2>Jeux</h2>
<ul>
{% for games in request.posts_games %}
<li><a href="{% url 'view_post' games.slug %}">{{ games.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Films & Series</h2>
<ul>
{% for movies in request.posts_movies %}
<li><a href="{% url 'view_post' movies.slug %}">{{ movies.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Musique</h2>
<ul>
{% for music in request.posts_music %}
<li><a href="{% url 'view_post' music.slug %}">{{ music.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Technologies</h2>
<ul>
{% for tech in request.posts_tech %}
<li><a href="{% url 'view_post' tech.slug %}">{{ tech.title }}</a></li>
{% endfor %}
</ul>
</div>

View file

@ -0,0 +1,69 @@
{% if is_paginated %}
<nav aria-label="Page navigation">
<ul class="pagination">
{% if page_obj.number > 1 %}
<li class="page-item">
<a class="page-link" href="?page=1" aria-label="First">
<span aria-hidden="true">&laquo;</span>
</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link" aria-label="First">
<span aria-hidden="true">&laquo;</span>
</span>
</li>
{% endif %}
{% if page_obj.has_previous %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
<span aria-hidden="true"><</span>
</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link" aria-label="Previous">
<span aria-hidden="true"><</span>
</span>
</li>
{% endif %}
{% for num in paginator.page_range %}
{% if page_obj.number == num %}
<li class="page-item active"><span class="page-link">{{ num }}</span></li>
{% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
<li class="page-item"><a class="page-link" href="?page={{ num }}">{{ num }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li class="page-item">
<a class="page-link" href="?page={{ page_obj.next_page_number }}" aria-label="Next">
<span aria-hidden="true">></span>
</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link" aria-label="Next">
<span aria-hidden="true">></span>
</span>
</li>
{% endif %}
{% if page_obj.number < paginator.num_pages %}
<li class="page-item">
<a class="page-link" href="?page={{ paginator.num_pages }}" aria-label="Last">
<span aria-hidden="true">&raquo;</span>
</a>
</li>
{% else %}
<li class="page-item disabled">
<span class="page-link" aria-label="Last">
<span aria-hidden="true">&raquo;</span>
</span>
</li>
{% endif %}
</ul>
</nav>
{% endif %}

View file

@ -0,0 +1,6 @@
{% block 'profile-nav' %}
<div class="profile-header">
<h2>Profil de <span class="{{ user.username_decoration }}">{{ user.username }}</span></h2>
<div class="{{ user.border_avatar }}"><img src="/media/{{ user.avatar }}" style="width:150px;" alt="Avatar de {{ user.username }}"></div>
</div>
{% endblock %}

View file

@ -0,0 +1,87 @@
{% load bbcode_tags %}
<div class="menu">
<h2>Membre</h2>
<ul>
<!-- Si le membre est connecté -->
{% if request.user.is_authenticated %}
<center><div class="{{ request.user.border_avatar }}"><img src="/media/{{ request.user.avatar }}" style="width:150px;" alt="Avatar de {{ request.user.username }}"></div></center>
<li>Bonjour <strong><span class="{{ request.user.username_decoration }}" data-text="{{ request.user.username }}">{{ request.user.username }}</span></strong></li>
<li><a href="{% url 'profile' %}">Mon Profil</a></li>
<li>
<a href="{% url 'pm_home' %}">Messagerie privée</a>
{% if pending_pm_count > 0 %}
<span class="badge badge-warning">{{ pending_pm_count }}</span>
{% endif %}
</li>
<li><a href="{% url 'contributions' %}">Mes contributions</a></li>
<li>
<form id="logout-form" action="{% url 'logout' %}" method="post" style="display: none;">
{% csrf_token %}
</form>
<a href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">Déconnexion</a>
</li>
<!-- Si c'est un admin -->
{% if request.user.is_staff %}
<li>
<a href="/admin/posts/post/?active__exact=0">
Articles en attente
</a>
{% if pending_posts_count > 0 %}
<span class="badge badge-warning">{{ pending_posts_count }}</span>
{% endif %}
</li>
<li><a href="/admin" target="_blank" class="danger">Administration</a></li>
{% endif %}
<!-- Si le membre n'est pas connecté -->
{% else %}
<li>
<form action="{% url 'login' %}" method="post" class="incol">
{% csrf_token %}
<input type="text" name="username" placeholder="Nom d'utilisateur">
<input type="password" name="password" placeholder="Mot de passe">
<button>Connexion</button>
</form>
</li>
<li><a href="{% url 'register' %}">Inscription</a></li>
{% endif %}
</ul>
</div>
<div class="menu">
<h2>Livre d'Or</h2>
<ul class="guestbook">
{% for message in request.guestbook %}
<li><span class="date">[{{ message.created }}]</span> <span class="author {{ message.author.username_decoration }}" data-text="{{ message.author.username }}<">{{ message.author }}</span> : {{ message.content|bbcode|safe|linebreaksbr }}</li>
{% endfor %}
</ul>
<ul>
<li>{{ request.total_guestbook }} messages dans le livre d'or</li>
</ul>
<center><a href="{% url 'guestbook_home' %}#form" class="btn btn-add">Laisser un message</a></center>
</div>
<div class="menu">
<h2>Stats Site</h2>
<ul>
<li>Membres : {{ request.total_users }}</li>
<li>Dernier inscrit : <a href="{% url 'profile' request.last_user.id %}">{{ request.last_user }}</a></li>
<li>Visiteurs : {{ request.visitor_count }}</li>
<li>Visites totales : {{ request.total_visitor_count }}</li>
</ul>
</div>
<div class="menu">
<h2>Stats Forum</h2>
<ul>
<li>Messages : {{ request.total_posts }}</li>
<li>Sujets : {{ request.total_topics }}</li>
{% if request.last_topic %}
<li>Dernier Sujet créer : <a href="{% url 'post_list' request.last_topic.forum.id request.last_topic.id %}">{{ request.last_topic.title }}</a></li>
{% else %}
<li>Dernier Sujet créer : Aucun</li>
{% endif %}
{% if request.last_post %}
<li>Dernier Message : <a href="{% url 'post_list' request.last_post.topic.forum.id request.last_post.topic.id %}">{{ request.last_post.topic.title }}</a></li>
{% else %}
<li>Dernier Message : Aucun</li>
{% endif %}
</ul>
</div>

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<title>Activation de votre compte</title>
</head>
<body>
<p>Bonjour {{ user.username }},</p>
<p>Merci de vous être inscrit sur notre site. Veuillez cliquer sur le lien ci-dessous pour activer votre compte :</p>
<p><a href="{{ activation_link }}">Activer mon compte</a></p>
<p>Si vous n'avez pas demandé cette inscription, veuillez ignorer cet email.</p>
</body>
</html>

14
templates/errors/403.html Normal file
View file

@ -0,0 +1,14 @@
{% extends 'layout.html' %}
{% block content %}
<div class="error-container">
<div class="error-code">403</div>
<div class="error-message">
<h1>Accès interdit</h1>
<p>Désolé, vous n'avez pas les permissions nécessaires pour accéder à cette page.</p>
</div>
<div class="error-actions">
<a href="/" class="error-btn">Retour à l'accueil</a>
</div>
</div>
{% endblock %}

17
templates/errors/404.html Normal file
View file

@ -0,0 +1,17 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Erreur 404 : Où est passée cette page ? 🤔</h2>
<div class="error-message">
<div class="robot">🤖</div>
<p>
Oups ! Il semblerait que cette page ait pris la poudre descampette.<br>
Peut-être est-elle partie explorer les consoles rétro ou s'est-elle égarée dans un vieux circuit imprimé ? 🕹️✨
</p>
</div>
<div class="error-actions">
<a href="/" class="error-btn">Retour à l'accueil</a>
</div>
</div>
{% endblock %}

14
templates/errors/500.html Normal file
View file

@ -0,0 +1,14 @@
{% extends 'layout.html' %}
{% block content %}
<div class="error-container">
<div class="error-code">500</div>
<div class="error-message">
<h1>Erreur serveur</h1>
<p>Désolé, une erreur inattendue s'est produite. Nos équipes ont été notifiées.</p>
</div>
<div class="error-actions">
<a href="/" class="error-btn">Retour à l'accueil</a>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,145 @@
{% extends 'layout.html' %}
{% block content %}
<style>
.firework {
position: absolute;
pointer-events: none;
}
.particle {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
animation: explode 1s ease-out forwards;
z-index: 1000;
}
@keyframes explode {
0% {
transform: translate(0, 0);
opacity: 1;
}
100% {
transform: translate(var(--tx), var(--ty));
opacity: 0;
}
}
.rocket {
position: absolute;
width: 4px;
height: 4px;
background: #fff;
border-radius: 50%;
pointer-events: none;
z-index: 1000;
}
.rocket::before {
content: '';
position: absolute;
width: 2px;
height: 20px;
background: linear-gradient(to top, transparent, #fff);
bottom: 2px;
left: 1px;
}
@keyframes rocketUp {
0% {
transform: translateY(0) scale(1);
opacity: 1;
}
90% {
transform: translateY(var(--targetY)) scale(1);
opacity: 1;
}
100% {
transform: translateY(var(--targetY)) scale(0);
opacity: 0;
}
}
</style>
<div class="fireworks-container"></div>
<div class="container">
<h2>Nouveauté !</h2>
<div style="float:right;margin:5px;"><img src="/static/img/retrobot.png" style="max-width: 200px;border-bottom:3px solid black;" alt="RetroBot"></div>
<p style="font-size: 1.2rem;">
Salut, c'est RetroBot ! J'ai une nouvelle fonctionnalité à te présenter : l'inventaire !<br>
Tu peux maintenant collectionner des objets et les utiliser pour personnaliser ton profil.<br>
Alors, qu'est-ce que tu attends ? Lance-toi dans l'aventure et découvre tous les objets que tu peux obtenir !
</p>
<p style="font-size:1.2rem">
Pour commencer, je te fais un cadeau ! Je t'offre <span class="money">100</span> pour te remercier de ta fidélité !<br>
</p>
<p style="font-size: 1.2rem;font-weight: 800;">
Votre ami, Sir. RetroBot IV
</p>
<center><a href="/" class="btn btn-default btn-large">Retourner sur le site</a></center><br>
</div>
<script>
function createRocket() {
const rocket = document.createElement('div');
rocket.className = 'rocket';
const startX = Math.random() * window.innerWidth;
const startY = window.innerHeight;
const targetY = -(Math.random() * 400 + 200);
rocket.style.left = startX + 'px';
rocket.style.bottom = '0';
rocket.style.setProperty('--targetY', targetY + 'px');
document.querySelector('.fireworks-container').appendChild(rocket);
rocket.style.animation = 'rocketUp 1s ease-out forwards';
rocket.addEventListener('animationend', () => {
createFirework(startX, window.innerHeight + targetY);
rocket.remove();
});
}
function createFirework(x, y) {
const firework = document.createElement('div');
firework.className = 'firework';
firework.style.left = x + 'px';
firework.style.top = y + 'px';
const colors = ['#ff00ff', '#00ffff', '#ffff00', '#ff0000', '#00ff00'];
for (let i = 0; i < 30; i++) {
const particle = document.createElement('div');
particle.className = 'particle';
const angle = (i / 30) * Math.PI * 2;
const velocity = 50 + Math.random() * 50;
const tx = Math.cos(angle) * velocity;
const ty = Math.sin(angle) * velocity;
particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
particle.style.setProperty('--tx', `${tx}px`);
particle.style.setProperty('--ty', `${ty}px`);
firework.appendChild(particle);
}
document.querySelector('.fireworks-container').appendChild(firework);
setTimeout(() => firework.remove(), 500);
}
// Lancer des fusées et des feux d'artifice
setInterval(() => {
if (Math.random() < 0.5) {
createRocket();
} else {
const x = Math.random() * window.innerWidth;
const y = Math.random() * (window.innerHeight / 2);
createFirework(x, y);
}
}, 500);
</script>
{% endblock %}

View file

@ -0,0 +1,153 @@
{% extends 'layout.html' %}
{% block content %}
<style>
.firework {
position: absolute;
pointer-events: none;
}
.particle {
position: absolute;
width: 8px;
height: 8px;
border-radius: 50%;
animation: explode 1s ease-out forwards;
z-index: 1000;
}
@keyframes explode {
0% {
transform: translate(0, 0);
opacity: 1;
}
100% {
transform: translate(var(--tx), var(--ty));
opacity: 0;
}
}
.rocket {
position: absolute;
width: 4px;
height: 4px;
background: #fff;
border-radius: 50%;
pointer-events: none;
z-index: 1000;
}
.rocket::before {
content: '';
position: absolute;
width: 2px;
height: 20px;
background: linear-gradient(to top, transparent, #fff);
bottom: 2px;
left: 1px;
}
@keyframes rocketUp {
0% {
transform: translateY(0) scale(1);
opacity: 1;
}
90% {
transform: translateY(var(--targetY)) scale(1);
opacity: 1;
}
100% {
transform: translateY(var(--targetY)) scale(0);
opacity: 0;
}
}
</style>
<div class="fireworks-container"></div>
<div class="container">
<h2>Nouveauté !</h2>
<div style="float:right;margin:5px;"><img src="/static/img/retrobot.png" style="max-width: 200px;border-bottom:3px solid black;" alt="RetroBot"></div>
<p style="font-size:1.2rem">
C'est nouveau sur notre site ! Les utilisateurs ont désormais un level !<br>
Comme dans les RPG d'antan, vous pouvez monter de level en participant activement au site.<br>
Plus vous participez, plus vous montez en level !<br>
<br>
<strong>Votre level actuel est : {{ user.level.level }}</strong><br>
<br>
Vous pouvez voir votre level sur votre profil, et celui des autres utilisateurs sur leur profil.<br>
</p>
<h3 style="color:red">Dans la prochaine mise à jour</h3>
<div style="background-color:rgb(176, 230, 159);border:1px solid rgb(0, 234, 255)">
<p style="font-size:1.2rem">
En plus d'un level, chaque membres aura desormais un inventaire !<br>
Celui-ci vous permettra d'y voir en un clin d'oeil tout ce que vous avez débloqué sur le site. Car oui, en plus d'un level, vous obtiendrez de l'argent virtuel que vous pourrez dépenser dans une boutique dédiée !<br>
</p>
</div>
<p style="font-size: 1.2rem;font-weight: 800;">
Votre ami, Sir. RetroBot IV
</p>
<center><a href="/" class="btn btn-default btn-large">Retourner sur le site</a></center><br>
</div>
<script>
function createRocket() {
const rocket = document.createElement('div');
rocket.className = 'rocket';
const startX = Math.random() * window.innerWidth;
const startY = window.innerHeight;
const targetY = -(Math.random() * 400 + 200);
rocket.style.left = startX + 'px';
rocket.style.bottom = '0';
rocket.style.setProperty('--targetY', targetY + 'px');
document.querySelector('.fireworks-container').appendChild(rocket);
rocket.style.animation = 'rocketUp 1s ease-out forwards';
rocket.addEventListener('animationend', () => {
createFirework(startX, window.innerHeight + targetY);
rocket.remove();
});
}
function createFirework(x, y) {
const firework = document.createElement('div');
firework.className = 'firework';
firework.style.left = x + 'px';
firework.style.top = y + 'px';
const colors = ['#ff00ff', '#00ffff', '#ffff00', '#ff0000', '#00ff00'];
for (let i = 0; i < 30; i++) {
const particle = document.createElement('div');
particle.className = 'particle';
const angle = (i / 30) * Math.PI * 2;
const velocity = 50 + Math.random() * 50;
const tx = Math.cos(angle) * velocity;
const ty = Math.sin(angle) * velocity;
particle.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
particle.style.setProperty('--tx', `${tx}px`);
particle.style.setProperty('--ty', `${ty}px`);
firework.appendChild(particle);
}
document.querySelector('.fireworks-container').appendChild(firework);
setTimeout(() => firework.remove(), 500);
}
// Lancer des fusées et des feux d'artifice
setInterval(() => {
if (Math.random() < 0.5) {
createRocket();
} else {
const x = Math.random() * window.innerWidth;
const y = Math.random() * (window.innerHeight / 2);
createFirework(x, y);
}
}, 500);
</script>
{% endblock %}

View file

@ -0,0 +1,20 @@
{% extends 'forum_layout.html' %}
{% load forum_extras %}
{% block forum_content %}
<div class="forum">
<h2>{{ forum.name }}</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'forum_home' %}">{{ forum.category.name }}</a> »</li>
<li>{{ forum.name }}</li>
</ul>
<h3>Créér un nouveau topic</h3>
<form method="post">
{% csrf_token %}
<div class="form-group">
{{ topic_form.as_p }}
</div>
<button>Créer topic</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,12 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Éditer le message</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-primary">Enregistrer les modifications</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,85 @@
{% extends 'forum_layout.html' %}
{% load forum_extras %}
{% load users_custom_tags %}
{% load paginator_tag %}
{% load bbcode_tags %}
{% block forum_content %}
<div class="forum">
<h2>{{ topic.title }}</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'forum_home' %}">{{ topic.forum.category.name }}</a> »</li>
<li><a href="{% url 'topic_list' topic.forum.id %}">{{ topic.forum.name }}</a> »</li>
<li>{{ topic.title }}</li>
</ul>
{% for post in posts %}
<div class="forum-header" id="{{ post.id }}">
<div class="forum-column-detail"><div class="row"><span id="author-post-{{ post.id }}" class="{{ post.author.username_decoration }}" style="font-size:1.3rem;">{{ post.author.username }}</span> <small>le {{ post.created }}</small></div></div>
</div>
<div class="forum-body">
<div class="forum-row">
<div class="forum-column-detail details">
<center><div class="{{ post.author.border_avatar }}"><img src="/media/{{ post.author.avatar }}" style="width:100px;" alt="Avatar de {{ post.author.username }}"></div></center>
<small>
<ul>
<li>Groupe :
{% for group in post.author.groups.all %}
{% if group.name == "Administrateurs" %}
<span class="text-admin">{{ group.name }}</span>
{% elif group.name == "Super Admin" %}
<span class="text-sadmin">{{ group.name }}</span>
{% else %}
{{ group.name }}{% if not forloop.last %}, {% endif %}
{% endif %}
{% endfor %}
</li>
<li>Nombre de messages : {{ count_posts|get_item:post.author.id }}</li>
</ul>
</small>
{% if user|has_group:"Administrateurs" or user|has_group:"Super Admin" %}
<a href="{% url 'deactivate_post' post.id %}" class="btn btn-warning">Désactiver le message</a>
{% endif %}
</div>
<div class="forum-column-detail">
<span id="post-{{ post.id }}">{{ post.content|bbcode|safe|linebreaksbr }}</span>
<div class="footer-post" style="margin-top:50px;">
<hr>
<p style="padding: 10px;">{{ post.author.biography|bbcode|safe|linebreaksbr }}</p>
{% if post.created|date:"Y-m-d H:i:s" != post.updated|date:"Y-m-d H:i:s" %}
<span style="font-style:italic;font-size: 0.8rem;">modifié le {{ post.updated }}</span>
{% endif %}
<a style="float:right" id="quote" target="{{ post.id }}" class="btn btn-small">Citer</a>
<!-- Ajouter ceci dans la boucle des posts, près des autres actions -->
{% if request.user == post.author or request.user.is_staff %}
<a href="{% url 'forum_edit_post' post.id %}" style="float:right" id="edit" class="btn btn-small">Modifier</a>
{% endif %}
</div>
</div>
</div><br>
</div>
{% endfor %}
{% paginate %}
{% if user.is_authenticated %}
<!-- On affiche la possibilité de clore le topic si l'utilisateur est admin -->
{% if topic.state == "closed" %}
<h2>Topic fermé</h2>
{% if user|has_group:"Administrateurs" or user|has_group:"Super Admin" %}
<a href="{% url 'unlock_topic' topic.id %}" class="btn btn-add">Ouvrir le topic</a>
{% endif %}
{% else %}
{% if user|has_group:"Administrateurs" or user|has_group:"Super Admin" %}
<h2>Répondre</h2>
<a href="{% url 'lock_topic' topic.id %}" class="btn btn-danger">Fermer le topic</a>
{% endif %}
<form method="post">
{% csrf_token %}
<div class="form-group">
{{ post_form.as_p }}
</div>
<button>Répondre</button>
</form>
{% endif %}
{% endif %}
</div>
{% endblock %}

60
templates/forum/topic_list.html Executable file
View file

@ -0,0 +1,60 @@
{% extends 'forum_layout.html' %}
{% load forum_extras %}
{% load paginator_tag %}
{% block forum_content %}
<h2>{{ forum.name }}</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'forum_home' %}">{{ forum.category.name }}</a> »</li>
<li>{{ forum.name }}</li>
</ul>
<div class="forum">
{% if user.is_authenticated %}
<a href="{% url 'create_topic' forum.id %}" class="btn btn-add">Nouveau Topic</a>
{% endif %}
<div class="forum-header">
<div class="forum-column">Sujet</div>
<div class="forum-column">Auteur</div>
<div class="forum-column">Messages</div>
<div class="forum-column">Dernier Message</div>
</div>
<div class="forum-body">
{% for topic in topics %}
<div class="forum-row">
<div class="forum-column">
{% if unread_topics|get_item:topic.id %}
<span class="unread-badge"></span>
<strong><a href="{% url 'post_list' topic.forum.id topic.id %}">{{ topic.title }}</a></strong>
{% else %}
<a href="{% url 'post_list' topic.forum.id topic.id %}">{{ topic.title }}</a>
{% endif %}
<br>
<small>{{ topic.created_at }}</small>
</div>
<div class="forum-column">
<span class="{{ topic.author.username_decoration }}">{{ topic.author.username }}</span>
</div>
<div class="forum-column">
{{ count_posts|get_item:topic.id|default_if_none:'Aucun' }}
</div>
<div class="forum-column">
{% with last_post=last_posts|get_item:topic.id %}
{% if last_post %}
<strong><span class="{{ last_post.author.username_decoration }}">{{ last_post.author.username }}</span></strong>
<br>
<small>
<a href="{% url 'post_list' last_post.topic.forum.id last_post.topic.id %}?page={{ page_numbers|get_item:topic.id }}#{{ last_post.id }}">
{{ last_post.created }}
</a>
</small>
{% else %}
Aucun message
{% endif %}
{% endwith %}
</div>
</div>
{% endfor %}
{% paginate %}
</div>
</div>
{% endblock %}

23
templates/forum_layout.html Executable file
View file

@ -0,0 +1,23 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
{% block forum_content %}{% endblock %}
<div class="stats_forum">
<h2>Statistiques</h2>
<div class="row">
<div class="col col-5">
<ul>
<li>{{ request.total_users }} utilisateurs enregistrés</li>
<li>Bienvenue à notre dernier membre : <a href="{% url 'profile' request.last_user.id %}">{{ request.last_user.username }}</a></li>
</ul>
</div>
<div class="col col-5">
<ul>
<li>Bravo à <a href="{% url 'profile' request.user_with_most_posts.id %}">{{ request.user_with_most_posts }}</a> qui compte {{ request.most_posts }} messages à son actif !</li>
<li>Bravo à <a href="{% url 'profile' request.user_with_most_topics.id %}">{{ request.user_with_most_topics }}</a> qui cumule {{ request.most_topics }} sujets !</li>
</ul>
</div>
</div>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,32 @@
{% load static %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Passion rétro</title>
<link rel="stylesheet" href="{% static 'themes/grid.css' %}">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/colors.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/typo.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/structure.css">
</head>
<body>
{% if messages %}
<div class="notification">
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
<div class="container">
<form action="" method="POST" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Importer image">
</form>
</div>
</body>
</html>

View file

@ -0,0 +1,16 @@
<h4>Galerie de {{ request.user }}</h4>
<div class="gallery">
{% if images %}
{% for image in images %}
<div class="gallery-item" style="max-width: 200px; max-height: 300px; overflow: hidden;">
<img src="{{ image }}" alt="Image de la galerie" style="width: 100%; height: auto;">
<button class="bbcode-bar-item" type="button" data-tag="[img]{{ image }}[/img]" onclick="copyToClipboard(event)">Copier lien</button>
</div>
{% endfor %}
{% else %}
<p>Aucune image disponible dans la galerie.</p>
{% endif %}
</div>
<a href="#" class="btn btn-add" onclick="openPopup('/gallery/import')">Importer une image</a>

View file

@ -0,0 +1,32 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container" data-game-id="{{ game.id }}">
<h2>{{ game.name }}</h2>
<h3>Partie {{ round.round_counter }}</h3>
<div class="game-bac-letter">{{ round.letter }}</div>
<div>Le célèbre jeu du petit bac ! Le Petit Bac est un jeu où les joueurs trouvent des mots correspondant à des catégories spécifiques, en commençant par une lettre donnée, pour marquer des points.</div>
<form action="" method="post">
{% csrf_token %}
<table class="bac">
<thead>
<tr>
<th>Lettre</th>
{% for categorie in categories%}
<th>{{ categorie.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
<tr>
<td>{{ round.letter }}</td>
{% for response in responses %}
<td>{{ response.answer }}</td>
{% endfor %}
</tr>
</tbody>
</table>
<h1 style="color:orange">Réponse soumise.</h1>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,28 @@
{% extends 'layout.html' %}
{% load static %}
{% block extrajs %}
<script>
const csrfToken = "{{ csrf_token }}";
</script>
<script src="{% static 'js/games/bac-start.js' %}" defer></script>
<script src="{% static 'js/games/bac-utils.js' %}" defer></script>
{% endblock %}
{% block content %}
<div class="container" data-game-id="{{ game.id }}">
<h2>{{ game.name }}</h2>
<h3>Partie {{ round.round_counter }}</h3>
<h5>Status : <span id="status">{{ game.status }}</span></h5>
<p style="display:flex;flex-direction:row;">
<strong>Joueur(s) actuellement connecté(s) : </strong>
<ul id="playersList" class="inline"></ul>
</p>
<p><strong>Lien de la partie : </strong><input type="text" value="https://www.passion-retro.com/games/bac/party/{{ game.id }}/join"></p>
<center>
<button id="playButton" class="btn btn-default btn-large" style="display:none;" data-player-id="{{ request.user.id }}">Jouer !</button>
<h4 id="infoNbPlayersReady" style="display: none;">Joueurs prêt: <span id="readyCount">0</span></h4>
<p id="waitingPlayers" style="color:orange">En attente de joueurs...</p>
</center>
</div>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Le petit bac</h2>
<p>Le Petit Bac, également connu sous le nom de Baccalauréat, est un jeu de société classique qui allie réflexion, rapidité et convivialité. Que ce soit en famille, entre amis ou même en ligne, ce jeu promet des moments damusement tout en stimulant votre esprit.</p>
<p>Le principe est simple : les joueurs doivent trouver des mots correspondant à des catégories données (comme “Prénom”, “Ville”, “Animal”, “Objet”, etc.) et commençant par une lettre tirée au sort. Plus vous êtes rapide et original dans vos réponses, plus vous marquez de points ! Mais attention, les réponses répétées entre joueurs rapportent moins de points, et les erreurs ne sont pas pardonnées.</p>
<p>Accessible à tous, le Petit Bac est un excellent moyen de tester vos connaissances, de faire travailler votre créativité, et de passer un moment agréable. Alors, préparez vos stylos ou vos claviers, et que le meilleur gagne !</p>
<p>
<center><a href="{% url 'bac_start_games' %}" class="btn default btn-large">Démarrer une partie</a></center>
</p>
</div>
{% endblock %}

View file

@ -0,0 +1,59 @@
{% extends 'layout.html' %}
{% load static %}
{% block extrajs %}
<script>
const csrfToken = "{{ csrf_token }}";
</script>
<script src="{% static 'js/games/bac-play.js' %}" defer></script>
<script src="{% static 'js/games/bac-utils.js' %}" defer></script>
{% endblock %}
{% block content %}
<div class="container" data-game-id="{{ game.id }}" data-round-id="{{ round.id }}">
<h2>{{ game.name }}</h2>
<h3>Partie {{ round.round_counter }}</h3>
<h5 style="color:rgb(34, 146, 233)">Mon score actuel : {{ player.score }}</h5>
<div class="game-bac-letter">{{ round.letter }}</div>
<h5>Status : <span id="status">{{ game.status }}</span></h5>
<p style="display:flex;flex-direction:row;">
<strong>Joueurs dans le salon : </strong>
<ul id="playersList" class="inline"></ul>
</p>
<p>Le célèbre jeu du petit bac ! Le Petit Bac est un jeu où les joueurs trouvent des mots correspondant à des catégories spécifiques, en commençant par une lettre donnée, pour marquer des points.</p>
<form action="" method="post">
{% csrf_token %}
<input type="hidden" name="form_submitted" value="true">
<table class="bac responsive-table">
<thead>
<tr>
<th>Lettre</th>
{% for categorie in categories%}
<th>{{ categorie.name }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
<tr>
<td>{{ round.letter }}</td>
{% for categorie in categories%}
<td data-label="{{ categorie.name }}">
<input type="text" name="col-{{ categorie.id }}">
</td>
{% endfor %}
</tr>
</tbody>
</table>
<center>
<button id="buttonFinish" data-player-id="{{ request.user.username }}">Valider mes choix</button>
<h1 id="textFinished" style="color:orange;display:none">Vos réponses on été soumises</h1>
<div id="countdownDisplay" style="display:none;color:orange">
{% if countdown_remaining %}
Temps restant : {{ countdown_remaining }} secondes
{% endif %}
</div>
</center>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,72 @@
{% extends 'layout.html' %}
{% load static %}
{% load custom_filters %}
{% block extrajs %}
<script>
const csrfToken = "{{ csrf_token }}";
</script>
<script src="{% static 'js/games/bac-results.js' %}" defer></script>
<script src="{% static 'js/games/bac-utils.js' %}" defer></script>
{% endblock %}
{% block content %}
<div class="container" data-game-id="{{ game.id }}">
<h2>{{ game.name }}</h2>
<h5>Status : <span id="status">{{ game.status }}</span></h5>
<p style="display:flex;flex-direction:row;">
<strong>Joueur(s) actuellement connecté(s) : </strong>
<ul id="playersList" class="inline"></ul>
</p>
<!-- On affiche le resultat de chaque round -->
{% for round in rounds %}
<h3>Résultats du Round {{ round.round_counter }} - Lettre : {{ round.letter }}</h3>
<table class="bac">
<thead>
<tr>
<th>Joueur</th>
{% for categorie in categories %}
<th>{{ categorie.name }}</th>
{% endfor %}
<th>Score</th>
</tr>
</thead>
<tbody>
{% for player in players %}
<tr>
<td>{{ player.user.username }}</td>
{% for category in categories %}
<td>{{ all_organized_answers|get_item:round.id|get_item:player.id|get_item:category.id }}</td>
{% endfor %}
<td>{{ scores_by_round|get_item:round.id|get_item:player.id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endfor %}
<h3>Score Total</h3>
<table class="bac">
<thead>
<tr>
<th>Joueur</th>
<th>Score</th>
</tr>
</thead>
<tbody>
{% for player in players %}
<tr>
<td>{{ player.user.username }}</td>
<td>{{ total_scores|get_item:player.id }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<center><a href="{% url 'bac_start_new_round' game.id %}" class="btn btn-default btn-large">
{% if game.author == request.user %}
Relancer une partie
{% else %}
Rejoindre une nouvelle partie
{% endif %}
</a></center>
</div>
{% endblock %}

View file

@ -0,0 +1,61 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Portail des Jeux</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'portal_games' %}">Portail de jeux</a></li>
</ul>
<p>
Afin que les membres qui parcourent ce site web aient aussi dequoi se divertir, vous avez la possibilité sur cette page de jouer à différents jeux online. Ces jeux ont été entièrement réalisé par le fondateur de passion-retro. Vous pouvez remarquer que les jeux rapporte des points, ce qui veux dire qu'un ladderboard existe ! Soyez le meilleur, et restez le !
</p>
<div class="row">
<div class="col-3">
<div class="card-game">
<div class="header"><a href="{% url 'bac_games' %}">Le petit bac</a></div>
<div class="body">Le célèbre jeu du petit bac ! Le Petit Bac est un jeu où les joueurs trouvent des mots correspondant à des catégories spécifiques, en commençant par une lettre donnée, pour marquer des points.</div>
<div class="footer"><marquee>Jouer {{ nb_parties }} fois | Meilleur joueur : Toine | Dernière partie : {{ last_party.created }}</marquee></div>
</div>
</div>
<div class="col-3">
<div class="card-game">
<div class="header">
<a href="{% url 'quiz_home' %}">Quiz</a>
{% if pending_quizes_count > 0 %}
<span class="badge badge-warning">{{ pending_quizes_count }}</span>
{% endif %}
</div>
<div class="body">Teste tes connaissances avec des quiz variés créés par nos utilisateurs. Que tu sois passionné par la culture générale, le sport, le cinéma, ou tout autre sujet, il y a forcément un quiz fait pour toi.</div>
<div class="footer"><marquee></marquee></div>
</div>
</div>
</div>
{% if user.is_authenticated %}
<h3>Mes parties en cours</h3>
{% if games %}
<table class="bac">
<thead>
<tr>
<th>Nom</th>
<th>Statut</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for game in games %}
<tr>
<td>{{ game.name }}</td>
<td>{{ game.status }}</td>
<td>
<a href="{% url 'bac_party_games' game.id %}">Rejoindre</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p>Vous n'avez aucune partie en cours.</p>
{% endif %}
{% endif %}
</div>
{% endblock %}

View file

@ -0,0 +1,21 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Créer un quiz</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'portal_games' %}">Portail de jeux</a> »</li>
<li><a href="{% url 'quiz_home' %}">Quiz</a> »</li>
<li>Créer un quiz</li>
</ul>
<p>
Créez un quiz pour tester les connaissances des autres membres de la communauté. Vous pouvez ajouter autant de questions que vous le souhaitez, et pour chaque question, autant de réponses que vous le souhaitez. Pour chaque question, une seule réponse est correcte.
</p>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn btn-add">Créer le quiz et ajouter des réponses</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,51 @@
{% extends 'layout.html' %}
{% load static %}
{% block extrajs %}
<script src="{% static 'js/games/quiz.js' %}" defer></script>
{% endblock %}
{% block content %}
<div class="container">
<h2>{{ quiz.name }}</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'portal_games' %}">Portail de jeux</a> »</li>
<li><a href="{% url 'quiz_home' %}">Quiz</a> »</li>
<li><a href="{% url 'quiz' quiz.id %}">{{ quiz.name }}</a> »</li>
<li>Création</li>
</ul>
<p>
Créez des questions pour votre quiz. Pour chaque question, vous pouvez ajouter autant de réponses que vous le souhaitez. Pour chaque question, une seule réponse est correcte.
</p>
<form method="post">
{% csrf_token %}
<div id="questions"></div>
<a class="btn btn-default btn-small" id="add-ask">Ajouter une question</a>
<button type="submit" class="btn btn-add">Mettre à jour le quiz</button>
</form>
<h3>Questions existantes pour le quiz</h3>
<table class="quiz">
<thead>
<tr>
<th>Question</th>
<th>Réponses</th>
</tr>
</thead>
<tbody>
{% for question in quiz.questions.all %}
<tr>
<td>{{ question.question }}</td>
<td>
<ul>
{% for choice in question.choices.all %}
<li style="{% if choice.is_correct %}color:green;{% else %}color:orange;{% endif %}">{{ choice.choice }}</li>
{% endfor %}
</ul>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View file

@ -0,0 +1,71 @@
{% extends 'layout.html' %}
{% load custom_filters %}
{% block content %}
<div class="container">
<h2>Liste des quiz</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'portal_games' %}">Portail de jeux</a> »</li>
<li>Quiz</li>
</ul>
{% if request.user.is_authenticated %}
<a href="{% url 'create_quiz' %}" class="btn btn-primary">Créer un quiz</a>
{% endif %}
{% if pending_quizes_count > 0 %}
<a href="/admin/quiz/quiz/" class="btn btn-warning">Activer {{ pending_quizes_count }} quizes</a>
{% endif %}
<div class="row">
{% for quiz in quizes %}
<div class="col-5">
<div class="card-game {% if not quiz.is_active %}deactivate{% endif %}">
<div class="header">
<h3>
<a href="{% url 'quiz' quiz.id %}">{{ quiz.name }}</a>
{% if not quiz.is_active %}
<span style="color:red">Non Publié</span>
{% endif %}
</h3>
{% if quiz.id in user_scores %}
<span>Mon score: {{ user_scores|get_item:quiz.id }}/{{ quiz.questions.count }}</span>
{% endif %}
</div>
<div class="body">
<p>{{ quiz.description }}</p>
<p>{{ quiz.questions.count }} questions</p>
</div>
<div class="footer">Créé par <span class="{{ quiz.author.username_decoration }}">{{ quiz.author }}</span> le {{ quiz.created }}</div>
</div>
</div>
{% endfor %}
</div>
<h3>Mes quiz</h3>
<table class="quiz">
<thead>
<tr>
<th>Nom</th>
<th>Créé le</th>
<th>Statut</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for my_quiz in my_quizes %}
<tr>
<td><a href="{% url 'quiz' my_quiz.id %}">{{ my_quiz.name }}</a></td>
<td>{{ my_quiz.created }}</td>
<td>
{% if my_quiz.is_active %}
<span style="color:green"">Publié</span>
{% else %}
<span style="color:orangered"">Non Publié</span>
{% endif %}
</td>
<td>
<a href="{% url 'create_responses_quiz' my_quiz.id %}">Modifier</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View file

@ -0,0 +1,41 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2 class="quiz-title">{{ quiz.name }}</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'portal_games' %}">Portail de jeux</a> »</li>
<li><a href="{% url 'quiz_home' %}">Quiz</a> »</li>
<li>{{ quiz.name }}</li>
</ul>
<form method="post" class="quiz-form">
{% csrf_token %}
{% for question in questions %}
<div class="quiz-question">
<div class="question-header">Question {{ forloop.counter }}</div>
<div class="question-content">
<h3>{{ question.question }}</h3>
<div class="choices-container">
{% for choice in question.choices.all %}
<div class="choice-item">
<input type="radio"
name="question_{{ question.id }}"
value="{{ choice.id }}"
id="choice_{{ choice.id }}"
required>
<label for="choice_{{ choice.id }}">
{{ choice.choice }}
</label>
</div>
{% endfor %}
</div>
</div>
</div>
{% endfor %}
<div class="submit-container">
<button type="submit" class="submit-button">Valider mes réponses</button>
</div>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,62 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>{{ user_quiz.quiz.name }}</h2>
<ul class="breadcrumbs">
<li><a href="{% url 'portal_games' %}">Portail de jeux</a> »</li>
<li><a href="{% url 'quiz_home' %}">Quiz</a> »</li>
<li><a href="{% url 'quiz' user_quiz.quiz.id %}">{{ user_quiz.quiz.name }}</a> »</li>
<li>Résultas</li>
</ul>
<div class="quiz-result-card">
<!-- Progress Circle -->
<div class="progress-circle-container">
<div class="progress-circle">
<svg viewBox="0 0 36 36" class="circular-chart">
<!-- Cercle de fond -->
<path d="M18 2.0845
a 15.9155 15.9155 0 0 1 0 31.831
a 15.9155 15.9155 0 0 1 0 -31.831"
stroke="#eee"
fill="none"
stroke-width="3"/>
<!-- Cercle de progression -->
<path d="M18 2.0845
a 15.9155 15.9155 0 0 1 0 31.831
a 15.9155 15.9155 0 0 1 0 -31.831"
stroke-dasharray="{{ percentage }}, 100"
class="progress-path {% if percentage >= 75 %}high{% elif percentage >= 50 %}medium{% else %}low{% endif %}"
fill="none"
stroke-width="3"/>
</svg>
<div class="percentage-text">
{{ percentage|floatformat:0 }}%
</div>
</div>
</div>
<!-- Score Details -->
<div class="score-details">
<h3>Score final</h3>
<div class="score-number {% if percentage >= 75 %}high{% elif percentage >= 50 %}medium{% else %}low{% endif %}">
{{ user_quiz.score }} / {{ total_questions }}
</div>
<p class="score-message">
{% if percentage >= 75 %}
🎉 Excellent travail !
{% elif percentage >= 50 %}
🎯 Bon effort !
{% else %}
💪 Continue tes efforts !
{% endif %}
</p>
</div>
<!-- Actions -->
<div class="actions">
<a href="{% url 'quiz_home' %}" class="btn btn-large">Retour aux quiz</a>
</div>
</div>
</div>
{% endblock %}

36
templates/home.html Executable file
View file

@ -0,0 +1,36 @@
{% extends 'layout.html' %}
{% load users_custom_tags %}
{% load bbcode_tags %}
{% block content %}
<div class="container">
<h2>{{ edito.title }}</h2>
<p>{{ edito.content|linebreaksbr }}</p>
<p class="date"><em>Dernière mise à jour de l'éditorial le {{ edito.updated|date:" d F Y à H:i" }}</em></p>
</div>
<div class="container">
<h2>Actus</h2>
<div class="header">
<!-- Si l'utilisateur est admin ou du groupe Administrateurs ou du groupe Rédacteur -->
{% if user.is_authenticated %}
{% if user|has_group:"Administrateurs" or user|has_group:"Super Admin" or user|has_group:"Rédacteur" %}
<p><a href="{% url 'create_news' 'news' %}" class="btn btn-add">+</a></p>
{% endif %}
{% endif %}
</div>
<div class="row">
{% for actus in news %}
<div class="col col-5">
<div class="news-header">
<h3>{{ actus.title }} </h3>
</div>
<div class="news">
<div style="float:left;margin:5px"><img src="/media/{{ actus.image }}" style="max-width: 100px;" alt="{{ actus.title }}"></div>
<p>{{ actus.content|bbcode|safe|linebreaksbr|truncatewords:50 }} » <a href="{% url 'view_post' actus.slug %}">Lire l'actu</a></p><br>
<p class="date"><em>Publié le {{ actus.created|date:" d F Y à H:i" }}</em> Par <a href="{% url 'profile' actus.author.id %}" class="{{ request.user.username_decoration }}" data-text="{{ actus.author.username }}">{{ actus.author.username }}</a></p>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

97
templates/layout.html Executable file
View file

@ -0,0 +1,97 @@
{% load static %}
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Passion Rétro - Communauté des Passionnés de Jeux, Films et Séries Rétro</title>
<!-- Balises méta pour le SEO -->
<meta name="description" content="Rejoignez Passion Rétro, la communauté dédiée aux passionnés de jeux, films et séries des années 80 et 90. Découvrez des contenus exclusifs et partagez votre passion !">
<meta name="keywords" content="passion retro, passion rétro, rétro, jeux, films, séries, communauté, années 80, années 90">
<meta name="robots" content="index, follow">
<meta name="author" content="Passion Rétro Team">
<!-- Open Graph -->
<meta property="og:title" content="Passion Rétro - Communauté des Passionnés de Jeux, Films et Séries Rétro">
<meta property="og:description" content="Rejoignez Passion Rétro, la communauté dédiée aux passionnés de jeux, films et séries des années 80 et 90. Découvrez des contenus exclusifs et partagez votre passion !">
<meta property="og:image" content="{% static 'images/logo.png' %}">
<meta property="og:url" content="https://www.passionretro.com">
<meta property="og:type" content="website">
<!-- Twitter Cards -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Passion Rétro - Communauté des Passionnés de Jeux, Films et Séries Rétro">
<meta name="twitter:description" content="Rejoignez Passion Rétro, la communauté dédiée aux passionnés de jeux, films et séries des années 80 et 90. Découvrez des contenus exclusifs et partagez votre passion !">
<meta name="twitter:image" content="{% static 'images/logo.png' %}">
<meta name="twitter:site" content="@PassionRetro">
<!-- CSS -->
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/grid.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/colors.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/styles.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/animations.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/decorations.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/forms.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/typo.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/structure.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/banner.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/gallery.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/post.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/games.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/pm.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/profile.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/shop.css">
<link rel="stylesheet" href="{% static 'themes/' %}{{ request.theme_active }}/bbcode.css">
<link rel="stylesheet" href="{% static 'themes/' %}generic.css">
<link rel="stylesheet" href="{% static 'themes/' %}error.css">
<link rel="stylesheet" href="{% static 'themes/' %}border-avatars.css">
<link rel="stylesheet" href="{% static 'themes/' %}decoration-username.css">
<link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-coy.min.css" rel="stylesheet" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/prism.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
<script src="{% static 'js/utils/bbcode_display.js' %}"></script>
<script src="{% static 'js/utils/functions.js' %}" defer></script>
<script src="{% static 'js/utils/multiple_posts.js' %}" defer></script>
{% block extrajs %}{% endblock %}
</head>
<body>
{% include './components/banner.html' %}
<div class="row">
{% if request.theme_active != '00s' and request.theme_active != 'rpg' %}
<div class="col col-2">
{% endif %}
{% if request.theme_active != '00s' and request.theme_active != 'rpg' %}
{% include './components/left_menu.html' %}
{% else %}
{% include './components/horizontal_menu.html' %}
{% endif %}
{% if request.theme_active == '00s' or request.theme_active == 'rpg' %}
<div class="col col-9">
{% else %}
</div>
<div class="col col-7">
{% endif %}
{% if messages %}
<div class="notification">
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% block content %}{% endblock %}
</div>
<div class="col col-2">
{% include './components/right_menu.html' %}
</div>
</div>
<div class="footer"><p>
www.passion-retro.com &copy;2024 - 2025. Icônes par icon8<br>
Hebergé fièrement par <a href="https://www.toviohost.com" target="_blank">TovioHost</a>
</p></div>
</body>
</html>

151
templates/layouts/00s.html Normal file
View file

@ -0,0 +1,151 @@
{% block body %}
<div class="banner-container">
<div class="banner">
<div class="galaxy-background"></div>
<div class="banner-text" id="bannerText">Passion Retro</div>
<div class="slogan">Bienvenue sur le portail web 100% Rétro ! Attention, ce site web n'est pas conseillé aux personnes nées après 2005 sous peine de crise existensielle.</div>
</div>
</div>
<div class="row">
<div class="col col-2">
<div class="menu">
<h2>Communauté</h2>
<ul>
<li><a href="{% url 'home' %}">Accueil</a></li>
<li><a href="{% url 'forum_home' %}">Forum</a></li>
<li><a href="{% url 'portal_games' %}" class="new-item-menu">Portail des jeux</a></li>
<li><a href="{% url 'contribute' %}" class="btn btn-add">Contribuer</a></li>
</ul>
</div>
<div class="menu">
<h2>Jeux</h2>
<ul>
{% for games in request.posts_games %}
<li><a href="{% url 'view_post' games.slug %}">{{ games.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Films & Series</h2>
<ul>
{% for movies in request.posts_movies %}
<li><a href="{% url 'view_post' movies.slug %}">{{ movies.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Musique</h2>
<ul>
{% for music in request.posts_music %}
<li><a href="{% url 'view_post' music.slug %}">{{ music.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Technologies</h2>
<ul>
{% for internet in request.posts_internet %}
<li><a href="{% url 'view_post' technology.slug %}">{{ internet.title }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="col col-7">
{% if messages %}
<div class="notification">
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% block content %}{% endblock %}
</div>
<div class="col col-2">
<div class="menu">
<h2>Membre</h2>
<ul>
<!-- Si le membre est connecté -->
{% if request.user.is_authenticated %}
<center><img src="/media/{{ request.user.avatar }}" style="width:150px;" alt="Avatar de {{ request.user.username }}"></center>
<li>Bonjour <strong>{{ request.user.username }}</strong></li>
<li><a href="{% url 'profile' %}">Mon Profil</a></li>
<li><a href="{% url 'contributions' %}">Mes contributions</a></li>
<li>
<form id="logout-form" action="{% url 'logout' %}" method="post" style="display: none;">
{% csrf_token %}
</form>
<a href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">Déconnexion</a>
</li>
<!-- Si c'est un admin -->
{% if request.user.is_staff %}
<li>
<a href="/admin/posts/post/?active__exact=0">
Articles en attente
</a>
{% if pending_posts_count > 0 %}
<span class="badge badge-warning">{{ pending_posts_count }}</span>
{% endif %}
</li>
<li><a href="/admin" target="_blank" class="danger">Administration</a></li>
{% endif %}
<!-- Si le membre n'est pas connecté -->
{% else %}
<li>
<form action="{% url 'login' %}" method="post" class="incol">
{% csrf_token %}
<input type="text" name="username" placeholder="Nom d'utilisateur">
<input type="password" name="password" placeholder="Mot de passe">
<button>Connexion</button>
</form>
</li>
<li><a href="{% url 'register' %}">Inscription</a></li>
{% endif %}
</ul>
</div>
<div class="menu">
<h2>Livre d'Or</h2>
<ul class="guestbook">
{% for message in request.guestbook %}
<li><span class="date">[{{ message.created }}]</span> <span class="author">{{ message.author }}</span> : {{ message.content }}</li>
{% endfor %}
</ul>
<ul>
<li>{{ request.total_guestbook }} messages dans le livre d'or</li>
</ul>
<center><a href="{% url 'guestbook_home' %}#form" class="btn btn-add">Laisser un message</a></center>
</div>
<div class="menu">
<h2>Stats Site</h2>
<ul>
<li>Membres : {{ request.total_users }}</li>
<li>Dernier inscrit : <a href="{% url 'profile' request.last_user.id %}">{{ request.last_user }}</a></li>
<li>Visiteurs : {{ request.visitor_count }}</li>
<li>Nombre de visites totales : {{ request.total_visitor_count }}</li>
</ul>
</div>
<div class="menu">
<h2>Stats Forum</h2>
<ul>
<li>Messages : {{ request.total_posts }}</li>
<li>Sujets : {{ request.total_topics }}</li>
{% if request.last_topic %}
<li>Dernier Sujet créer : <a href="{% url 'post_list' request.last_topic.forum.id request.last_topic.id %}">{{ request.last_topic.title }}</a></li>
{% else %}
<li>Dernier Sujet créer : Aucun</li>
{% endif %}
{% if request.last_post %}
<li>Dernier Message : <a href="{% url 'post_list' request.last_post.topic.forum.id request.last_post.topic.id %}">{{ request.last_post.topic.title }}</a></li>
{% else %}
<li>Dernier Message : Aucun</li>
{% endif %}
</ul>
</div>
</div>
</div>
<div class="footer"><p>
www.passion-retro.com &copy;2024 - 2025. Icônes par icon8<br>
Hebergé fièrement par <a href="https://www.toviohost.com" target="_blank">TovioHost</a>
</p></div>
{% endblock %}

View file

@ -0,0 +1,151 @@
{% block body %}
<div class="banner-container">
<div class="banner">
<div class="galaxy-background"></div>
<div class="banner-text" id="bannerText">Passion Retro</div>
<div class="slogan">Bienvenue sur le portail web 100% Rétro ! Attention, ce site web n'est pas conseillé aux personnes nées après 2005 sous peine de crise existensielle.</div>
</div>
</div>
<div class="row">
<div class="col col-2">
<div class="menu">
<h2>Communauté</h2>
<ul>
<li><a href="{% url 'home' %}">Accueil</a></li>
<li><a href="{% url 'forum_home' %}">Forum</a></li>
<li><a href="{% url 'portal_games' %}" class="new-item-menu">Portail des jeux</a></li>
<li><a href="{% url 'contribute' %}" class="btn btn-add">Contribuer</a></li>
</ul>
</div>
<div class="menu">
<h2>Jeux</h2>
<ul>
{% for games in request.posts_games %}
<li><a href="{% url 'view_post' games.slug %}">{{ games.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Films & Series</h2>
<ul>
{% for movies in request.posts_movies %}
<li><a href="{% url 'view_post' movies.slug %}">{{ movies.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Musique</h2>
<ul>
{% for music in request.posts_music %}
<li><a href="{% url 'view_post' music.slug %}">{{ music.title }}</a></li>
{% endfor %}
</ul>
</div>
<div class="menu">
<h2>Technologies</h2>
<ul>
{% for internet in request.posts_internet %}
<li><a href="{% url 'view_post' technology.slug %}">{{ internet.title }}</a></li>
{% endfor %}
</ul>
</div>
</div>
<div class="col col-7">
{% if messages %}
<div class="notification">
<ul class="messages">
{% for message in messages %}
<li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
{% endfor %}
</ul>
</div>
{% endif %}
{% block content %}{% endblock %}
</div>
<div class="col col-2">
<div class="menu">
<h2>Membre</h2>
<ul>
<!-- Si le membre est connecté -->
{% if request.user.is_authenticated %}
<center><img src="/media/{{ request.user.avatar }}" style="width:150px;" alt="Avatar de {{ request.user.username }}"></center>
<li>Bonjour <strong>{{ request.user.username }}</strong></li>
<li><a href="{% url 'profile' %}">Mon Profil</a></li>
<li><a href="{% url 'contributions' %}">Mes contributions</a></li>
<li>
<form id="logout-form" action="{% url 'logout' %}" method="post" style="display: none;">
{% csrf_token %}
</form>
<a href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">Déconnexion</a>
</li>
<!-- Si c'est un admin -->
{% if request.user.is_staff %}
<li>
<a href="/admin/posts/post/?active__exact=0">
Articles en attente
</a>
{% if pending_posts_count > 0 %}
<span class="badge badge-warning">{{ pending_posts_count }}</span>
{% endif %}
</li>
<li><a href="/admin" target="_blank" class="danger">Administration</a></li>
{% endif %}
<!-- Si le membre n'est pas connecté -->
{% else %}
<li>
<form action="{% url 'login' %}" method="post" class="incol">
{% csrf_token %}
<input type="text" name="username" placeholder="Nom d'utilisateur">
<input type="password" name="password" placeholder="Mot de passe">
<button>Connexion</button>
</form>
</li>
<li><a href="{% url 'register' %}">Inscription</a></li>
{% endif %}
</ul>
</div>
<div class="menu">
<h2>Livre d'Or</h2>
<ul class="guestbook">
{% for message in request.guestbook %}
<li><span class="date">[{{ message.created }}]</span> <span class="author">{{ message.author }}</span> : {{ message.content }}</li>
{% endfor %}
</ul>
<ul>
<li>{{ request.total_guestbook }} messages dans le livre d'or</li>
</ul>
<center><a href="{% url 'guestbook_home' %}#form" class="btn btn-add">Laisser un message</a></center>
</div>
<div class="menu">
<h2>Stats Site</h2>
<ul>
<li>Membres : {{ request.total_users }}</li>
<li>Dernier inscrit : <a href="{% url 'profile' request.last_user.id %}">{{ request.last_user }}</a></li>
<li>Visiteurs : {{ request.visitor_count }}</li>
<li>Nombre de visites totales : {{ request.total_visitor_count }}</li>
</ul>
</div>
<div class="menu">
<h2>Stats Forum</h2>
<ul>
<li>Messages : {{ request.total_posts }}</li>
<li>Sujets : {{ request.total_topics }}</li>
{% if request.last_topic %}
<li>Dernier Sujet créer : <a href="{% url 'post_list' request.last_topic.forum.id request.last_topic.id %}">{{ request.last_topic.title }}</a></li>
{% else %}
<li>Dernier Sujet créer : Aucun</li>
{% endif %}
{% if request.last_post %}
<li>Dernier Message : <a href="{% url 'post_list' request.last_post.topic.forum.id request.last_post.topic.id %}">{{ request.last_post.topic.title }}</a></li>
{% else %}
<li>Dernier Message : Aucun</li>
{% endif %}
</ul>
</div>
</div>
</div>
<div class="footer"><p>
www.passion-retro.com &copy;2024 - 2025. Icônes par icon8<br>
Hebergé fièrement par <a href="https://www.toviohost.com" target="_blank">TovioHost</a>
</p></div>
{% endblock %}

View file

@ -0,0 +1,29 @@
<!doctype html>
<html>
<head>
<title>Site en Maintenance</title>
<meta charset="UTF-8">
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'themes/grid.css' %}">
<style>
h1 { font-size: 50px; }
body { background:#fff; font: 20px Helvetica, sans-serif; color: #333; }
article { display: block; text-align: left; width: 650px; margin: 0 auto; }
a { color: #dc8100; text-decoration: none; }
a:hover { color: #333; text-decoration: none; }
</style>
</head>
<body>
<article>
<div>
<center><img src="/static/img/maintenance/maintenance.jpeg" style="width:300px" /></center>
</div>
<h1>{{ message.name }}</h1>
<div>
{{ message.content|safe }}
<p>&mdash; Ton équipe favorite</p>
</div>
</article>
<center><small><a href="/admin/">Administration</a></small></center>
</body>
</html>

View file

@ -0,0 +1,29 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Messagerie privée</h2>
<div class="table">
<a href="{% url 'pm_new' %}" class="btn btn-add">Nouveau message</a>
<!-- Header -->
<div class="header">
<div class="col">Auteur</div>
<div class="col">Titre message</div>
<div class="col">Action</div>
</div>
<!-- Body -->
{% for message in private_messages %}
<div class="body">
<div class="col">
{% if message.messages.first.author.id != request.user.id and not message.is_read %}
<span class="new-message">nouveau !</span>
{% endif %}
<a href="{% url 'profile' message.sender.id %}">{{ message.sender }}</a>
</div>
<div class="col"><a href="{% url 'pm_view' message.id %}">{{ message.subject }}</a></div>
<div class="col"><a href="{% url 'pm_delete' message.id %}">Supprimer</a></div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Nouveau message</h2>
<form method="post">
{% csrf_token %}
{{ form_subject.as_p }}
{{ form_message.as_p }}
<button>Envoyer</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,52 @@
{% extends 'layout.html' %}
{% load forum_extras %}
{% load users_custom_tags %}
{% load paginator_tag %}
{% load bbcode_tags %}
{% block content %}
<div class="container">
<h2>Messagerie privée</h2>
<h3>{{ pm_message.subject }}</h3>
{% for message in private_messages %}
<div class="forum">
<div class="forum-header" id="{{ message.id }}">
<div class="forum-column-detail">
<div class="row">
le {{ message.date_sent }}
</div>
</div>
</div>
<div class="forum-body">
<div class="forum-row">
<div class="forum-column-detail details">
<center><div class="{{ post.author.border_avatar }}"><img src="/media/{{ message.author.avatar }}" style="width:100px;" alt="Avatar de {{ message.author.username }}"></div></center>
<small>
<ul>
<li style="font-size:1.2rem;">
<center><span class="{{ message.author.username_decoration }}">{{ message.author.username }}</span></center>
</li>
</ul>
</small>
</div>
<div class="forum-column-detail">
<span id="message-{{ message.id }}">{{ message.message|bbcode|safe|linebreaksbr }}</span>
<div class="footer-message" style="margin-top:50px;">
<hr>
<p style="padding: 10px;">{{ message.author.biography|bbcode|safe|linebreaksbr }}</p>
{% if message.created|date:"Y-m-d H:i:s" != message.updated|date:"Y-m-d H:i:s" %}
<span style="font-style:italic;font-size: 0.8rem;">modifié le {{ message.updated }}</span>
{% endif %}
</div>
</div>
</div><br>
</div>
</div>
{% endfor %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button>Envoyer</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,17 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Créer un Post</h2>
<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ post_form.as_p }}
{% if type == 'news' %}
<label for="image">Image</label>
<input type="file" name="image" id="image">
{% endif %}
<br>
<button type="submit" class="btn btn-primary">Créer</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,17 @@
{% extends "layout.html" %}
{% block content %}
<div class="container">
<h2>Modifier le post : {{ post.title }}</h2>
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<div class="form-inline">
<button type="submit" class="btn btn-primary">Enregistrer</button>
<a href="{% url 'contributions' %}" class="btn btn-danger">Annuler</a>
</div>
</form>
</div>
{% endblock %}

11
templates/posts/news.html Executable file
View file

@ -0,0 +1,11 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>{{ news.title }}</h2>
<hr> <div style="float:left;margin:5px"><img src="/media/{{ news.image }}" style="max-width: 200px;" alt="{{ news.title }}"></div>
<p>{{ news.content|linebreaksbr }}</p>
<p style="text-align: center;"><a href="/{{ news.forum_link }}" class="btn btn-default">Participer au sujet sur le forum</a></p>
</div>
{% endblock %}

37
templates/posts/post.html Executable file
View file

@ -0,0 +1,37 @@
{% extends 'layout.html' %}
{% load bbcode_tags %}
{% block content %}
<div class="container">
<h2>{{ post.title }}</h2>
{% if post.parent %}
{% if subposts %}
<div class="postmenu">
<div class="header">Menu</div>
<div class="body">
<ul>
{% for subpost in subposts %}
<li><a href="{% url 'view_post' subpost.slug %}">{{ subpost.title }}</a></li>
{% endfor %}
</ul>
</div>
</div>
{% endif %}
{% else %}
{% if post.post_parent %}
<ul class="breadcrumbs">
<li><a href="{% url 'view_post' post.post_parent.slug %}">{{ post.post_parent.title }}</a> »</li>
<li>{{ post.title }}</li>
</ul>
{% endif %}
{% endif %}
{% if post.type == 'news' %}
<div style="float:left;margin:5px"><img src="/media/{{ post.image }}" style="max-width: 200px;" alt="{{ post.title }}"></div>
{% endif %}
<p>{{ post.content|bbcode|safe|linebreaksbr }}</p>
{% if post.type == 'news' %}
<p style="text-align: center;"><a href="/{{ post.forum_link }}" class="btn btn-default">Participer au sujet sur le forum</a></p>
{% endif %}
<small>Article créer le {{ post.created }} par <a href="{% url 'profile' post.author.id %}" class="{{ request.user.username_decoration }}">{{ post.author.username }}</a></small>
</div>
{% endblock %}

50
templates/shop/home.html Normal file
View file

@ -0,0 +1,50 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Boutique</h2>
<div style="float:right;margin:5px;"><img src="/static/img/retrobot.png" style="max-width: 200px;border-bottom:3px solid black;" alt="RetroBot"></div>
<p>
Salut, voyageur temporel ! Moi, RetroBot, jai ouvert ma boutique rien que pour toi sur Passion-Rétro ! 🎉
</p>
<p>
Ici, tu trouveras tout un tas de trésors exclusifs pour personnaliser ton expérience sur le site.
Envie dun avatar unique qui claque ? Dune déco pour ton pseudo qui en jette ? Ou peut-être dun cadre davatar rétro pour te démarquer dans la communauté ? Je propose aussi des thèmes originaux pour que ton espace perso soit à ton image : vintage, chic, ou carrément décalé.
Alors, quattends-tu pour venir découvrir mes trouvailles ? Allez, fonce, et fais briller ton style rétro comme jamais ! ✨
</p>
— RetroBot, ton fidèle marchand venu de Retronia 🛠️
</p>
<h3>Mon argent : <span class="bag">{{ request.user.money }}</span></h3>
<div class="shop">
{% for item in items %}
{% if item.name != 'Or' %}
<div class="card-shop">
{% if item.category.name == 'Décoration pseudo' %}
<center><span class="{{ item.name|slugify }}" style="font-size: 1.5rem;border:1px solid black; padding:5px">Pseudo</span></center>
{% else %}
<center><div class="card-img {% if item.category.name == 'cadres' %}{{ item.name|slugify }}{% endif %}"><img src="/media/{{ item.image }}" alt="{{ item.name }}"></div></center>
{% endif %}
<div class="card-body">
<h5 class="card-title">{{ item.name }}</h5>
<p class="card-text">{{ item.description }}</p>
<p class="card-text">Prix : <span class="money">{{ item.price }}</span> <i class="fas fa-coins"></i></p>
<a onclick="modal('{{ item.id }}', '{{ item.price }}')" class="btn-shop btn-shop-primary">Acheter</a>
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
<div class="modal">
<div class="modal-item">
<div class="modal-close">&times;</div>
<div class="modal-header">Achat d'un item</div>
<div class="modal-body">
<p>Payer et obtenir cet item ?</p>
<a class="btn-shop btn-shop-primary btn-shop-large" id="accept"></a>
<a class="btn-shop btn-shop-secondary" id="decline">Annuler</a>
</div>
<div class="modal-footer"></div>
</div>
</div>
{% endblock %}

34
templates/users/contribute.html Executable file
View file

@ -0,0 +1,34 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Contribuer à la communauté</h2>
<div class="news">
<p>Passion Retro est avant tout un site communautaire, façonné par ses membres. Ici, tu as la possibilité de participer activement en ajoutant des articles, des dossiers ou même des catégories !</p>
<p>Cependant, pour préserver la qualité et lesprit nostalgique du site, toutes les contributions sont soumises à une approbation manuelle. Cela permet de garder un contenu authentique et en accord avec notre vision dun web rétro, loin des excès modernes.</p>
<p>Chaque membre a ainsi la chance dapporter sa pierre à lédifice, et ensemble, nous pouvons forger la plus grande communauté francophone dédiée au rétro.</p>
<p>Rejoins-nous dans cette aventure et aide-nous à faire vivre lhéritage dun internet révolu !</p>
<p style="color:orange"><u>Précision : </u>pour tous les articles, dossiers, et autres forme d'éditions que tu propposes à la contribution, tu t'engage à la cession intelectuel de tes oeuvres.</p>
</div>
<div class="row">
<div class="col col-3 contrib games">
<a href="{% url 'form_contribute' 'games' %}">Article Jeu Vidéo</a>
</div>
<div class="col col-3 contrib movies">
<a href="{% url 'form_contribute' 'movies' %}">Article Film & Series</a>
</div>
<div class="col col-3 contrib musics">
<a href="{% url 'form_contribute' 'music' %}">Article Musique</a>
</div>
<div class="col col-3 contrib tech">
<a href="{% url 'form_contribute' 'tech' %}">Article Technologie</a>
</div>
<div class="col col-3 contrib news_contrib">
<a href="{% url 'form_contribute' 'news' %}">Actus</a>
</div>
<div class="col col-3 contrib category">
<a href="{% url 'form_contribute' 'category' %}">Nouvelle catégorie</a>
</div>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,35 @@
{% extends 'layout.html' %}
{% load bbcode_tags %}
{% block content %}
<div class="container">
<h2>Mes contributions</h2>
<div>
<p>Tu as accès ici à l'ensemble de tes contributions pour le site. Il t'est possible de modifier chaques articles. Lorsque tu souhaites supprimer un article ou un dossier entier, la demande est enregistrée et en attente d'approbation.</p>
<p style="color:orange"><u>Précision : </u>pour tous les articles, dossiers, et autres forme d'éditions que tu propposes à la contribution, tu t'engage à la cession intelectuel de tes oeuvres.</p>
</div>
<h3>Mes dossiers & articles</h2>
<div class="grid">
{% for post in posts %}
<div class="col col-5">
<div class="post-card-header" style="display:flex;flex-direction:row;justify-content: space-between;">
<h3>{{ post.title }} </h3>
{% if post.post_parent_id == None %}
<span style="color:orange;font-weight:bold;margin:5px;">Dossier</span>
{% endif %}
{% if post.active == False %}
<span class="post-offline"></span>
{% else %}
<span class="post-online"></span>
{% endif %}
</div>
<div class="post-card">
<p>{{ post.content|bbcode|safe|linebreaksbr|truncatewords:25 }} » <a href="{% url 'view_post' post.slug %}">Lire</a></p><br>
<p class="date"><em>Publié le {{ post.created|date:" d F Y à H:i" }}</em> Par <a href="{% url 'profile' post.author.id %}" class="{{ post.author.username_decoration }}">{{ post.author.username }}</a></p>
<p><a href="{% url 'edit_post' post.id %}" class="btn btn-warning">Modifier</a></p>
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,30 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
{% if type == 'games' %}
<h2>Créer un article Jeux vidéos</h2>
{% elif type == 'movies' %}
<h2>Créer un article Film & Series</h2>
{% elif type == 'musics' %}
<h2>Créer un article Musique</h2>
{% elif type == 'tech' %}
<h2>Créer un article Technologie</h2>
{% elif type == 'news_contrib' %}
<h2>Créer une actualité</h2>
{% elif type == 'category' %}
<h2>Créer une nouvelle catégorie</h2>
{% endif %}
<form action="" method="post">
{% csrf_token %}
<div class="form-inline">
<select id="post_type">
<option value="solo">Article seul</option>
<option value="multiple">Ensemble d'article</option>
</select>
{{ form.title }}
</div>
{{ form.content }}
<div class="form-inline" id="submit"><button id="submit-button">Créer</button></div>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Login</h2>
<p>Pas encore inscrit ? <a href="{% url 'register' %}">Inscrivez-vous</a></p>
<p class="login-info">En vous connectant, vous aurez accès à des fonctionnalités exclusives, telles que la gestion de vos cours, la participation aux discussions et la personnalisation de votre profil. Rejoignez notre communauté et profitez pleinement de tout ce que notre site a à offrir.</p>
<form method="post" class="login-form">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="btn-submit">Connexion</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,158 @@
{% extends 'layout.html' %}
{% load bbcode_tags %}
{% block content %}
<div class="container">
{% block profile-nav %}
{% include "../components/profile_nav.html" %}
{% endblock %}
<div class="profile-grid">
<!-- Colonne de gauche -->
<div class="profile-main">
<div class="profile-header">
<div class="avatar-container">
<div class="level-badge">
<span class="level-text">LEVEL</span>
<span class="level-number">{{ user.level.level }}</span>
</div>
</div>
<div class="profile-info">
<h2 class="username">{{ user.username }}</h2>
{% if user == request.user %}
Prochain niveau: {{ request.user.experience_left }} XP
{% endif %}
<p class="joined-date">Membre depuis le {{ user.date_joined|date:"d F Y" }}</p>
{% if user.first_name or user.last_name %}
<p class="real-name">{{ user.first_name }} {{ user.last_name }}</p>
{% endif %}
</div>
</div>
<div class="profile-bio">
<h3>Biographie</h3>
<div class="bio-content">
{{ user.biography|bbcode|safe|linebreaksbr|default:"Aucune biographie disponible" }}
</div>
</div>
</div>
<!-- Colonne de droite -->
<div class="profile-stats">
<div class="stats-card">
<h3>Statistiques</h3>
<div class="stats-grid">
<div class="stat-item">
<span class="stat-value">{{ forum_posts }}</span>
<span class="stat-label">Messages</span>
</div>
<div class="stat-item">
<span class="stat-value">{{ topics }}</span>
<span class="stat-label">Sujets</span>
</div>
<div class="stat-item">
<span class="stat-value">{{ posts }}</span>
<span class="stat-label">Articles</span>
</div>
<div class="stat-item">
<span class="stat-value">{{ user.level.experience }}</span>
<span class="stat-label">XP</span>
</div>
<div class="stat-item">
<span class="stat-value">{{ user.level.coins }}</span>
<span class="stat-label">Pièces</span>
</div>
</div>
</div>
<div class="achievements-card">
<h3>Badges</h3>
<div class="achievements-grid">
{% for badge in user.badges.all %}
<div class="badge-item" title="{{ badge.description }}">
<img src="{{ badge.image.url }}" alt="{{ badge.name }}">
<span class="badge-name">{{ badge.name }}</span>
</div>
{% empty %}
<p class="no-badges">Aucun badge pour le moment</p>
{% endfor %}
</div>
</div>
</div>
</div>
{% if user.id == request.user.id %}
<div class="inventory">
<h3>Inventaire</h3>
<div class="inventory-grid">
{% for inventory in request.user.inventory.all %}
{%if inventory.item.name != 'Or' %}
<a href="{% url 'use_item' inventory.item.id %}">
{% endif %}
<div class="inventory-item" id="bubbleinfo">
<span class="item-name">
{% if inventory.item.category.name == 'Décoration pseudo' %}
<center><span id="item" data-info="{{ inventory.item }} : {{ inventory.item.description }}" class="{{ inventory.item.name|slugify }}" style="font-size: 1.5rem">{{ request.user }}</span></center>
{% else %}
{% if inventory.item.category.name == 'cadres' %}
<center><div class="{{ inventory.item.name|slugify }}""><img src="/media/{{ request.user.avatar }}" style="width:100px;" alt=""></div></center>
{% else %}
<img id="item" data-info="{{ inventory.item }} : {{ inventory.item.description }}" src="/media/shop/items/{{ inventory.item.image }}" alt="{{ inventory.item }} : {{ inventory.item.description }}">
{% endif %}
{% endif %}
</span>
<span class="item-quantity">{{ inventory.quantity }}</span>
<div id="div-bubble" style="
display: none;
position: absolute;
background-color: rgba(0, 0, 0, 0.5);
color: white;
text-shadow: none;
padding: 10px;
border-radius: 5px;
top: 0px;
left: 0px;
z-index: 9998;
"></div>
</div>
{%if inventory.item != 'Or' %}
</a>
{% endif %}
{% empty %}
<p class="no-items">
Aucun objet dans l'inventaire
</p>
{% endfor %}
</div>
</div>
<div class="profile-actions">
<a href="{% url 'profile_update' %}" class="btn btn-default">Modifier le profil</a>
<!-- <a href="" class="btn btn-warning">Voir l'inventaire</a> -->
</div>
{% endif %}
</div>
<script type="text/javascript">
document.addEventListener('DOMContentLoaded', () => {
const bubble = document.querySelector('#bubbleinfo');
console.log(bubble);
if (!bubble) {
console.error('Element with ID "bubbleinfo" not found.');
return;
}
const item = bubble.querySelector('#item');
const div = document.querySelector('#div-bubble');
let info = item.dataset.info;
bubble.addEventListener('mouseover', function() {
div.style.top = item.offsetTop + -10 + 'px';
div.style.left = item.offsetLeft +'px';
div.textContent = info;
div.style.display = 'block';
});
bubble.addEventListener('mouseout', function() {
div.style.display = 'none';
});
})
</script>
{% endblock %}

View file

@ -0,0 +1,11 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Update Profile</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ user_form.as_p }}
<button type="submit">Modifier</button>
</form>
</div>
{% endblock %}

View file

@ -0,0 +1,13 @@
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<h2>Register</h2>
<form method="post" class="login-form">
{% csrf_token %}
{{ form.as_p }}
<script src='https://www.google.com/recaptcha/api.js'></script>
<div class="g-recaptcha" style="margin-left:50px" data-sitekey="{{ GOOGLE_PUBLIC_KEY }}"></div>
<button type="submit" class="btn-submit">S'inscire</button>
</form>
</div>
{% endblock %}