From 3f6581391ca0a9a15b832bb70afef256d82a63f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Thu, 14 Nov 2024 01:07:19 +0100 Subject: [PATCH] Make UI. --- mainsite/admin.py | 6 +- mainsite/migrations/0001_initial.py | 29 ++++++ mainsite/models.py | 8 +- mainsite/scss/_params.scss | 7 +- mainsite/scss/style.scss | 93 +++++++++++++++++++- mainsite/static/css/font-opensans.css | 58 ++++++++++++ mainsite/static/css/fonts.css | 1 + mainsite/static/css/style.css | 70 +++++++++++++-- mainsite/static/favicon.svg | 1 + mainsite/static/fonts/OpenSans-Regular.woff | Bin 0 -> 20696 bytes mainsite/templates/base.html | 11 +++ mainsite/templates/phd/home.html | 30 ++++++- mainsite/urls.py | 4 +- mainsite/views.py | 22 ++++- 14 files changed, 319 insertions(+), 21 deletions(-) create mode 100644 mainsite/migrations/0001_initial.py create mode 100644 mainsite/static/css/font-opensans.css create mode 100644 mainsite/static/css/fonts.css create mode 100644 mainsite/static/favicon.svg create mode 100644 mainsite/static/fonts/OpenSans-Regular.woff diff --git a/mainsite/admin.py b/mainsite/admin.py index 8c38f3f..d5c6dba 100644 --- a/mainsite/admin.py +++ b/mainsite/admin.py @@ -1,3 +1,7 @@ from django.contrib import admin +from .models import Presence -# Register your models here. + +@admin.register(Presence) +class PresenceAdmin(admin.ModelAdmin): + list_display = ["name", "created"] diff --git a/mainsite/migrations/0001_initial.py b/mainsite/migrations/0001_initial.py new file mode 100644 index 0000000..bca3b25 --- /dev/null +++ b/mainsite/migrations/0001_initial.py @@ -0,0 +1,29 @@ +# Generated by Django 5.1.3 on 2024-11-14 00:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="Presence", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("name", models.CharField(max_length=256, verbose_name="Nom")), + ("created", models.DateTimeField(auto_now_add=True)), + ], + ), + ] diff --git a/mainsite/models.py b/mainsite/models.py index 71a8362..d4b3908 100644 --- a/mainsite/models.py +++ b/mainsite/models.py @@ -1,3 +1,9 @@ from django.db import models -# Create your models here. + +class Presence(models.Model): + name = models.CharField(max_length=256, blank=False, null=False, verbose_name="Nom") + created = models.DateTimeField(auto_now=False, auto_now_add=True) + + def __str__(self): + return self.name diff --git a/mainsite/scss/_params.scss b/mainsite/scss/_params.scss index c1211ec..8b5e2f0 100644 --- a/mainsite/scss/_params.scss +++ b/mainsite/scss/_params.scss @@ -8,7 +8,8 @@ $head_bg_color: #060033; $resp_small: 1350px; $resp_vsmall: 1000px; +$resp_tiny: 440px; -$profile_pic_wid: 350px; -$profile_pic_wid_small: 180px; -$profile_pic_wid_vsmall: 250px; +$main_width: 800px; +$active_color: #9593c6; +$active_color_bg: #9593c616; diff --git a/mainsite/scss/style.scss b/mainsite/scss/style.scss index df3e4a4..2d06503 100644 --- a/mainsite/scss/style.scss +++ b/mainsite/scss/style.scss @@ -15,6 +15,11 @@ body { text-align:justify; margin: 0; padding: 0; + + @media (max-width: $resp_tiny) { + font-size:14px; + line-height:1.3; + } } header { @@ -23,7 +28,9 @@ header { flex-flow: row wrap; justify-content: space-between; align-items: center; + column-gap: 30px; margin: 0; + margin-bottom: 20px; padding: 30px 60px; color: $bg_color; @@ -41,6 +48,26 @@ header { } } +#messages { + display: flex; + justify-content: space-between; + + .message { + max-width: $main_width; + flex-basis: $main_width; + + border: 2px solid black; + border-radius: 8px; + padding: 5px 15px; + margin: 5px auto; + + &.success { + background-color: #e1ffef; + border-color: #159953; + } + } +} + #content { display: flex; justify-content: space-between; @@ -50,10 +77,14 @@ header { } main { - margin:2em auto; - max-width:800px; - padding:1em; - flex-basis: 800px; + margin: 10px auto; + padding: 0 30px; + max-width: $main_width; + flex-basis: $main_width; + + @media (max-width: $resp_tiny) { + padding: 0 20px; + } } } @@ -120,6 +151,7 @@ dl { list-style: none; display: grid; grid-template-columns: 1fr 3fr; + align-items: center; dt { grid-column: 1 / span 1; @@ -133,6 +165,10 @@ dl { justify-self: start; text-align: left; } + + dt, dd { + padding: 5px 0; + } } .antispam { @@ -147,3 +183,52 @@ dl { position: relative; top: 5px; } + +input:focus { + outline: none; +} + +form { + p.already_replied { + color: red; + } + + div { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + align-items: center; + column-gap: 15px; + margin: 5px 0; + + input[type=text] { + width: 100%; + padding: 5px; + border: 2px solid #ccc; + border-radius: 5px; + + &:focus { + border-color: $active_color; + background-color: $active_color_bg; + } + } + } + + input[type=submit] { + margin-top: 10px; + padding: 5px 15px; + background: #ccc; + border: 0 none; + border-radius: 5px; + cursor: pointer; + width: 100%; + font-size: 1.1em; + + &:focus, &:hover { + background-color: $active_color; + } + &:active { + background-color: darken($active_color, 15%); + } + } +} diff --git a/mainsite/static/css/font-opensans.css b/mainsite/static/css/font-opensans.css new file mode 100644 index 0000000..4c1452b --- /dev/null +++ b/mainsite/static/css/font-opensans.css @@ -0,0 +1,58 @@ +/**** OPEN SANS **************************************************************/ + +/* cyrillic-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; +} +/* cyrillic */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans Regular'), local('OpenSans-Regular'), url('../fonts/OpenSans-Regular.woff') format('woff'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} diff --git a/mainsite/static/css/fonts.css b/mainsite/static/css/fonts.css new file mode 100644 index 0000000..a5b4831 --- /dev/null +++ b/mainsite/static/css/fonts.css @@ -0,0 +1 @@ +@import url('font-opensans.css'); diff --git a/mainsite/static/css/style.css b/mainsite/static/css/style.css index 3215ae8..9c0e5f4 100644 --- a/mainsite/static/css/style.css +++ b/mainsite/static/css/style.css @@ -10,14 +10,19 @@ body { text-align: justify; margin: 0; padding: 0; } - + @media (max-width: 440px) { + body { + font-size: 14px; + line-height: 1.3; } } header { background-color: #060033; display: flex; flex-flow: row wrap; justify-content: space-between; align-items: center; + column-gap: 30px; margin: 0; + margin-bottom: 20px; padding: 30px 60px; color: white; } @media (max-width: 1000px) { @@ -29,6 +34,20 @@ header { header a, header a:visited { color: white; } +#messages { + display: flex; + justify-content: space-between; } + #messages .message { + max-width: 800px; + flex-basis: 800px; + border: 2px solid black; + border-radius: 8px; + padding: 5px 15px; + margin: 5px auto; } + #messages .message.success { + background-color: #e1ffef; + border-color: #159953; } + #content { display: flex; justify-content: space-between; } @@ -36,11 +55,13 @@ header { #content { flex-wrap: wrap; } } #content main { - margin: 2em auto; + margin: 10px auto; + padding: 0 30px; max-width: 800px; - padding: 1em; flex-basis: 800px; } - + @media (max-width: 440px) { + #content main { + padding: 0 20px; } } .items { display: grid; grid-template-columns: 100px auto; } @@ -88,7 +109,8 @@ ul.docsline { dl { list-style: none; display: grid; - grid-template-columns: 1fr 3fr; } + grid-template-columns: 1fr 3fr; + align-items: center; } dl dt { grid-column: 1 / span 1; justify-self: end; @@ -99,6 +121,8 @@ dl { margin-left: 20px; justify-self: start; text-align: left; } + dl dt, dl dd { + padding: 5px 0; } .antispam { unicode-bidi: bidi-override; @@ -110,3 +134,39 @@ dl { height: auto; position: relative; top: 5px; } + +input:focus { + outline: none; } + +form p.already_replied { + color: red; } + +form div { + display: flex; + flex-flow: row nowrap; + justify-content: space-between; + align-items: center; + column-gap: 15px; + margin: 5px 0; } + form div input[type=text] { + width: 100%; + padding: 5px; + border: 2px solid #ccc; + border-radius: 5px; } + form div input[type=text]:focus { + border-color: #9593c6; + background-color: #9593c616; } + +form input[type=submit] { + margin-top: 10px; + padding: 5px 15px; + background: #ccc; + border: 0 none; + border-radius: 5px; + cursor: pointer; + width: 100%; + font-size: 1.1em; } + form input[type=submit]:focus, form input[type=submit]:hover { + background-color: #9593c6; } + form input[type=submit]:active { + background-color: #6461ac; } diff --git a/mainsite/static/favicon.svg b/mainsite/static/favicon.svg new file mode 100644 index 0000000..8d17aee --- /dev/null +++ b/mainsite/static/favicon.svg @@ -0,0 +1 @@ + diff --git a/mainsite/static/fonts/OpenSans-Regular.woff b/mainsite/static/fonts/OpenSans-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..e1153e330b467d122a018bb20fc736972c692330 GIT binary patch literal 20696 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 baepuBUz_2{Z2LF Soutenance de thèse — Théophile Bastian + @@ -14,6 +15,16 @@ {% include "navbar.html" %} + {% if messages %} +

+ {% for message in messages %} +
+ {{ message }} +
+ {% endfor %} +
+ {% endif %} +
{% block content %} diff --git a/mainsite/templates/phd/home.html b/mainsite/templates/phd/home.html index 1b7356b..d0f6bde 100644 --- a/mainsite/templates/phd/home.html +++ b/mainsite/templates/phd/home.html @@ -20,8 +20,7 @@ prochainement disponible), une partie du jury étant à distance.

Toute personne qui le souhaite est bienvenue pour y assister !

-

Détails pratiques

- +

Informations pratiques

{% lucide "calendar" %}
@@ -44,7 +43,32 @@ Campus universitaire, Université Grenoble Alpes
bus C5 bus C8 Université Bibliothèques + +
{% lucide "headset" %}
+
(lien de visio à venir)
+ +
{% lucide "calendar-cog" %}
+
Événement calendrier
-{% endblock content %} +

Recensement des estomacs

+

Qui dit soutenance, dit pot. Et pour qu'on ait assez à manger, je vous invite +donc à remplir le sondage ci-dessous si vous comptez assister à la soutenance. +

+ +

Et si jamais vous êtes très motivé·e pour filer un coup de main à +l'organisation, n'hésitez pas à m'en parler :)

+ +
+ {% csrf_token %} + + {% if has_replied %} +

Vous avez déjà répondu depuis ce navigateur.

+ {% endif %} + + {{ form.as_div }} + +
+ +{% endblock content %} diff --git a/mainsite/urls.py b/mainsite/urls.py index d7c93dc..077c27b 100644 --- a/mainsite/urls.py +++ b/mainsite/urls.py @@ -1,4 +1,6 @@ from django.urls import path from . import views -urlpatterns = [path("", views.HomeView.as_view(), name="home")] +urlpatterns = [ + path("", views.HomeView.as_view(), name="home"), +] diff --git a/mainsite/views.py b/mainsite/views.py index d2accd6..06e08fa 100644 --- a/mainsite/views.py +++ b/mainsite/views.py @@ -1,8 +1,24 @@ -from django.shortcuts import render -from django.views.generic import TemplateView +from django.contrib.messages.views import SuccessMessageMixin +from django.urls import reverse_lazy +from django.views.generic.edit import CreateView + +from .models import Presence -class HomeView(TemplateView): +class HomeView(SuccessMessageMixin, CreateView): """Home page""" template_name = "phd/home.html" + model = Presence + fields = ["name"] + success_url = reverse_lazy("home") + success_message = "Super, merci d'avoir prévenu !" + + def get_context_data(self, **kwargs): + context = super().get_context_data(**kwargs) + context["has_replied"] = self.request.session.get("presence_has_replied", False) + return context + + def form_valid(self, form): + self.request.session["presence_has_replied"] = True + return super().form_valid(form)