From 16897b601097911fb36ac94296d23b4003a99074 Mon Sep 17 00:00:00 2001 From: mrtoine Date: Wed, 10 Dec 2025 19:42:08 +0100 Subject: [PATCH] Remove all migration files and unused CSS files from the project. --- core/context_processor.py | 5 + courses/migrations/0001_initial.py | 35 - courses/migrations/0002_course_thumbnail.py | 18 - ...03_lesson_author_alter_course_thumbnail.py | 23 - ...0004_remove_lesson_author_course_author.py | 22 - .../0005_rename_author_course_old_author.py | 18 - courses/migrations/0006_course_author.py | 21 - .../migrations/0007_convert_old_authors.py | 21 - ...e_course_old_author_alter_course_author.py | 26 - courses/models.py | 25 +- data78HyT4mloSq_Gt.sqlite3 | Bin 217088 -> 0 bytes devart/settings.py | 2 + static/css/colors_dark.css | 164 ----- static/css/colors_light.css | 149 ----- static/css/design.css | 455 ------------- static/css/forms.css | 98 --- static/css/profile.css | 95 --- static/css/tabs.css | 33 - static/css/utils.css | 46 -- static/js/functions.js | 49 +- staticfiles/css/colors_dark.css | 164 ----- staticfiles/css/colors_light.css | 149 ----- staticfiles/css/design.css | 599 ------------------ staticfiles/css/profile.css | 55 -- templates/home.html | 84 ++- templates/layout.html | 142 +++-- templates/partials/_footer.html | 38 +- templates/partials/_header.html | 7 +- 28 files changed, 265 insertions(+), 2278 deletions(-) create mode 100644 core/context_processor.py delete mode 100644 courses/migrations/0001_initial.py delete mode 100644 courses/migrations/0002_course_thumbnail.py delete mode 100644 courses/migrations/0003_lesson_author_alter_course_thumbnail.py delete mode 100644 courses/migrations/0004_remove_lesson_author_course_author.py delete mode 100644 courses/migrations/0005_rename_author_course_old_author.py delete mode 100644 courses/migrations/0006_course_author.py delete mode 100644 courses/migrations/0007_convert_old_authors.py delete mode 100644 courses/migrations/0008_remove_course_old_author_alter_course_author.py delete mode 100644 data78HyT4mloSq_Gt.sqlite3 delete mode 100644 static/css/colors_dark.css delete mode 100644 static/css/colors_light.css delete mode 100644 static/css/design.css delete mode 100644 static/css/forms.css delete mode 100644 static/css/profile.css delete mode 100644 static/css/tabs.css delete mode 100644 static/css/utils.css delete mode 100644 staticfiles/css/colors_dark.css delete mode 100644 staticfiles/css/colors_light.css delete mode 100644 staticfiles/css/design.css delete mode 100644 staticfiles/css/profile.css diff --git a/core/context_processor.py b/core/context_processor.py new file mode 100644 index 0000000..a1410e3 --- /dev/null +++ b/core/context_processor.py @@ -0,0 +1,5 @@ +from .models import SiteSettings + +def site_settings(request): + # On récupère le premier objet, ou None s'il n'existe pas encore + return {'settings': SiteSettings.objects.first()} \ No newline at end of file diff --git a/courses/migrations/0001_initial.py b/courses/migrations/0001_initial.py deleted file mode 100644 index 5aeffd2..0000000 --- a/courses/migrations/0001_initial.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 5.0.6 on 2024-06-10 16:02 - -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Course', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('content', models.TextField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ], - ), - migrations.CreateModel( - name='Lesson', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=200)), - ('content', models.TextField()), - ('order', models.PositiveIntegerField()), - ('course_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lecons', to='courses.course')), - ], - ), - ] diff --git a/courses/migrations/0002_course_thumbnail.py b/courses/migrations/0002_course_thumbnail.py deleted file mode 100644 index 423ce06..0000000 --- a/courses/migrations/0002_course_thumbnail.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 5.0.6 on 2024-06-10 17:14 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('courses', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='course', - name='thumbnail', - field=models.ImageField(default='default.jpg', upload_to='thumbnails/courses/'), - ), - ] diff --git a/courses/migrations/0003_lesson_author_alter_course_thumbnail.py b/courses/migrations/0003_lesson_author_alter_course_thumbnail.py deleted file mode 100644 index 585d114..0000000 --- a/courses/migrations/0003_lesson_author_alter_course_thumbnail.py +++ /dev/null @@ -1,23 +0,0 @@ -# Generated by Django 5.0.6 on 2024-06-11 07:51 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('courses', '0002_course_thumbnail'), - ] - - operations = [ - migrations.AddField( - model_name='lesson', - name='author', - field=models.CharField(default=None, max_length=100), - ), - migrations.AlterField( - model_name='course', - name='thumbnail', - field=models.ImageField(default='default.jpg', upload_to='static/uploads/thumbnails/courses/'), - ), - ] diff --git a/courses/migrations/0004_remove_lesson_author_course_author.py b/courses/migrations/0004_remove_lesson_author_course_author.py deleted file mode 100644 index 2e3dadc..0000000 --- a/courses/migrations/0004_remove_lesson_author_course_author.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 5.0.6 on 2024-06-11 08:26 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('courses', '0003_lesson_author_alter_course_thumbnail'), - ] - - operations = [ - migrations.RemoveField( - model_name='lesson', - name='author', - ), - migrations.AddField( - model_name='course', - name='author', - field=models.CharField(default='Anthony Violet', max_length=100), - ), - ] diff --git a/courses/migrations/0005_rename_author_course_old_author.py b/courses/migrations/0005_rename_author_course_old_author.py deleted file mode 100644 index fd7d7f0..0000000 --- a/courses/migrations/0005_rename_author_course_old_author.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-14 10:12 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('courses', '0004_remove_lesson_author_course_author'), - ] - - operations = [ - migrations.RenameField( - model_name='course', - old_name='author', - new_name='old_author', - ), - ] diff --git a/courses/migrations/0006_course_author.py b/courses/migrations/0006_course_author.py deleted file mode 100644 index f41013f..0000000 --- a/courses/migrations/0006_course_author.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-14 10:13 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('courses', '0005_rename_author_course_old_author'), - ] - - operations = [ - migrations.AddField( - model_name='course', - name='author', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/courses/migrations/0007_convert_old_authors.py b/courses/migrations/0007_convert_old_authors.py deleted file mode 100644 index 7e2d7bc..0000000 --- a/courses/migrations/0007_convert_old_authors.py +++ /dev/null @@ -1,21 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-14 10:13 - -from django.db import migrations - -def convert_old_authors(apps, schema_editor): - Course = apps.get_model('courses', 'Course') - User = apps.get_model('auth', 'User') - default_user = User.objects.get(id=1) - for course in Course.objects.all(): - course.author = default_user - course.save() - -class Migration(migrations.Migration): - - dependencies = [ - ('courses', '0006_course_author'), - ] - - operations = [ - migrations.RunPython(convert_old_authors), - ] diff --git a/courses/migrations/0008_remove_course_old_author_alter_course_author.py b/courses/migrations/0008_remove_course_old_author_alter_course_author.py deleted file mode 100644 index 4748659..0000000 --- a/courses/migrations/0008_remove_course_old_author_alter_course_author.py +++ /dev/null @@ -1,26 +0,0 @@ -# Generated by Django 4.2.17 on 2024-12-14 10:16 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('courses', '0007_convert_old_authors'), - ] - - operations = [ - migrations.RemoveField( - model_name='course', - name='old_author', - ), - migrations.AlterField( - model_name='course', - name='author', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - ] diff --git a/courses/models.py b/courses/models.py index 4ad3997..83ced4d 100644 --- a/courses/models.py +++ b/courses/models.py @@ -1,22 +1,37 @@ from django.db import models from django.contrib.auth.models import User -from django.utils.html import escape class Course(models.Model): name = models.CharField(max_length=200) - content = models.TextField() + slug = models.SlugField(unique=True) + tags = models.CharField(max_length=200) author = models.ForeignKey(User, on_delete=models.CASCADE) - thumbnail = models.ImageField(upload_to='static/uploads/thumbnails/courses/', default='default.jpg') + thumbnail = models.ImageField(upload_to='thumbnails/courses/', default='default.jpg') + description = models.TextField() created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) + enable = models.BooleanField(default=True) def __str__(self): return self.name -class Lesson(models.Model): - course_id = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='lecons') +class Module(models.Model): name = models.CharField(max_length=200) + slug = models.SlugField() + course = models.ForeignKey(Course, on_delete=models.CASCADE, related_name='modules') + description = models.TextField() + created_at = models.DateTimeField(auto_now_add=True) + updated_at = models.DateTimeField(auto_now=True) + enable = models.BooleanField(default=True) + order = models.PositiveIntegerField() + +class Lesson(models.Model): + name = models.CharField(max_length=200) + slug = models.SlugField() + module = models.ForeignKey(Module, on_delete=models.CASCADE, related_name='lessons') content = models.TextField() + video_id = models.CharField(max_length=200, blank=True) + is_premium = models.BooleanField(default=False) order = models.PositiveIntegerField() def clean(self): diff --git a/data78HyT4mloSq_Gt.sqlite3 b/data78HyT4mloSq_Gt.sqlite3 deleted file mode 100644 index b1fd805014ad342188a9240e5dfa300c1b3c4910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217088 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

f5;%u;WjJ-w%u@6Vo$(6hoej{8V@OX*oqoc(z9 ziUo&I!lBz;ol*g`BgFD7zz2CZ`kYz=*n&V@F^U&cRUe0>k^x2bhW-VxYV@C(zD_~q z?Myh$wf$XfP~s2u+czwLQUALI80ZMtsl7vz4eGM)XA!emtwwi}^Eu)!_xRaLJB0#_ zeB!)l6Wwo#;`&C%IcD z`>QY6a7`Q{3ruZ*1D^aSI?*}O^q;21Cb zS5yrT#b3ih+3HLN=k=+53z@QG^QDEu!nZAKlo)b=zF5wU1focsHUzBj21sRd@;c7NLB~8B&Thj1V7Kz3;(p?~ zcP|$2;%vQPUZ$VP&>DL8c5`qd)C|n?rH6i=hJwR)8ZCS5yVP~&Bb zbcjH3=M&o$ssqx;4!%Py%Z+I(V|M>P_tO#nls_c}ew``s!`m2{{^XahjgDV0oInDQ zqSqiSqFczX5XjQ}@C&B{ugOHvt;j~8FwqX?iq?H@7$F^_!1xMHb<7V}VQGTwQf@bS zjd&gepg7i#w84){?FmKzq>kh zzcZzpk^W8l43kLlL?CNDW!+IONcz&vdaF|(ynlUmDfwRCTl@I$R;Re3eykFWQ+CaO zf~!*>w|07atGc{yXS4Q;;`0FlZnkH;+Z<%8n7oIyO0nv8rXk&6`q*7ygMwZfTs42A zm_~K4ZytJW>tN^c>6xi1x%Xg=)u|~#hW8G3R;O;=eDD2%vBX)1m7$d7D)qdMnW9fQ z)Gd0-x4aOc`u|YNmvwC9#Zw=8?4zn-6@&G6^YPoSTEyawpvYtPs_N2hW#9))M~b`M zMDYvQ*B~eC$YlE}=pLm6wF&xiqp}@TWX0mQGJ&At$U8v8JOQhaalvO%lx1dpz^T zJ@MF^mG6D8_{tr2UNRihwu}i#RDd;8KvOE-xA&Qb(u^fUrFuX*XBfJA= z*`2lEU<@CoE{8N2PanL*KSsQGPqWTA#r^E*`> ziZz{gr+X(di_kZ7nWR&Ej~kxtdIW)mTu5H{P1JAJiN>F7OOsz=qQ!579;D$KYZY53uNxXas}_2mUadYuPx2VAvE;({M)Lpiza<4q z3X~KmDNs_Nq(Di5k^&_KN(z(|C@D}VPlYG*B)@b5hHAek2N<@e-@?%wV@dV;oK79?|z|#l!?>j_+z_@N}i})ZFkf1k`ZnX}<@A7(9S-*LsGP8cL4Pp*h z+0Cs73>Dz~PS&RCu^_84xJ+$(GA;%3K|FciE#$@W>lZ{D7$UeG24YY>BVRtF`lo5l1dxuw6|#N8$doscKt~4-uEW{nDO0r)u>Y;C zcI%+G_v9bJqF8xgJ%t(%vyTrt-xX+(g;2In#j&Uo+JiqM&gJnXQt!c%Hi|U@kpP>3 zjwHH>Y<(g;Z&NG-__ZRiSkZz+S{MTh00i`R2loz};*cE09tP^zN=4u(b0TC9S>nkGjiY!SPkSK*s0XiF9Tnp=80;Zn zd1}iUpZ4(v)AaqjpAm`oj^)e^$>)?9{s~bPLA&FHgk^#K`v_jmtta&&y;oxl3# z+SeQ~AMSed^(x3Ji}Jl}ZA64jT_ zutZ>bv_^LSzxc_>#h>w4`BPG$q(Di5k^&_KN(z(|C@D}d7V5`y4-R+FGplnK|8wNxfAd%Q yQ&OO$KuLj;0wo1X3X~KmDNs_Nq(Di5k^&_KN(%fIQQ!-&jE ul { - display: flex; - } - - /* Styles pour les liens parents pour permettre le focus */ - .navbar a { - display: block; - padding: 10px; - text-decoration: none; - } - - .navbar li > a:focus + ul { - display: flex; - } - - section { - margin: 300px auto; - width: 85%; - } - - .submenu { - display: none; - } -} - - -/* design.css */ -.snowflake { - position: fixed; - top: -10px; - color: white; - font-size: 1em; - opacity: 0.8; - filter: blur(1px); - z-index: 1000; /* Assurez-vous que les flocons sont au premier plan */ - pointer-events: none; /* Empêche les flocons d'interférer avec les clics */ - animation: fall linear infinite; -} - -@keyframes fall { - to { - transform: translateY(100vh); - } -} - -/* design.css */ -.light { - animation: blink 1s infinite; -} - -.light:nth-child(2) { - animation-delay: 0.2s; -} - -.light:nth-child(3) { - animation-delay: 0.4s; -} - -.light:nth-child(4) { - animation-delay: 0.6s; -} - -.light:nth-child(5) { - animation-delay: 0.8s; -} - -.light:nth-child(6) { - animation-delay: 1s; -} - -.light:nth-child(7) { - animation-delay: 1.2s; -} - -.light:nth-child(8) { - animation-delay: 1.4s; -} - -.light:nth-child(9) { - animation-delay: 1.6s; -} - -.light:nth-child(10) { - animation-delay: 1.8s; -} - -@keyframes blink { - 0%, 100% { - opacity: 1; - } - 50% { - opacity: 0.5; - } -} \ No newline at end of file diff --git a/static/css/forms.css b/static/css/forms.css deleted file mode 100644 index c60f444..0000000 --- a/static/css/forms.css +++ /dev/null @@ -1,98 +0,0 @@ -/* FORUMULAIRES */ - -form { - display: flex; - flex-direction: column; - width: 50%; - margin: 20px auto; -} - -/* Styles pour la section du formulaire */ -.form-section { - display: flex; - flex-direction: column; - align-items: center; - padding: 20px; - background-color: rgba(0, 0, 0, 0.4); /* Fond blanc pour plus de clarté */ - border: 1px solid #dddddd; /* Bordure légère */ - border-radius: 10px; /* Bordure arrondie */ - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* Ombre légère */ - margin: 20px auto; - width: 50%; -} - -.login-form { - display: flex; - flex-direction: column; - width: 100%; - align-items: center; -} - -.form-group { - display: flex; - flex-direction: column; - margin-bottom: 15px; -} - -.form-group label { - margin-bottom: 5px; - font-weight: bold; -} - -.login-form input[type="text"], -.login-form input[type="email"], -.login-form input[type="password"], -.login-form textarea { - padding: 10px; - border: 1px solid #cccccc; /* Gris clair */ - border-radius: 5px; /* Bordure légèrement arrondie */ - background-color: rgba(0, 0, 0, 0.7); /* Fond gris très clair */ - color: #a8a8a8; - margin-bottom: 10px; - font-size: 1rem; /* Taille de police harmonisée */ - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); /* Ombre intérieure subtile */ -} - -.login-form .btn-submit { - padding: 10px; - border: 1px solid #007bff; - border-radius: 5px; /* Bordure légèrement arrondie */ - background-color: #007bff; - color: #ffffff; - cursor: pointer; - transition: background-color 0.3s ease; - font-size: 1rem; /* Taille de police harmonisée */ -} - -.login-form .btn-submit:hover { - background-color: #0056b3; -} - -input[type="text"], input[type="email"], input[type="password"], textarea { - padding: 10px; - border: 1px solid #888888; /* Gris foncé */ - border-radius: 2px; - background-color: #e0e0e0; /* Gris clair harmonisé */ - color: #333333; -} - -input[type="submit"], button { - padding: 10px; - border: 1px solid #007bff; - border-radius: 2px; - background-color: #007bff; - color: #ffffff; - cursor: pointer; - transition: background-color 0.3s ease; -} - -input[type="submit"]:hover, button:hover { - background-color: #0056b3; -} - -button { - padding: 10px; - border: 1px solid; - border-radius: 2px; - cursor: pointer; -} \ No newline at end of file diff --git a/static/css/profile.css b/static/css/profile.css deleted file mode 100644 index 0ac2965..0000000 --- a/static/css/profile.css +++ /dev/null @@ -1,95 +0,0 @@ -/* PROFILE */ - -.profile-section { - max-width: 800px; - margin: 0 auto; - padding: 20px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); -} - -.profile-header { - text-align: center; - margin-bottom: 20px; -} - -.profile-header h2 { - font-size: 2em; - margin-bottom: 10px; -} - -.profile-picture { - width: 150px; - height: 150px; - border-radius: 50%; - object-fit: cover; - margin-bottom: 20px; -} - -.profile-picture-mini { - width: 30px; - height: 30px; - border-radius: 50%; - object-fit: cover; - margin: 10px; -} - -.profile-details p { - font-size: 1.1em; - margin: 10px 0; -} - -.profile-actions { - text-align: center; - margin-top: 20px; -} - -.profile-actions .btn { - margin: 0 10px; - padding: 10px 20px; - font-size: 1em; - border-radius: 5px; - text-decoration: none; -} - -.profile-actions .btn-primary { - background-color: #007bff; - color: white; -} - -.profile-actions .btn-secondary { - background-color: #6c757d; - color: white; -} - -.profile-nav { - display: flex; - border-bottom: 1px solid #ddd; /* Bordure légère */ - margin: 20px auto; /* Centrer la navigation */ -} - -.profile-nav ul { - list-style: none; /* Supprimer les puces */ - display: flex; - flex-direction: row; - padding: 0; - margin: 0; -} - -.profile-nav li { - margin-bottom: 10px; /* Espacement entre les éléments */ -} - -.profile-nav a { - text-decoration: none; /* Supprimer la décoration de texte */ - color: #007bff; /* Couleur du texte */ - font-weight: bold; /* Texte en gras */ - display: block; /* Afficher les liens comme des blocs */ - padding: 10px; /* Espacement interne */ - border-radius: 5px; /* Bordure arrondie */ - transition: background-color 0.3s ease; /* Transition pour le survol */ -} - -.profile-nav a:hover { - background-color: #31363b; /* Couleur de fond au survol */ -} \ No newline at end of file diff --git a/static/css/tabs.css b/static/css/tabs.css deleted file mode 100644 index 25dd081..0000000 --- a/static/css/tabs.css +++ /dev/null @@ -1,33 +0,0 @@ -/* TABLEAUX */ - -table { - width: 80%; - border-collapse: collapse; -} - -.table-40 { - width: 40%; -} - -.table-50 { - width: 50%; -} - -.table-60 { - width: 60%; -} - -.table-70 { - width: 70%; -} - -th { - border-bottom: 2px solid; - text-align: left; - font-size: 1.1rem; - padding: 5px; -} - -td { - padding: 10px; -} \ No newline at end of file diff --git a/static/css/utils.css b/static/css/utils.css deleted file mode 100644 index 8f4f7a4..0000000 --- a/static/css/utils.css +++ /dev/null @@ -1,46 +0,0 @@ -span.helptext { - font-size: 0.7em; - color: #f58787; - margin-left: 5px; - font-style: italic; -} - -ul.flash_messages { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - margin: 10px; - position: fixed; - top: 70px; - right: 10px; - z-index: 1000; -} - -ul.flash_message { - background-color: #f0f0f0; - border: 1px solid #ccc; - padding: 10px; - margin-bottom: 10px; - border-radius: 5px; - opacity: 1; - transition: opacity 1s ease-out; /* Transition pour l'opacité */ -} - -ul.flash_messages li { - list-style: none; - padding: 10px; - margin: 10px; - border-radius: 5px; - color: white; -} - -ul.flash_messages li.error { - background-color: #f58787; - color: red; -} - -ul.flash_messages li.success { - background-color: #a5edb5; - color: green; -} \ No newline at end of file diff --git a/static/js/functions.js b/static/js/functions.js index 12a77b9..aedd798 100644 --- a/static/js/functions.js +++ b/static/js/functions.js @@ -17,12 +17,47 @@ function show(id) { // Fonction pour supprimer le message d'alerte après 5 secondes document.addEventListener('DOMContentLoaded', function() { let messages = document.querySelector('.flash_messages') - setTimeout(function() { - messages.style.opacity = 0; - setTimeout(function() { - messages.style.display = 'none'; - }, 1000); - }, 5000); + if (messages) { + setTimeout(function() { + messages.style.opacity = 0; + setTimeout(function() { + messages.style.display = 'none'; + }, 1000); + }, 5000); + } + + // Theme toggle setup + var toggle = document.getElementById('themeToggle'); + var themeLink = document.getElementById('theme-css'); + function applyTheme(theme) { + document.documentElement.setAttribute('data-theme', theme); + if (theme === 'light') { + if (themeLink) themeLink.href = themeLink.href.replace('colors_dark.css', 'colors_light.css'); + } else { + if (themeLink) themeLink.href = themeLink.href.replace('colors_light.css', 'colors_dark.css'); + } + var icon = toggle && toggle.querySelector('i'); + if (icon) { + icon.classList.remove('fa-sun','fa-moon'); + icon.classList.add(theme === 'light' ? 'fa-moon' : 'fa-sun'); + } + if (toggle) { + toggle.setAttribute('aria-pressed', theme === 'dark' ? 'true' : 'false'); + toggle.setAttribute('aria-label', theme === 'light' ? 'Activer le thème sombre' : 'Activer le thème clair'); + toggle.title = toggle.getAttribute('aria-label'); + } + } + try { + var current = document.documentElement.getAttribute('data-theme') || 'dark'; + applyTheme(current); + if (toggle) { + toggle.addEventListener('click', function() { + var next = (document.documentElement.getAttribute('data-theme') === 'light') ? 'dark' : 'light'; + localStorage.setItem('pdz-theme', next); + applyTheme(next); + }); + } + } catch(e) {} }); // Fonction pour générer des flocons de neige @@ -46,5 +81,5 @@ function createSnowflake() { }, duration * 1000); } -// On génére lee flocons toute les 300ms +// On génère les flocons toutes les 300ms setInterval(createSnowflake, 300); \ No newline at end of file diff --git a/staticfiles/css/colors_dark.css b/staticfiles/css/colors_dark.css deleted file mode 100644 index 5d5f272..0000000 --- a/staticfiles/css/colors_dark.css +++ /dev/null @@ -1,164 +0,0 @@ -/* Couleurs en mode sombre */ -html { - background-color: #0f1f2e; /* Fond sombre pour toute la page */ - color:#5e88a0; -} - -nav { - background-color: #000824;; /* Fond sombre pour la barre de navigation */ -} - -.navbar ul ul li { - background-color: #000824; /* Fond sombre pour les sous-menus */ - border-color: #4f6f8f; /* Couleur de la bordure */ - box-shadow: 2px 2px 2px #0f1f2e; /* Ombre légère */ -} - -.navbar ul ul a { - color: #5e88a0; /* Couleur du texte pour les liens des sous-menus */ -} - -.brand { - color: #c4d7e0; /* Couleur du texte pour la marque */ -} - -a { - color: #7ca9c6; /* Couleur de base pour les liens */ -} - -a:hover { - color: #ffc3a0; /* Couleur au survol */ - text-shadow: #fff 0px 1px 5px; /* Ombre du texte au survol */ -} - -a.house { - color: #5e88a0; /* Couleur spécifique pour certains liens */ -} - -a.house:hover { - color: #7ca9c6; /* Couleur au survol */ -} - -.button { - background-color: #2a3e4c; /* Fond sombre pour les boutons */ - color: #fff; /* Couleur du texte */ - border-color: transparent; /* Bordure transparente */ -} - -.button:hover { - background-color: #ff8a6b; /* Fond au survol */ -} - -.test-me { - border-color: #7ca9c6; /* Couleur de bordure */ - background-color: #9cd0ef; /* Fond */ - color: #2e485d; /* Couleur du texte */ -} - -.reset { - border-color: #ff7b39; /* Couleur de bordure */ - background-color: #ffd0a1; /* Fond */ - color: #8e4b1e; /* Couleur du texte */ -} - -.courseNav { - border-color: #0f1f2e; /* Couleur de bordure */ - box-shadow: 2px 2px 2px #4f6f8f; /* Ombre */ - background-color: #334c66; /* Fond sombre */ -} - -.edito { - border-color: #a4b8c7; /* Couleur de bordure */ - background-color: #334c66; /* Fond sombre */ - color: #86a3b4; -} - -.test { - border-color: #8c7d49; /* Couleur de bordure */ - background-color: #b5ac8f; /* Fond */ - color: #70685a; /* Couleur du texte */ -} - -.comment { - color: #6cb87e; /* Couleur pour les commentaires */ -} - -h1 { - color: #4e9ed6; /* Couleur pour les titres h1 */ - border-left-color: #ffa500; /* Couleur de la bordure gauche */ - border-bottom-color: #ffa500; /* Couleur de la bordure inférieure */ -} - -h2 { - color: #e58a01; /* Couleur pour les titres h2 */ -} - -.card { - border-color: #b5b5b5; /* Couleur de bordure des cartes */ - box-shadow: 2px 2px 2px #888888; /* Ombre */ -} - -.card-header img.thumbnails { - transition: transform 1s ease; /* Transition pour les images */ -} - -.card:hover img.thumbnails { - transform: scale(1.2); /* Zoom au survol */ -} - -.card-body { - background-color: #0f1f2e; /* Couleur des liens dans le corps des cartes */ -} - -.card-body a { - color: #4e9ed6; /* Couleur des liens dans le corps des cartes */ -} - -.card-body a:hover { - color: #631a37; /* Couleur au survol */ -} - -.question { - background-color: #c5fffa; /* Fond pour les questions */ - border-color: #006e65; /* Couleur de bordure */ - color: #006e65; /* Couleur du texte */ -} - -.validation { - background-color: #c5ffcf; - border-color: #006e18; - color: #006e18; -} - -.conclusion { - background-color: #ffdac5; /* Fond pour les conclusions */ - border-color: #6e1f00; /* Couleur de bordure */ - color: #6e1f00; /* Couleur du texte */ -} - -.exercice { - background-color: #eeffc5; /* Fond pour les exercices */ - border-color: #636e00; /* Couleur de bordure */ - color: #636e00; /* Couleur du texte */ -} - -.info { - background-color: #c5f3ff; /* Fond pour les exercices */ - border-color: #004f6e; /* Couleur de bordure */ - color: #002c6e; /* Couleur du texte */ -} - -th { - border-color: #b5b5b5; /* Couleur de bordure pour les cellules d'en-tête */ -} - -tr:nth-child(even) { - background-color: #536a7d; /* Fond pour les lignes paires */ - color: #002c6e; -} - - -footer { - background-color: #000824; /* Fond sombre pour le pied de page */ - color: #8d8d8d; /* Couleur du texte */ -} diff --git a/staticfiles/css/colors_light.css b/staticfiles/css/colors_light.css deleted file mode 100644 index fe3525e..0000000 --- a/staticfiles/css/colors_light.css +++ /dev/null @@ -1,149 +0,0 @@ -/* Couleurs */ -nav { - background-color: #252525; -} - -.navbar ul ul li { - background-color: #252525; - border-color: #fff; - box-shadow: 2px 2px 2px #252525; -} - -.navbar ul ul a { - color: #10B3DB; -} - -.brand { - color: #fff; -} - -a { - color: #458741; -} - -a:hover { - color: #ffbdbd; - text-shadow: #fff 0px 1px 5px; -} - -a.house { - color: #10B3DB; -} - -a.house:hover { - color: #458741; -} - -.button { - background-color: #fff; - color: #000; - border-color: transparent; -} - -.button:hover { - background-color: #ffbdbd; -} - -.test-me { - border-color: #458741; - background-color: #93ec8e; - color: #2b422a; -} - -.reset { - border-color: #ff5e00; - background-color: #ffb286; - color: #6b3618; -} - -.courseNav { - border-color: #252525; - box-shadow: 2px 2px 2px #888888; - background-color: #f8f8f8; -} - -.edito { - border-color: #b4b4b4; - background-color: #f8f8f8; -} - -.test { - border-color: #a38d2b; - background-color: #eee4b7; - color: #504721; -} - -.comment { - color: green; -} - -h1 { - color: #236877; - border-left-color: orange; - border-bottom-color: orange; -} - -h2 { - color: #DB6310; -} - -.card { - border-color: #c9c9c9; - box-shadow: 2px 2px 2px #888888; -} - -.card-header img.thumbnails { - transition: transform 1s ease; -} - -.card:hover img.thumbnails { - transform: scale(1.2); -} - -.card-body a { - color: #236877; - background-color: #f9f9f9; - border-top: 1px solid; -} - -.card-body a:hover { - color: #9e1888; -} - -.question { - background-color: #c5fffa; - border-color: #006e65; - color: #006e65; -} - -.validation { - background-color: #c5ffcf; - border-color: #006e18; - color: #006e18; -} - -.conclusion { - background-color: #ffdac5; - border-color: #6e1f00; - color: #6e1f00; -} - -.exercice { - background-color: #eeffc5; - border-color: #636e00; - color: #636e00; -} - -th { - border-color: #888888; -} - -tr:nth-child(even) { - background-color: #e2e2e2; -} - - -footer { - background-color: #252525; - color: #8d8d8d; -} diff --git a/staticfiles/css/design.css b/staticfiles/css/design.css deleted file mode 100644 index 978b687..0000000 --- a/staticfiles/css/design.css +++ /dev/null @@ -1,599 +0,0 @@ -@import url('https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap'); - -html { - display: flex; - flex-direction: column; - font-size: 16px; - font-family: "Montserrat"; - scroll-behavior: smooth; -} - -body { - display: flex; - flex-direction: column; - margin: 0; -} - -nav { - display: flex; - /*position: fixed;*/ - /*width: 100vw;*/ - align-items: center; - justify-content: space-between; - top: 0; - padding: 0 10px; - height: 80px; - border-bottom: 2px solid #000; -} - -.navbar { - display: flex; - width: 70%; - justify-content: flex-start; - margin-right: 30px; -} - -.navbar ul, .navbar li { - list-style: none; - padding: 0; - margin: 0; -} - -.navbar ul { - display: flex; - flex-direction: row; - width: 100%; -} - -.navbar li { - position: relative; - margin: auto 10px; -} - -.navend { - margin-right: 20px; - display: flex; - width: 100%; - align-items: end; - flex-direction: row-reverse; -} - -.navend a { - cursor: pointer; -} - -.navbar ul ul { - display: none; - position: absolute; - width: auto; - left: 0; - top: 100%; - flex-direction: column; - transform: translateX(-25%); -} - -.navbar li:hover ul, -.navbar li ul:hover { - display: flex; /* Changed to flex to support horizontal layout */ -} - -.navbar ul ul li { - width: auto; /* Adjust width for inline layout */ - margin: auto 10px; - padding: 10px; - border-left: 1px solid; -} - -.navbar ul ul li:first-child { - margin-top: 20px; -} - -.navbar ul ul a { - display: block; - padding: 0 0 10px 0; - text-decoration: none; - white-space: nowrap; /* Prevents text from wrapping */ -} - -/* Styles pour la navigation du profil utilisateur */ -.profile-nav { - display: flex; - border-bottom: 1px solid #ddd; /* Bordure légère */ - margin: 20px auto; /* Centrer la navigation */ -} - -.profile-nav ul { - list-style: none; /* Supprimer les puces */ - display: flex; - flex-direction: row; - padding: 0; - margin: 0; -} - -.profile-nav li { - margin-bottom: 10px; /* Espacement entre les éléments */ -} - -.profile-nav a { - text-decoration: none; /* Supprimer la décoration de texte */ - color: #007bff; /* Couleur du texte */ - font-weight: bold; /* Texte en gras */ - display: block; /* Afficher les liens comme des blocs */ - padding: 10px; /* Espacement interne */ - border-radius: 5px; /* Bordure arrondie */ - transition: background-color 0.3s ease; /* Transition pour le survol */ -} - -.profile-nav a:hover { - background-color: #31363b; /* Couleur de fond au survol */ -} - -.brand { - font-size: 1.5rem; - font-weight: 600; - letter-spacing: 0.2cm; - font-variant: small-caps; -} - -.subtitle { - font-size: 1rem; - letter-spacing: 0.05cm; -} - -a { - text-decoration: none; - font-weight: 600; - transition: all 1s; - scroll-margin-top: 80px; -} - -.button { - padding: 5px; - max-width: 300px; - cursor: pointer; - font-size: 1.5rem; - border: 1px solid; - border-radius: 2px; - margin: 20px; -} - -.button-grp { - display: flex; - flex-direction: row; - justify-content: center; - width: 100%; -} - -main { - flex: 1; -} - -section { - display: flex; - flex-direction: column; - padding: 20px; - width: 60%; - margin: 20px auto; -} - -.courseNav { - display: block; - float: left; - position: fixed; - left: 0; - top: 150px; - max-width: 15%; - border: 1px solid; -} - -.edito { - border: 1px solid; - border-radius: 5px; -} - -.comment { - font-weight: 500; -} - -.test { - border: 1px solid; - padding: 10px; -} - -.ul-arrow li { - list-style: none; -} - -.ul-arrow li:before { - content: "→ "; - font-size: 1.5rem; -} - -h1 { - font-size: 2rem; - border-left: 5px solid; - border-bottom: 1px solid; -} - -h2 { - font-size: 1.5rem; -} - -img { - max-width: 100%; -} - -.card-header img.thumbnails { - transition: transform 1s ease -} - -.card:hover img.thumbnails { - transform: scale(1.2); -} - -.container-inline { - display: flex; - flex-direction: row; -} - -.card { - display: flex; - flex-direction: column; - max-width: 250px; - border-left: 1px solid; - border-top: 1px solid; - border-radius: 2px; - overflow: hidden; - margin: 20px; -} - -.card-header h2 { - display: flex; - overflow: hidden; -} - -.card-header { - display: flex; - width: 100%; - font-size: 1rem; - font-weight: 500; -} - -.card-body a { - font-size: 1rem; - font-weight: 600; -} - -.card-body a:hover { - text-decoration: underline -} - -.card-body { - border-top: 1px solid; - padding: 5px; - line-height: 90%; - overflow: hidden; - z-index: 3; -} - -.def-author { - font-size: 0.8rem; - font-style: italic; -} - -/* CODE */ -.inline { - display: inline-block; -} - -pre { - border-radius: 5px; -} - -code { - font-family: "Courier New", Courier, monospace; - border-radius: 5px; -} - -.alert { - border: 1px solid; - border-radius: 2px; - padding: 20px; - margin: 20px 0; -} - -.question { - background-image: url('../img/question.png') right no-repeat; -} - -#hide { - display: none; -} - -table { - width: 80%; - border-collapse: collapse; -} - -.table-40 { - width: 40%; -} - -.table-50 { - width: 50%; -} - -.table-60 { - width: 60%; -} - -.table-70 { - width: 70%; -} - -th { - border-bottom: 2px solid; - text-align: left; - font-size: 1.1rem; - padding: 5px; -} - -td { - padding: 10px; -} - -form { - display: flex; - flex-direction: column; - width: 50%; - margin: 20px auto; -} - -/* Styles pour la section du formulaire */ -.form-section { - display: flex; - flex-direction: column; - align-items: center; - padding: 20px; - background-color: rgba(0, 0, 0, 0.4); /* Fond blanc pour plus de clarté */ - border: 1px solid #dddddd; /* Bordure légère */ - border-radius: 10px; /* Bordure arrondie */ - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); /* Ombre légère */ - margin: 20px auto; - width: 50%; -} - -.login-form { - display: flex; - flex-direction: column; - width: 100%; - align-items: center; -} - -.form-group { - display: flex; - flex-direction: column; - margin-bottom: 15px; -} - -.form-group label { - margin-bottom: 5px; - font-weight: bold; -} - -.login-form input[type="text"], -.login-form input[type="email"], -.login-form input[type="password"], -.login-form textarea { - padding: 10px; - border: 1px solid #cccccc; /* Gris clair */ - border-radius: 5px; /* Bordure légèrement arrondie */ - background-color: rgba(0, 0, 0, 0.7); /* Fond gris très clair */ - color: #a8a8a8; - margin-bottom: 10px; - font-size: 1rem; /* Taille de police harmonisée */ - box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.1); /* Ombre intérieure subtile */ -} - -.login-form .btn-submit { - padding: 10px; - border: 1px solid #007bff; - border-radius: 5px; /* Bordure légèrement arrondie */ - background-color: #007bff; - color: #ffffff; - cursor: pointer; - transition: background-color 0.3s ease; - font-size: 1rem; /* Taille de police harmonisée */ -} - -.login-form .btn-submit:hover { - background-color: #0056b3; -} - -input[type="text"], input[type="email"], input[type="password"], textarea { - padding: 10px; - border: 1px solid #888888; /* Gris foncé */ - border-radius: 2px; - background-color: #e0e0e0; /* Gris clair harmonisé */ - color: #333333; -} - -input[type="submit"], button { - padding: 10px; - border: 1px solid #007bff; - border-radius: 2px; - background-color: #007bff; - color: #ffffff; - cursor: pointer; - transition: background-color 0.3s ease; -} - -input[type="submit"]:hover, button:hover { - background-color: #0056b3; -} - -button { - padding: 10px; - border: 1px solid; - border-radius: 2px; - cursor: pointer; -} - -/* PROFILE */ - -.profile-section { - max-width: 800px; - margin: 0 auto; - padding: 20px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); -} - -.profile-header { - text-align: center; - margin-bottom: 20px; -} - -.profile-header h2 { - font-size: 2em; - margin-bottom: 10px; -} - -.profile-picture { - width: 150px; - height: 150px; - border-radius: 50%; - object-fit: cover; - margin-bottom: 20px; -} - -.profile-details p { - font-size: 1.1em; - margin: 10px 0; -} - -.profile-actions { - text-align: center; - margin-top: 20px; -} - -.profile-actions .btn { - margin: 0 10px; - padding: 10px 20px; - font-size: 1em; - border-radius: 5px; - text-decoration: none; -} - -.profile-actions .btn-primary { - background-color: #007bff; - color: white; -} - -.profile-actions .btn-secondary { - background-color: #6c757d; - color: white; -} - -footer { - flex-direction: column; - background-color: #252525; - color: #8d8d8d; - padding: 10px; - flex-shrink: 0; -} - -.footer { - display: flex; - flex-direction: row; - justify-content: space-between; -} - -.about { - width: 30%; -} - -.footer-link { - width: 30%; -} - -@media (max-width: 1000px) { - .courseNav { - display: block; - position: relative; - top: 0; - border: 0; - max-width: 100%; - box-shadow: 0 0 transparent; - background-color: transparent; - } -} - -@media (max-width: 678px) { - nav { - position: absolute; - height: auto; - align-items - : flex-start; - justify-content: flex-start; - flex-direction: column; - width: 100%; - } - - .navbar { - width: 100%; - } - - .navbar ul { - flex-direction: column; - width: 100%; - } - - .navbar ul li { - width: 100%; - } - - .navbar ul ul { - position: static; - flex-direction: column; - } - - .navbar ul ul li { - width: 100%; - margin: 0; - } - - .navbar ul ul a { - padding: 10px 20px; - } - - /* Initialement, les sous-menus sont cachés */ - .navbar ul ul { - display: none; - } - - /* Afficher les sous-menus lorsque l'élément parent est focalisé */ - .navbar li:focus-within > ul { - display: flex; - } - - /* Styles pour les liens parents pour permettre le focus */ - .navbar a { - display: block; - padding: 10px; - text-decoration: none; - } - - .navbar li > a:focus + ul { - display: flex; - } - - section { - margin: 300px auto; - width: 85%; - } - - .submenu { - display: none; - } -} diff --git a/staticfiles/css/profile.css b/staticfiles/css/profile.css deleted file mode 100644 index 559c8a5..0000000 --- a/staticfiles/css/profile.css +++ /dev/null @@ -1,55 +0,0 @@ - -.profile-section { - max-width: 800px; - margin: 0 auto; - padding: 20px; - background-color: #f9f9f9; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); -} - -.profile-header { - text-align: center; - margin-bottom: 20px; -} - -.profile-header h2 { - font-size: 2em; - margin-bottom: 10px; -} - -.profile-picture { - width: 150px; - height: 150px; - border-radius: 50%; - object-fit: cover; - margin-bottom: 20px; -} - -.profile-details p { - font-size: 1.1em; - margin: 10px 0; -} - -.profile-actions { - text-align: center; - margin-top: 20px; -} - -.profile-actions .btn { - margin: 0 10px; - padding: 10px 20px; - font-size: 1em; - border-radius: 5px; - text-decoration: none; -} - -.profile-actions .btn-primary { - background-color: #007bff; - color: white; -} - -.profile-actions .btn-secondary { - background-color: #6c757d; - color: white; -} \ No newline at end of file diff --git a/templates/home.html b/templates/home.html index 0e93226..925ab23 100644 --- a/templates/home.html +++ b/templates/home.html @@ -1,12 +1,90 @@ {% extends 'layout.html' %} {% block content %} -

-

Bienvenue sur Partir de zero, votre nouvelle communauté dédiée à l'apprentissage des langages informatiques !

+
+
+

Apprenez à coder de A à Z

+

Des cours gratuits et payants, structurés et concrets, pour progresser rapidement en programmation.

+ +
+ Pas de carte requise pour commencer + À votre rythme + Accès premium en option +
+
+
-

Je crois que l'apprentissage de la programmation et du développement est une aventure passionnante et accessible à tous. Que vous soyez un débutant curieux ou un développeur expérimenté en quête de nouvelles compétences, la plateforme est conçue pour vous accompagner à chaque étape de votre parcours.

+
+
+
+

Parcours guidés

+

Des cheminements clairs pour débuter et monter en compétence sans vous perdre.

+
+
+
+

Pratique d'abord

+

Des projets concrets, des exercices et des corrections expliquées pas-à-pas.

+
+
+
+

Communauté

+

Posez vos questions et obtenez de l'aide de la communauté et de l'auteur.

+
{% block course %} {% include "courses/partials/list.html" %} {% endblock %} + +
+

Gratuit pour commencer, Premium pour aller plus loin

+
    +
  • Cours d'introduction gratuits
  • +
  • Contenu premium détaillé: projets complets, corrections, téléchargements
  • +
  • Accès à vie aux cours achetés
  • +
+ +
+ + + +
+

Ils progressent avec Partir de zéro

+
+
+

“Des cours clairs et progressifs. J’ai enfin compris Django et j’ai lancé mon premier projet.”

+
Alexandre — Débutant devenu autonome
+
+
+

“L’approche projet et les explications pas-à-pas m’ont fait gagner des semaines.”

+
Sarah — Étudiante en informatique
+
+
+

“Parfait pour reprendre les bases et aller plus loin. Le mode sombre est top 👌.”

+
Yassine — Dev front-end
+
+
+
{% endblock %} diff --git a/templates/layout.html b/templates/layout.html index a5ea775..c162cb4 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -4,18 +4,33 @@ {% load static %} - - - - - - + + + + + - + + PartirDeZero @@ -23,60 +38,65 @@ {% block header %} {% include "partials/_header.html" %} {% endblock %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + +
{% if messages %}
    diff --git a/templates/partials/_footer.html b/templates/partials/_footer.html index 1074794..af756bc 100644 --- a/templates/partials/_footer.html +++ b/templates/partials/_footer.html @@ -1,18 +1,36 @@ -