init: première itération

This commit is contained in:
2025-08-03 19:21:39 +02:00
commit 0ee7abbd48
10 changed files with 1083 additions and 0 deletions

View File

@@ -0,0 +1,76 @@
{% extends "base.html" %}
{% block title %}Évaluations - Gestion Scolaire{% endblock %}
{% block content %}
<div class="space-y-6">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-bold text-gray-900">Gestion des évaluations</h1>
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md transition-colors">
Nouvelle évaluation
</button>
</div>
{% if assessments %}
<div class="bg-white shadow overflow-hidden sm:rounded-md">
<ul class="divide-y divide-gray-200">
{% for assessment in assessments %}
<li>
<div class="px-4 py-4">
<div class="flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-10 h-10 bg-purple-100 rounded-full flex items-center justify-center">
<svg class="w-5 h-5 text-purple-600" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"/>
<path fill-rule="evenodd" d="M4 5a2 2 0 012-2v1a1 1 0 102 0V3a2 2 0 012 2v6a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm2.5 2.5a.5.5 0 000 1h3a.5.5 0 000-1h-3z" clip-rule="evenodd"/>
</svg>
</div>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-gray-900">{{ assessment.title }}</div>
<div class="text-sm text-gray-500">
{{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }}
- Coefficient {{ assessment.coefficient }}
</div>
{% if assessment.description %}
<div class="text-sm text-gray-500 mt-1">{{ assessment.description[:100] }}{% if assessment.description|length > 100 %}...{% endif %}</div>
{% endif %}
<div class="text-xs text-gray-400 mt-1">
{{ assessment.exercises|length }} exercice(s)
</div>
</div>
</div>
<div class="flex space-x-2">
<button class="text-indigo-600 hover:text-indigo-900 text-sm font-medium">
Voir exercices
</button>
<button class="text-green-600 hover:text-green-900 text-sm font-medium">
Saisir notes
</button>
<button class="text-gray-600 hover:text-gray-900 text-sm font-medium">
Modifier
</button>
</div>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% else %}
<div class="text-center py-12">
<svg class="mx-auto h-12 w-12 text-gray-400" stroke="currentColor" fill="none" viewBox="0 0 48 48">
<path d="M9 5H7a2 2 0 00-2 2v10a2 2 0 002 2h8m9-16v20m5-14H9m1 4h8m1 2h8m-8 6h8" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg>
<h3 class="mt-2 text-sm font-medium text-gray-900">Aucune évaluation</h3>
<p class="mt-1 text-sm text-gray-500">Commencez par créer votre première évaluation.</p>
<div class="mt-6">
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md transition-colors">
Nouvelle évaluation
</button>
</div>
</div>
{% endif %}
</div>
{% endblock %}

48
templates/base.html Normal file
View File

@@ -0,0 +1,48 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{% block title %}Gestion Scolaire{% endblock %}</title>
<script src="https://cdn.tailwindcss.com"></script>
</head>
<body class="bg-gray-100 min-h-screen">
<nav class="bg-blue-600 text-white shadow-lg">
<div class="max-w-7xl mx-auto px-4">
<div class="flex justify-between items-center py-4">
<div class="flex items-center space-x-4">
<h1 class="text-xl font-bold">
<a href="{{ url_for('index') }}" class="hover:text-blue-200">Gestion Scolaire</a>
</h1>
</div>
<div class="flex space-x-6">
<a href="{{ url_for('index') }}" class="hover:text-blue-200 transition-colors">Accueil</a>
<a href="{{ url_for('classes') }}" class="hover:text-blue-200 transition-colors">Classes</a>
<a href="{{ url_for('students') }}" class="hover:text-blue-200 transition-colors">Élèves</a>
<a href="{{ url_for('assessments') }}" class="hover:text-blue-200 transition-colors">Évaluations</a>
</div>
</div>
</div>
</nav>
<main class="max-w-7xl mx-auto px-4 py-8">
{% with messages = get_flashed_messages(with_categories=true) %}
{% if messages %}
{% for category, message in messages %}
<div class="mb-4 p-4 rounded-md {% if category == 'error' %}bg-red-100 text-red-700 border border-red-300{% else %}bg-green-100 text-green-700 border border-green-300{% endif %}">
{{ message }}
</div>
{% endfor %}
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</main>
<footer class="bg-gray-800 text-white mt-auto">
<div class="max-w-7xl mx-auto px-4 py-6 text-center">
<p>&copy; 2025 Gestion Scolaire - Application de gestion des évaluations</p>
</div>
</footer>
</body>
</html>

64
templates/classes.html Normal file
View File

@@ -0,0 +1,64 @@
{% extends "base.html" %}
{% block title %}Classes - Gestion Scolaire{% endblock %}
{% block content %}
<div class="space-y-6">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-bold text-gray-900">Gestion des classes</h1>
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md transition-colors">
Nouvelle classe
</button>
</div>
{% if classes %}
<div class="bg-white shadow overflow-hidden sm:rounded-md">
<ul class="divide-y divide-gray-200">
{% for class in classes %}
<li>
<div class="px-4 py-4 flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-10 h-10 bg-blue-100 rounded-full flex items-center justify-center">
<span class="text-sm font-medium text-blue-600">{{ class.name[:2] }}</span>
</div>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-gray-900">{{ class.name }}</div>
<div class="text-sm text-gray-500">
Année {{ class.year }} - {{ class.students|length }} élève(s)
</div>
{% if class.description %}
<div class="text-sm text-gray-500 mt-1">{{ class.description }}</div>
{% endif %}
</div>
</div>
<div class="flex space-x-2">
<button class="text-indigo-600 hover:text-indigo-900 text-sm font-medium">
Voir élèves
</button>
<button class="text-gray-600 hover:text-gray-900 text-sm font-medium">
Modifier
</button>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% else %}
<div class="text-center py-12">
<svg class="mx-auto h-12 w-12 text-gray-400" stroke="currentColor" fill="none" viewBox="0 0 48 48">
<path d="M34 40h10v-4a6 6 0 00-10.712-3.714M34 40H14m20 0v-4a9.971 9.971 0 00-.712-3.714M14 40H4v-4a6 6 0 0110.713-3.714M14 40v-4c0-1.313.253-2.566.713-3.714m0 0A10.003 10.003 0 0124 26c4.21 0 7.813 2.602 9.288 6.286" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg>
<h3 class="mt-2 text-sm font-medium text-gray-900">Aucune classe</h3>
<p class="mt-1 text-sm text-gray-500">Commencez par créer votre première classe.</p>
<div class="mt-6">
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md transition-colors">
Nouvelle classe
</button>
</div>
</div>
{% endif %}
</div>
{% endblock %}

142
templates/index.html Normal file
View File

@@ -0,0 +1,142 @@
{% extends "base.html" %}
{% block title %}Accueil - Gestion Scolaire{% endblock %}
{% block content %}
<div class="space-y-8">
<div class="text-center">
<h1 class="text-3xl font-bold text-gray-900 mb-4">Tableau de bord</h1>
<p class="text-lg text-gray-600">Bienvenue dans votre application de gestion scolaire</p>
</div>
<!-- Statistiques -->
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="bg-white rounded-lg shadow p-6">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-8 h-8 bg-blue-500 rounded-full flex items-center justify-center">
<svg class="w-5 h-5 text-white" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</div>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-gray-500">Classes</div>
<div class="text-2xl font-bold text-gray-900">{{ total_classes }}</div>
</div>
</div>
</div>
<div class="bg-white rounded-lg shadow p-6">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-8 h-8 bg-green-500 rounded-full flex items-center justify-center">
<svg class="w-5 h-5 text-white" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z"/>
</svg>
</div>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-gray-500">Élèves</div>
<div class="text-2xl font-bold text-gray-900">{{ total_students }}</div>
</div>
</div>
</div>
<div class="bg-white rounded-lg shadow p-6">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-8 h-8 bg-purple-500 rounded-full flex items-center justify-center">
<svg class="w-5 h-5 text-white" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"/>
<path fill-rule="evenodd" d="M4 5a2 2 0 012-2v1a1 1 0 102 0V3a2 2 0 012 2v6a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm2.5 2.5a.5.5 0 000 1h3a.5.5 0 000-1h-3z" clip-rule="evenodd"/>
</svg>
</div>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-gray-500">Évaluations</div>
<div class="text-2xl font-bold text-gray-900">{{ total_assessments }}</div>
</div>
</div>
</div>
</div>
<!-- Évaluations récentes -->
<div class="bg-white rounded-lg shadow">
<div class="px-6 py-4 border-b border-gray-200">
<h2 class="text-lg font-medium text-gray-900">Évaluations récentes</h2>
</div>
<div class="px-6 py-4">
{% if recent_assessments %}
<div class="space-y-4">
{% for assessment in recent_assessments %}
<div class="flex items-center justify-between py-3 border-b border-gray-100 last:border-b-0">
<div>
<h3 class="text-sm font-medium text-gray-900">{{ assessment.title }}</h3>
<p class="text-sm text-gray-500">{{ assessment.class_group.name }} - {{ assessment.date.strftime('%d/%m/%Y') }}</p>
</div>
<div class="text-sm text-gray-500">
Coeff. {{ assessment.coefficient }}
</div>
</div>
{% endfor %}
</div>
{% else %}
<p class="text-gray-500 text-center py-8">Aucune évaluation trouvée</p>
{% endif %}
</div>
</div>
<!-- Actions rapides -->
<div class="bg-white rounded-lg shadow">
<div class="px-6 py-4 border-b border-gray-200">
<h2 class="text-lg font-medium text-gray-900">Actions rapides</h2>
</div>
<div class="px-6 py-4">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
<a href="{{ url_for('classes') }}" class="block p-4 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors">
<div class="text-center">
<div class="w-8 h-8 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-2">
<svg class="w-4 h-4 text-blue-600" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/>
</svg>
</div>
<div class="text-sm font-medium text-gray-900">Gérer les classes</div>
</div>
</a>
<a href="{{ url_for('students') }}" class="block p-4 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors">
<div class="text-center">
<div class="w-8 h-8 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-2">
<svg class="w-4 h-4 text-green-600" fill="currentColor" viewBox="0 0 20 20">
<path d="M10 9a3 3 0 100-6 3 3 0 000 6zm-7 9a7 7 0 1114 0H3z"/>
</svg>
</div>
<div class="text-sm font-medium text-gray-900">Gérer les élèves</div>
</div>
</a>
<a href="{{ url_for('assessments') }}" class="block p-4 border border-gray-200 rounded-lg hover:bg-gray-50 transition-colors">
<div class="text-center">
<div class="w-8 h-8 bg-purple-100 rounded-full flex items-center justify-center mx-auto mb-2">
<svg class="w-4 h-4 text-purple-600" fill="currentColor" viewBox="0 0 20 20">
<path d="M9 2a1 1 0 000 2h2a1 1 0 100-2H9z"/>
<path fill-rule="evenodd" d="M4 5a2 2 0 012-2v1a1 1 0 102 0V3a2 2 0 012 2v6a2 2 0 01-2 2H6a2 2 0 01-2-2V5zm2.5 2.5a.5.5 0 000 1h3a.5.5 0 000-1h-3z" clip-rule="evenodd"/>
</svg>
</div>
<div class="text-sm font-medium text-gray-900">Créer évaluation</div>
</div>
</a>
<div class="block p-4 border border-gray-200 rounded-lg bg-gray-50">
<div class="text-center">
<div class="w-8 h-8 bg-gray-100 rounded-full flex items-center justify-center mx-auto mb-2">
<svg class="w-4 h-4 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
<path fill-rule="evenodd" d="M3 4a1 1 0 011-1h12a1 1 0 011 1v2a1 1 0 01-1 1H4a1 1 0 01-1-1V4zm0 4a1 1 0 011-1h12a1 1 0 011 1v6a1 1 0 01-1 1H4a1 1 0 01-1-1V8z" clip-rule="evenodd"/>
</svg>
</div>
<div class="text-sm font-medium text-gray-500">Rapports (prochainement)</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

64
templates/students.html Normal file
View File

@@ -0,0 +1,64 @@
{% extends "base.html" %}
{% block title %}Élèves - Gestion Scolaire{% endblock %}
{% block content %}
<div class="space-y-6">
<div class="flex justify-between items-center">
<h1 class="text-2xl font-bold text-gray-900">Gestion des élèves</h1>
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md transition-colors">
Nouvel élève
</button>
</div>
{% if students %}
<div class="bg-white shadow overflow-hidden sm:rounded-md">
<ul class="divide-y divide-gray-200">
{% for student in students %}
<li>
<div class="px-4 py-4 flex items-center justify-between">
<div class="flex items-center">
<div class="flex-shrink-0">
<div class="w-10 h-10 bg-green-100 rounded-full flex items-center justify-center">
<span class="text-sm font-medium text-green-600">{{ student.first_name[0] }}{{ student.last_name[0] }}</span>
</div>
</div>
<div class="ml-4">
<div class="text-sm font-medium text-gray-900">{{ student.first_name }} {{ student.last_name }}</div>
<div class="text-sm text-gray-500">
{{ student.class_group.name }}
{% if student.email %}
- {{ student.email }}
{% endif %}
</div>
</div>
</div>
<div class="flex space-x-2">
<button class="text-indigo-600 hover:text-indigo-900 text-sm font-medium">
Voir notes
</button>
<button class="text-gray-600 hover:text-gray-900 text-sm font-medium">
Modifier
</button>
</div>
</div>
</li>
{% endfor %}
</ul>
</div>
{% else %}
<div class="text-center py-12">
<svg class="mx-auto h-12 w-12 text-gray-400" stroke="currentColor" fill="none" viewBox="0 0 48 48">
<path d="M28 8H12a4 4 0 00-4 4v20m32-12v8m0 0v8a4 4 0 01-4 4H12a4 4 0 01-4-4v-4m32-4l-3.172-3.172a4 4 0 00-5.656 0L28 28M8 32l9.172-9.172a4 4 0 015.656 0L28 28m0 0l4 4m4-24h8m-4-4v8m-12 4h.02" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg>
<h3 class="mt-2 text-sm font-medium text-gray-900">Aucun élève</h3>
<p class="mt-1 text-sm text-gray-500">Commencez par ajouter vos premiers élèves.</p>
<div class="mt-6">
<button class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md transition-colors">
Nouvel élève
</button>
</div>
</div>
{% endif %}
</div>
{% endblock %}