merge experimental #1

Merged
jlobbes merged 25 commits from experimental into master 2023-08-17 15:16:51 +01:00
25 changed files with 158 additions and 8 deletions
Showing only changes of commit dfec5baeeb - Show all commits

View File

View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class AuthenticationConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'authentication'

View File

View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

View File

@ -0,0 +1,39 @@
{% extends 'core/base.html' %}
{% block content %}
<div class="flex flex-col justify-center items-center gap-2 py-4">
{% if form.errors %}
<div class="status-message error">
<p>Your username and password didn't match. Please try again.</p>
</div>
{% endif %}
{% if next %}
<div class="status-message error">
{% if user.is_authenticated %}
<p>Your account doesn't have access to this page. To proceed,
please login with an account that has access.</p>
{% else %}
<p>Please <a href="{% url 'login' %}">log in</a> to see this page.</p>
{% endif %}
</div>
{% endif %}
<form method="post" action="{% url 'login' %}">
{% csrf_token %}
<fieldset class="border border-accent p-4">
<legend>Please enter your login details</legend>
<div class="grid grid-cols-4 justify-center items-center gap-2">
<div class="col-span-1">{{ form.username.label_tag }}</div>
<div class="col-span-3">{{ form.username }}</div>
<div class="col-span-1">{{ form.password.label_tag }}</div>
<div class="col-span-3">{{ form.password }}</div>
<input class="col-span-4" type="submit" value="Log In">
</div>
<input type="hidden" name="next" value="{{ next }}">
</fieldset>
</form>
{# Assumes you set up the password_reset view in your URLconf #}
{% comment %}<p><a href="{% url 'password_reset' %}">Lost password?</a></p>{% endcomment %}
</div>
{% endblock content %}

View File

@ -0,0 +1,4 @@
{% extends 'core/base.html' %}
{% block content %}
<p>You have been logged out.</p>
{% endblock content %}

View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

View File

@ -0,0 +1,8 @@
from django.urls import path
from django.contrib.auth import views as auth_views
urlpatterns = [
path("login/", auth_views.LoginView.as_view(template_name="authentication/login.html"), name="login"),
path("logout/", auth_views.LogoutView.as_view(template_name="authentication/logout.html"), name="logout"),
]

View File

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View File

@ -32,6 +32,8 @@ ALLOWED_HOSTS = []
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'core',
'authentication.apps.AuthenticationConfig',
'medwings.apps.MedwingsConfig', 'medwings.apps.MedwingsConfig',
'django.contrib.admin', 'django.contrib.admin',
'django.contrib.auth', 'django.contrib.auth',
@ -104,6 +106,9 @@ AUTH_PASSWORD_VALIDATORS = [
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
}, },
] ]
LOGIN_REDIRECT_URL = 'home'
LOGIN_URL = 'login'
LOGOUT_REDIRECT_URL = 'home'
# Internationalization # Internationalization

View File

@ -13,14 +13,14 @@
</head> </head>
<body class="global"> <body class="global">
<header class="global"> <header class="global">
{% include 'medwings/navbar.html' %} {% include 'core/navbar.html' %}
</header> </header>
<main class="global"> <main class="global">
{% block content %} {% block content %}
{% endblock content %} {% endblock content %}
</main> </main>
<footer class="global"> <footer class="global">
{% include 'medwings/footer.html' %} {% include 'core/footer.html' %}
</footer> </footer>
<script src="{% static 'dist/main.js' %}"></script> <script src="{% static 'dist/main.js' %}"></script>
</body> </body>

View File

@ -0,0 +1,3 @@
<div class="flex gap-4 justify-center items-center p-2 bg-background-700 text-sm">
<p>&copy; 2023 Julian Lobbes</p>
</div>

View File

@ -1,4 +1,4 @@
<nav class="flex gap-2 p-2 bg-background-800"> <nav class="flex gap-4 items-center p-2 bg-background-800 font-bold text-2xl">
<a href="/"> <a href="/">
<div class="bg-background-400 p-2 rounded rounded-xl"> <div class="bg-background-400 p-2 rounded rounded-xl">
<svg class="h-8 w-auto" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" <svg class="h-8 w-auto" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
@ -44,4 +44,11 @@
</svg> </svg>
</div> </div>
</a> </a>
<a href="/">Home</a>
<div class="grow"></div>
{% if request.user.is_authenticated %}
<a class="btn-outline text-lg" href="{% url 'logout' %}">Log Out</a>
{% else %}
<a class="btn text-lg" href="{% url 'login' %}">Log In</a>
{% endif %}
</nav> </nav>

View File

@ -3,5 +3,6 @@ from django.urls import include, path
urlpatterns = [ urlpatterns = [
path('', include('medwings.urls')), path('', include('medwings.urls')),
path('auth/', include('authentication.urls')),
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
] ]

View File

@ -1,3 +0,0 @@
<div>
<p>Footer stuff.</p>
</div>

View File

@ -1,4 +1,4 @@
{% extends 'medwings/base.html' %} {% extends 'core/base.html' %}
{% load static %} {% load static %}
{% block title %} {% block title %}
Medwings | Home Medwings | Home

View File

@ -3,5 +3,5 @@ from django.urls import path
from . import views from . import views
urlpatterns = [ urlpatterns = [
path("", views.index, name="index"), path("", views.index, name="home"),
] ]

View File

@ -33,6 +33,34 @@ h6 {
font-size: 1rem; font-size: 1rem;
} }
input {
@apply rounded rounded-md drop-shadow-sm px-2 py-1;
@apply bg-accent-100;
@apply w-full;
}
input[type="submit"] {
@apply rounded rounded-lg drop-shadow-md px-4 py-2;
@apply bg-accent-600;
@apply font-semibold;
@apply hover:drop-shadow-xl;
}
a.btn {
@apply rounded rounded-lg drop-shadow-md px-4 py-2;
@apply bg-accent-600;
@apply font-semibold;
@apply hover:drop-shadow-xl;
}
a.btn-outline {
@apply rounded rounded-lg drop-shadow-md px-4 py-2;
@apply text-accent-600 bg-accent-600/10;
@apply border-2 border-accent-600;
@apply font-semibold;
@apply hover:drop-shadow-xl;
}
body.global { body.global {
min-height: 100vh; min-height: 100vh;
width: 100%; width: 100%;
@ -47,3 +75,16 @@ header.global, main.global, footer.global {
main.global { main.global {
flex-grow: 1; flex-grow: 1;
} }
div.status-message {
display: flex;
width: 100%;
justify-content: center;
align-items: center;
border-radius: 0.5rem;
padding: 0.5rem;
}
div.status-message.error {
@apply bg-failure/50;
}

View File

@ -1,2 +1,5 @@
import './css/styles.css'; import './css/styles.css';
import 'htmx.org';
import './ts/index.ts'; import './ts/index.ts';
window.htmx = require('htmx.org');

View File

@ -1 +1,10 @@
const navbarToggleButton = document.querySelector('#navbarToggleButton');
button.addEventListener('click', () => {
if (button.textContent === 'Click me') {
button.textContent = 'Clicked';
} else {
button.textContent = 'Click me';
}
});

View File

@ -36,6 +36,7 @@ services:
- ./app/manage.py:/app/manage.py:ro - ./app/manage.py:/app/manage.py:ro
- ./app/requirements.txt:/app/requirements.txt:ro - ./app/requirements.txt:/app/requirements.txt:ro
- ./app/core/:/app/core:ro - ./app/core/:/app/core:ro
- ./app/authentication/:/app/authentication:ro
- ./app/medwings/:/app/medwings:ro - ./app/medwings/:/app/medwings:ro
- ./app/static/:/app/static:ro - ./app/static/:/app/static:ro
environment: environment:

11
package-lock.json generated
View File

@ -8,6 +8,9 @@
"name": "medwings", "name": "medwings",
"version": "0.0.1", "version": "0.0.1",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": {
"htmx.org": "^1.9.3"
},
"devDependencies": { "devDependencies": {
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"parcel": "^2.9.3", "parcel": "^2.9.3",
@ -2924,6 +2927,14 @@
"entities": "^3.0.1" "entities": "^3.0.1"
} }
}, },
"node_modules/htmx.org": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/htmx.org/-/htmx.org-1.9.3.tgz",
"integrity": "sha512-gsOttHnAcs/mXivSSYAIPF7hwksGjobb65MyZ46Csj2sJa1bS21Pfn5iag1DTm3GQ1Gxxx2/hlehKo6qfkW1Eg==",
"engines": {
"node": "15.x"
}
},
"node_modules/import-fresh": { "node_modules/import-fresh": {
"version": "3.3.0", "version": "3.3.0",
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",

View File

@ -21,5 +21,8 @@
"parcel": "^2.9.3", "parcel": "^2.9.3",
"postcss": "^8.4.26", "postcss": "^8.4.26",
"tailwindcss": "^3.3.3" "tailwindcss": "^3.3.3"
},
"dependencies": {
"htmx.org": "^1.9.3"
} }
} }