From a835078594d8aa420c3fac289ac1840d1cfdaf35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Mogu=C3=A9rou?= Date: Sun, 14 Apr 2024 02:24:40 +0200 Subject: [PATCH] initial --- .idea/.gitignore | 6 + .idea/.name | 1 + .idea/dataSources.xml | 12 ++ .idea/vcs.xml | 6 + colloscope/__init__.py | 0 colloscope/admin.py | 3 + colloscope/apps.py | 6 + colloscope/migrations/0001_initial.py | 40 ++++++ colloscope/migrations/__init__.py | 0 colloscope/models.py | 15 +++ colloscope/pdfexport.py | 172 ++++++++++++++++++++++++++ colloscope/templates/colloscope.html | 52 ++++++++ colloscope/test.pdf | Bin 0 -> 5327 bytes colloscope/tests.py | 3 + colloscope/urls.py | 6 + colloscope/views.py | 6 + kholles_web/__init__.py | 0 kholles_web/asgi.py | 16 +++ kholles_web/settings.py | 128 +++++++++++++++++++ kholles_web/urls.py | 23 ++++ kholles_web/wsgi.py | 16 +++ manage.py | 22 ++++ static/main.css | 41 ++++++ 23 files changed, 574 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/.name create mode 100644 .idea/dataSources.xml create mode 100644 .idea/vcs.xml create mode 100644 colloscope/__init__.py create mode 100644 colloscope/admin.py create mode 100644 colloscope/apps.py create mode 100644 colloscope/migrations/0001_initial.py create mode 100644 colloscope/migrations/__init__.py create mode 100644 colloscope/models.py create mode 100644 colloscope/pdfexport.py create mode 100644 colloscope/templates/colloscope.html create mode 100644 colloscope/test.pdf create mode 100644 colloscope/tests.py create mode 100644 colloscope/urls.py create mode 100644 colloscope/views.py create mode 100644 kholles_web/__init__.py create mode 100644 kholles_web/asgi.py create mode 100644 kholles_web/settings.py create mode 100644 kholles_web/urls.py create mode 100644 kholles_web/wsgi.py create mode 100755 manage.py create mode 100644 static/main.css diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..8bf4d45 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,6 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..ba520cc --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +db.sqlite3 \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..f1ffd8d --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:$PROJECT_DIR$/db.sqlite3 + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/colloscope/__init__.py b/colloscope/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/colloscope/admin.py b/colloscope/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/colloscope/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/colloscope/apps.py b/colloscope/apps.py new file mode 100644 index 0000000..2c5cbed --- /dev/null +++ b/colloscope/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ColloscopeConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'colloscope' diff --git a/colloscope/migrations/0001_initial.py b/colloscope/migrations/0001_initial.py new file mode 100644 index 0000000..1e6583e --- /dev/null +++ b/colloscope/migrations/0001_initial.py @@ -0,0 +1,40 @@ +# Generated by Django 5.0.4 on 2024-04-12 22:38 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Colleur', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('nom', models.CharField(max_length=100)), + ], + ), + migrations.CreateModel( + name='Etudiant', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('prenom', models.CharField(max_length=100)), + ('nom', models.CharField(max_length=100)), + ('groupe', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Colle', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('groupe', models.IntegerField()), + ('date', models.DateTimeField()), + ('colleur', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='colloscope.colleur')), + ], + ), + ] diff --git a/colloscope/migrations/__init__.py b/colloscope/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/colloscope/models.py b/colloscope/models.py new file mode 100644 index 0000000..3c2c89f --- /dev/null +++ b/colloscope/models.py @@ -0,0 +1,15 @@ +from django.db import models + + +class Colleur(models.Model): + nom=models.CharField(max_length=100) + +class Etudiant(models.Model): + prenom=models.CharField(max_length=100) + nom=models.CharField(max_length=100) + groupe=models.IntegerField() + +class Colle(models.Model): + colleur=models.ForeignKey(Colleur, on_delete=models.CASCADE) + groupe=models.IntegerField() + date=models.DateTimeField() diff --git a/colloscope/pdfexport.py b/colloscope/pdfexport.py new file mode 100644 index 0000000..33a4c78 --- /dev/null +++ b/colloscope/pdfexport.py @@ -0,0 +1,172 @@ +from datetime import date, timedelta + +from fpdf import FPDF +from fpdf.fonts import FontFace +from fpdf.enums import TableCellFillMode + +sem_1 = date(2023, 9, 18) + +vacances_zoneA = [ + ( date(2023, 10, 21), date(2023, 11, 6) ), + ( date(2023, 12, 23), date(2024, 1, 8) ), + ( date(2024, 2, 10), date(2024, 2, 26) ), + ( date(2024, 4, 6), date(2024, 4, 22) ), +] + +def jour_of_sem(n, vac): + jour = sem_1 + (n-1) * timedelta(weeks=1) + + for (debut, fin) in vac: + if jour >= debut: + jour += 2*timedelta(weeks=1) + + return jour + +def generate(): + pdf = FPDF(orientation="landscape", format="A4") + pdf.set_font("helvetica", size=6) + + pdf.set_title("Colloscope MP2I Semestre 5/2") + pdf.set_author("Projet colloscope") + pdf.set_author("Projet colloscope") + + etudiants = [ + ["Aboujaib", "Alexandre", 4, "A", "Angl.", "All."], + ["Ajan", "George", 4, "A", "Angl.", ""], + ["Akrad", "Lina", 1, "SI", "Angl.", ""], + ["Aubert", "Nicolas", 1, "SI", "Angl.", ""], + ["Badr", "Roman", 4, "A", "Angl.", ""], + ["Bazire", "Aurélien", 5, "A", "Angl.", ""], + ["Boit", "Arthur", 1, "SI", "Angl.", ""], + ["Boubker", "Youssef", 1, "SI", "Angl.", ""], + ["Boudjema", "Dylan", 1, "SI", "Angl.", ""], + ["Chiriac", "Mihnea", 1, "SI", "Angl.", ""], + ["Courier", "Marine", 1, "SI", "Angl.", ""], + ["Daguin", "Joseph", 1, "SI", "Angl.", ""], + ["De Weer", "Matthias", 1, "SI", "Angl.", ""], + ["Desbouis", "Katell", 1, "SI", "Angl.", ""], + ["Dupouy", "Jérémie", 1, "SI", "Angl.", ""], + ["Hariri--Gautier-Picard", "Grégoire", 1, "SI", "Angl.", ""], + ["Juricevic", "Matteo", 1, "SI", "Angl.", ""], + ["Knanoua", "Anas", 1, "SI", "Angl.", ""], + ["Lesenne", "Pierrick", 1, "SI", "Angl.", ""], + ["Lin", "Hao", 1, "SI", "Angl.", ""], + ["Masbatin", "Lucas", 1, "SI", "Angl.", ""], + ["Mayuran", "Mithushan", 1, "SI", "Angl.", ""], + ["Messahli", "Yassine", 1, "SI", "Angl.", ""], + ["Moguérou", "Valentin", 10, "B", "Angl.", "All."], + ["Mohellebi", "Mathéo", 10, "B", "Angl.", "All."], + ["Mouisset--Ferrara", "Maël", 10, "B", "Angl.", "All."], + ["Ottavi", "Corentin", 10, "B", "Angl.", "All."], + ["Ponce", "Alexian", 10, "B", "Angl.", "All."], + ["Pujol", "Raphaël", 10, "B", "Angl.", "All."], + ["Pustetto", "Mathis", 10, "B", "Angl.", "All."], + ["Radice", "Roman", 10, "B", "Angl.", "All."], + ["Rat", "Evelyn", 10, "B", "Angl.", "All."], + ["Rousse", "Louis", 10, "B", "Angl.", "All."], + ["Roux", "Gaëtan", 10, "B", "Angl.", "All."], + ["Rouyre--Cros", "Célian", 10, "B", "Angl.", "All."], + ["Sourbé", "François-Gabriel", 10, "B", "Angl.", "All."], + ["Stourbe", "Simon", 10, "B", "Angl.", "All."], + ["Thai", "Dany", 10, "B", "Angl.", "All."], + ["Théodore", "Jonathan", 10, "B", "Angl.", "All."], + ["Vandroux", "Benoît", 10, "B", "Angl.", "All."], + ["Veyssière", "Thibaud", 10, "B", "Angl.", "All."], + ["Vié", "Adrien", 10, "B", "Angl.", "All."], + ["Ye", "Luan", 10, "B", "Angl.", "All."], + ["Zarka", "Amélie", 10, "B", "Angl.", "All."], + ] + + creneaux = [ + ["Mathématiques", "vendredi", "17:00", "M. OUBAHA", "C382"], + ["Anglais", "mercredi", "14:00", "Mme LE GOURIELLEC", "C393"], + ["Mathématiques", "mercredi", "15:00", "M. BOULLY", "R004"], + ["Physique", "mardi", "14:00", "Mme CHEVALIER", "R103"], + ["Mathématiques", "mardi", "18:00", "M. RAPIN", "V152"], + ["Anglais", "mardi", "14:00", "Mme BELAGGOUNE", "C4??"], + ["pas de colle", "", "", "", ""], + ["Physique", "mardi", "17:00", "M. COLIN", "C386"], + ["Mathématiques", "mercredi", "13:30", "M. BOUVEROT", "??"], + ["Anglais", "lundi", "13:00", "M. HERBAUT", "V052"], + ] + + semaines = list(range(24, 34)) + + rotations = [ + # [semaine, groupe, creneau] + (24, 1, 1), + (24, 2, 2), + (24, 3, 3), + (27, 3, 3), + (28, 3, 3), + (31, 3, 3), + ] + + pdf.add_page() + + pdf.cell(text="Colloscope MP2I Semestre 5/2", center=True, border=1, h=5) + + base_y = pdf.t_margin + 10 + + pdf.set_y(base_y) + + with pdf.table( + align="RIGHT", + col_widths=(50, 35, 12, 12, 12, 12), + width=80, + line_height=3) as table: + header = table.row() + for th in ("Nom", "Prénom", "Grp.", "TD", "LV1", "LV2"): + header.cell(th) + + for etu in etudiants: + row = table.row() + row.cell(etu[0].upper()) # Nom + row.cell(etu[1]) # Prénom + row.cell(str(etu[2])) # Groupe + row.cell(etu[3]) # TD + row.cell(etu[4]) # LV1 + row.cell(etu[5]) # LV2 + + pdf.set_y(base_y) + + with pdf.table( + align="LEFT", + width=190, + line_height=3, + col_widths=(25, 12, 10, 25, 12, *(10,)*len(semaines)), + num_heading_rows=2) as table: + + header = table.row() + for th in ("Matière", "Jour", "Heure", "Colleur", "Salle"): + header.cell(th, align="CENTER", rowspan=2) + + for sem in semaines: + header.cell(str(sem), align="CENTER") + + header2 = table.row() + for sem in semaines: + header2.cell(jour_of_sem(sem, vacances_zoneA).strftime("%d/%m/%y"), align="CENTER") + + for i, tr in enumerate(creneaux): + matiere, jour, heure, colleur, salle = tr + + row = table.row() + row.cell(matiere) + row.cell(jour) + row.cell(heure) + row.cell(colleur) + row.cell(salle) + + for s in semaines: + for rot in rotations: + if rot[2] == i and rot[0] == s: + row.cell(str(rot[1]), align="CENTER") + break + else: + row.cell() + + pdf.output("test.pdf") + +if __name__ == "__main__": + generate() diff --git a/colloscope/templates/colloscope.html b/colloscope/templates/colloscope.html new file mode 100644 index 0000000..e768a2e --- /dev/null +++ b/colloscope/templates/colloscope.html @@ -0,0 +1,52 @@ +{% load static %} + + + + + + Colloscope + + + +
+

Universal Kholloscope Systems™

+ + + +
+ +
+ +

Programme de colles

+

+ Mathématiques : Dimension finie et matrices +

+

+ Physique : Mécanique du solide +

+ +

+ Colles cette semaine +

+ + + +
+ + + + diff --git a/colloscope/test.pdf b/colloscope/test.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a3a217c8e39e55104989b4945d3161f8e4d7e44f GIT binary patch literal 5327 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 literal 0 HcmV?d00001 diff --git a/colloscope/tests.py b/colloscope/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/colloscope/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/colloscope/urls.py b/colloscope/urls.py new file mode 100644 index 0000000..344f355 --- /dev/null +++ b/colloscope/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path("colloscope/", views.colloscope, name="colloscope"), +] diff --git a/colloscope/views.py b/colloscope/views.py new file mode 100644 index 0000000..ca03278 --- /dev/null +++ b/colloscope/views.py @@ -0,0 +1,6 @@ +from django.http import HttpResponse +from django.template import loader + +def colloscope(request): + template = loader.get_template("colloscope.html") + return HttpResponse(template.render()) diff --git a/kholles_web/__init__.py b/kholles_web/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/kholles_web/asgi.py b/kholles_web/asgi.py new file mode 100644 index 0000000..f3e3745 --- /dev/null +++ b/kholles_web/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for kholles_web project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kholles_web.settings') + +application = get_asgi_application() diff --git a/kholles_web/settings.py b/kholles_web/settings.py new file mode 100644 index 0000000..2ef7991 --- /dev/null +++ b/kholles_web/settings.py @@ -0,0 +1,128 @@ +""" +Django settings for kholles_web project. + +Generated by 'django-admin startproject' using Django 5.0.4. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.0/ref/settings/ +""" + +from pathlib import Path + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +BASE_DIR = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'django-insecure-$)@!wj+$^y1@^tr78ay&)cna10da_k^vncrbo+4ja-qth$8bhz' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'colloscope', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'kholles_web.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'kholles_web.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/5.0/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': BASE_DIR / 'db.sqlite3', + } +} + + +# Password validation +# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/5.0/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.0/howto/static-files/ + +STATIC_URL = 'static/' + +STATICFILES_DIRS = [ + BASE_DIR / "static", +] + +# Default primary key field type +# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' diff --git a/kholles_web/urls.py b/kholles_web/urls.py new file mode 100644 index 0000000..0b2d6a4 --- /dev/null +++ b/kholles_web/urls.py @@ -0,0 +1,23 @@ +""" +URL configuration for kholles_web project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.contrib import admin +from django.urls import include, path + +urlpatterns = [ + path('', include('colloscope.urls')), + path('admin/', admin.site.urls), +] diff --git a/kholles_web/wsgi.py b/kholles_web/wsgi.py new file mode 100644 index 0000000..6815e91 --- /dev/null +++ b/kholles_web/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for kholles_web project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kholles_web.settings') + +application = get_wsgi_application() diff --git a/manage.py b/manage.py new file mode 100755 index 0000000..844f791 --- /dev/null +++ b/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'kholles_web.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main() diff --git a/static/main.css b/static/main.css new file mode 100644 index 0000000..309f005 --- /dev/null +++ b/static/main.css @@ -0,0 +1,41 @@ +body { + font-family: sans-serif; + margin: 0; +} + +main { + margin: 5px; +} + +h1 { + text-align: center; +} + +nav.semaine { + width: 100%; + display: flex; + background-color: #ddd; + justify-content: center; +} + +nav.semaine .select, nav.semaine .label { + padding: 5px; + text-align: center; +} + +nav.semaine .select { background-color: dodgerblue; color: white; width: 1em; } +nav.semaine .select:hover { background-color: #0077ea; } + +nav.semaine .label:hover { + background-color: #ccc; +} + +p.programme { + border-left: 5px solid gold; + padding: 10px; + background-color: #ffffdd; +} + +footer { + text-align: center; +}