mirror of
https://github.com/Crocmagnon/charasheet.git
synced 2024-11-22 22:48:03 +01:00
Compare commits
No commits in common. "580ba311a16ba1bee0e1982fea97d04634944d31" and "effb578eba6fff52ead45fa8de0b854cd60284be" have entirely different histories.
580ba311a1
...
effb578eba
42 changed files with 142 additions and 179 deletions
|
@ -40,7 +40,7 @@ repos:
|
|||
hooks:
|
||||
- id: djhtml
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.2.1
|
||||
rev: v0.2.0
|
||||
hooks:
|
||||
- id: ruff
|
||||
args: [--fix]
|
||||
|
@ -50,7 +50,7 @@ repos:
|
|||
- id: prettier
|
||||
types_or: [javascript, css]
|
||||
- repo: https://github.com/pre-commit/mirrors-eslint
|
||||
rev: v9.0.0-beta.0
|
||||
rev: v9.0.0-alpha.2
|
||||
hooks:
|
||||
- id: eslint
|
||||
args: [--fix]
|
||||
|
|
|
@ -14,5 +14,14 @@ inv test
|
|||
./src/manage.py createsuperuser
|
||||
```
|
||||
|
||||
## With preview mode
|
||||
|
||||
```shell
|
||||
caddy --config contrib/Caddyfile.local
|
||||
./src/manage.py runserver
|
||||
cd ~/Projects/charasheet-go
|
||||
make run/live
|
||||
```
|
||||
|
||||
# Reuse
|
||||
If you do reuse my work, please consider linking back to this repository 🙂
|
||||
|
|
|
@ -24,7 +24,7 @@ confusable-homoglyphs==3.3.1
|
|||
# via django-registration
|
||||
cryptography==42.0.2
|
||||
# via django-anymail
|
||||
django==5.0.2
|
||||
django==4.2.9
|
||||
# via
|
||||
# -r requirements.in
|
||||
# django-anymail
|
||||
|
@ -75,7 +75,7 @@ requests==2.31.0
|
|||
# via
|
||||
# -r requirements.in
|
||||
# django-anymail
|
||||
selenium==4.17.2
|
||||
selenium==4.9.1
|
||||
# via -r requirements.in
|
||||
sniffio==1.3.0
|
||||
# via trio
|
||||
|
@ -89,8 +89,6 @@ trio==0.24.0
|
|||
# trio-websocket
|
||||
trio-websocket==0.11.1
|
||||
# via selenium
|
||||
typing-extensions==4.9.0
|
||||
# via selenium
|
||||
urllib3==2.2.0
|
||||
# via
|
||||
# django-anymail
|
||||
|
|
15
contrib/Caddyfile.local
Normal file
15
contrib/Caddyfile.local
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
email gabriel@augendre.info
|
||||
http_port 8000
|
||||
}
|
||||
|
||||
http://localhost:8080 {
|
||||
@preview {
|
||||
header Cookie *preview=enabled;*
|
||||
path /test /test/* /character/1/notes_change/
|
||||
}
|
||||
route {
|
||||
reverse_proxy @preview localhost:4444
|
||||
reverse_proxy localhost:8000
|
||||
}
|
||||
}
|
|
@ -4,8 +4,6 @@
|
|||
[tool.ruff]
|
||||
src = ["src"]
|
||||
target-version = "py311"
|
||||
|
||||
[tool.ruff.lint]
|
||||
select = ["ALL"]
|
||||
unfixable = ["T20", "RUF001", "RUF002", "RUF003"]
|
||||
|
||||
|
@ -20,7 +18,7 @@ ignore = [
|
|||
"RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
|
||||
]
|
||||
|
||||
[tool.ruff.lint.per-file-ignores]
|
||||
[tool.ruff.per-file-ignores]
|
||||
"**/tests/*" = [
|
||||
"S101", # Use of assert detected.
|
||||
"S106", # Possible hardcoded password.
|
||||
|
@ -38,10 +36,10 @@ ignore = [
|
|||
"RUF001", # String contains ambiguous unicode character
|
||||
]
|
||||
|
||||
[tool.ruff.lint.pydocstyle]
|
||||
[tool.ruff.pydocstyle]
|
||||
convention = "pep257"
|
||||
|
||||
[tool.ruff.lint.mccabe]
|
||||
[tool.ruff.mccabe]
|
||||
max-complexity = 10
|
||||
|
||||
[tool.pytest.ini_options]
|
||||
|
|
|
@ -5,7 +5,7 @@ pytest-cov>=3.0.0
|
|||
pytest-django>=4.1.0
|
||||
pytest-selenium>=4.0.0
|
||||
# pytest-selenium 4.0.1 has an implicit dependency on `py`
|
||||
# py>=1.11.0
|
||||
py>=1.11.0
|
||||
pre-commit>=2.1
|
||||
model-bakery>=1.3.1
|
||||
bpython>=0.22.1
|
||||
|
|
|
@ -50,7 +50,7 @@ cwcwidth==0.1.9
|
|||
# curtsies
|
||||
distlib==0.3.8
|
||||
# via virtualenv
|
||||
django==5.0.2
|
||||
django==4.2.9
|
||||
# via
|
||||
# -c constraints.txt
|
||||
# django-browser-reload
|
||||
|
@ -68,9 +68,9 @@ h11==0.14.0
|
|||
# via
|
||||
# -c constraints.txt
|
||||
# wsproto
|
||||
hypothesis==6.98.3
|
||||
hypothesis==6.98.1
|
||||
# via -r requirements-dev.in
|
||||
identify==2.5.34
|
||||
identify==2.5.33
|
||||
# via pre-commit
|
||||
idna==3.6
|
||||
# via
|
||||
|
@ -111,7 +111,9 @@ platformdirs==4.2.0
|
|||
# virtualenv
|
||||
pluggy==1.4.0
|
||||
# via pytest
|
||||
pre-commit==3.6.1
|
||||
pre-commit==3.6.0
|
||||
# via -r requirements-dev.in
|
||||
py==1.11.0
|
||||
# via -r requirements-dev.in
|
||||
pygments==2.17.2
|
||||
# via bpython
|
||||
|
@ -141,7 +143,7 @@ pytest-html==4.1.1
|
|||
# via pytest-selenium
|
||||
pytest-metadata==3.1.0
|
||||
# via pytest-html
|
||||
pytest-selenium==4.1.0
|
||||
pytest-selenium==4.0.1
|
||||
# via -r requirements-dev.in
|
||||
pytest-variables==3.1.0
|
||||
# via pytest-selenium
|
||||
|
@ -155,9 +157,9 @@ requests==2.31.0
|
|||
# bpython
|
||||
# pytest-base-url
|
||||
# pytest-selenium
|
||||
ruff==0.2.1
|
||||
ruff==0.2.0
|
||||
# via -r requirements-dev.in
|
||||
selenium==4.17.2
|
||||
selenium==4.9.1
|
||||
# via
|
||||
# -c constraints.txt
|
||||
# pytest-selenium
|
||||
|
@ -188,10 +190,6 @@ trio-websocket==0.11.1
|
|||
# via
|
||||
# -c constraints.txt
|
||||
# selenium
|
||||
typing-extensions==4.9.0
|
||||
# via
|
||||
# -c constraints.txt
|
||||
# selenium
|
||||
urllib3[socks]==2.2.0
|
||||
# via
|
||||
# -c constraints.txt
|
||||
|
|
|
@ -1,11 +1,14 @@
|
|||
django>=4.1
|
||||
django>=4.1,<5.0
|
||||
django-cleanup>=6.0
|
||||
django-environ>=0.9.0
|
||||
django-htmx>=1.12.2
|
||||
django-linear-migrations>=2.2.0
|
||||
django-extensions>=3.1.5
|
||||
whitenoise>=6.2
|
||||
selenium>=4.5.0
|
||||
# pytest-selenium is broken with selenium 4.10.0
|
||||
# TypeError: WebDriver.__init__() got an unexpected keyword argument 'service_log_path'
|
||||
# https://github.com/robotframework/SeleniumLibrary/issues/1835
|
||||
selenium>=4.5.0,<4.10.0
|
||||
Markdown>=3.2
|
||||
django-registration>=3.3
|
||||
django-anymail[mailgun]>=8.6
|
||||
|
|
|
@ -24,7 +24,7 @@ confusable-homoglyphs==3.3.1
|
|||
# via django-registration
|
||||
cryptography==42.0.2
|
||||
# via django-anymail
|
||||
django==5.0.2
|
||||
django==4.2.9
|
||||
# via
|
||||
# -r requirements.in
|
||||
# django-anymail
|
||||
|
@ -75,7 +75,7 @@ requests==2.31.0
|
|||
# via
|
||||
# -r requirements.in
|
||||
# django-anymail
|
||||
selenium==4.17.2
|
||||
selenium==4.9.1
|
||||
# via -r requirements.in
|
||||
sniffio==1.3.0
|
||||
# via trio
|
||||
|
@ -89,8 +89,6 @@ trio==0.24.0
|
|||
# trio-websocket
|
||||
trio-websocket==0.11.1
|
||||
# via selenium
|
||||
typing-extensions==4.9.0
|
||||
# via selenium
|
||||
urllib3[socks]==2.2.0
|
||||
# via
|
||||
# django-anymail
|
||||
|
|
|
@ -79,12 +79,6 @@ class CharacterForm(forms.ModelForm):
|
|||
"value_intelligence",
|
||||
"value_wisdom",
|
||||
"value_charisma",
|
||||
"bonus_strength",
|
||||
"bonus_dexterity",
|
||||
"bonus_constitution",
|
||||
"bonus_intelligence",
|
||||
"bonus_wisdom",
|
||||
"bonus_charisma",
|
||||
"health_max",
|
||||
"racial_capability",
|
||||
"weapons",
|
||||
|
|
|
@ -1,61 +0,0 @@
|
|||
# Generated by Django 4.2.9 on 2024-02-11 10:29
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("character", "0043_character_paths"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="character",
|
||||
name="bonus_charisma",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus charisme",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="character",
|
||||
name="bonus_constitution",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus constitution",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="character",
|
||||
name="bonus_dexterity",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus dextérité",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="character",
|
||||
name="bonus_intelligence",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus intelligence",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="character",
|
||||
name="bonus_strength",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus force",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="character",
|
||||
name="bonus_wisdom",
|
||||
field=models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus sagesse",
|
||||
),
|
||||
),
|
||||
]
|
|
@ -1 +1 @@
|
|||
0044_character_bonus_charisma_and_more
|
||||
0043_character_paths
|
||||
|
|
|
@ -223,31 +223,6 @@ class Character(models.Model):
|
|||
value_wisdom = models.PositiveSmallIntegerField(verbose_name="valeur sagesse")
|
||||
value_charisma = models.PositiveSmallIntegerField(verbose_name="valeur charisme")
|
||||
|
||||
bonus_strength = models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus force",
|
||||
)
|
||||
bonus_dexterity = models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus dextérité",
|
||||
)
|
||||
bonus_constitution = models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus constitution",
|
||||
)
|
||||
bonus_intelligence = models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus intelligence",
|
||||
)
|
||||
bonus_wisdom = models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus sagesse",
|
||||
)
|
||||
bonus_charisma = models.PositiveSmallIntegerField(
|
||||
default=0,
|
||||
verbose_name="bonus charisme",
|
||||
)
|
||||
|
||||
health_max = models.PositiveSmallIntegerField(verbose_name="points de vie max")
|
||||
health_remaining = models.PositiveSmallIntegerField(
|
||||
verbose_name="points de vie restants",
|
||||
|
@ -339,27 +314,27 @@ class Character(models.Model):
|
|||
|
||||
@property
|
||||
def modifier_strength(self) -> int:
|
||||
return modifier(self.value_strength) + self.bonus_strength
|
||||
return modifier(self.value_strength)
|
||||
|
||||
@property
|
||||
def modifier_dexterity(self) -> int:
|
||||
return modifier(self.value_dexterity) + self.bonus_dexterity
|
||||
return modifier(self.value_dexterity)
|
||||
|
||||
@property
|
||||
def modifier_constitution(self) -> int:
|
||||
return modifier(self.value_constitution) + self.bonus_constitution
|
||||
return modifier(self.value_constitution)
|
||||
|
||||
@property
|
||||
def modifier_intelligence(self) -> int:
|
||||
return modifier(self.value_intelligence) + self.bonus_intelligence
|
||||
return modifier(self.value_intelligence)
|
||||
|
||||
@property
|
||||
def modifier_wisdom(self) -> int:
|
||||
return modifier(self.value_wisdom) + self.bonus_wisdom
|
||||
return modifier(self.value_wisdom)
|
||||
|
||||
@property
|
||||
def modifier_charisma(self) -> int:
|
||||
return modifier(self.value_charisma) + self.bonus_charisma
|
||||
return modifier(self.value_charisma)
|
||||
|
||||
@property
|
||||
def modifier_initiative(self) -> int:
|
||||
|
|
|
@ -31,18 +31,12 @@
|
|||
</div>
|
||||
<h2>Compétences</h2>
|
||||
<div class="row">
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.value_strength %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.bonus_strength %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.value_dexterity %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.bonus_dexterity %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.value_constitution %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.bonus_constitution %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.value_intelligence %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.bonus_intelligence %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.value_wisdom %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.bonus_wisdom %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.value_charisma %}</div>
|
||||
<div class="col-lg-2 col-md-3 col-6">{% bootstrap_field form.bonus_charisma %}</div>
|
||||
<div class="col-md-2">{% bootstrap_field form.value_strength %}</div>
|
||||
<div class="col-md-2">{% bootstrap_field form.value_dexterity %}</div>
|
||||
<div class="col-md-2">{% bootstrap_field form.value_constitution %}</div>
|
||||
<div class="col-md-2">{% bootstrap_field form.value_intelligence %}</div>
|
||||
<div class="col-md-2">{% bootstrap_field form.value_wisdom %}</div>
|
||||
<div class="col-md-2">{% bootstrap_field form.value_charisma %}</div>
|
||||
</div>
|
||||
<h2>Protection</h2>
|
||||
<div class="row">
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
from django.conf import settings
|
||||
from django.core.handlers.wsgi import WSGIRequest
|
||||
|
||||
|
||||
def app(_):
|
||||
return settings.APP
|
||||
|
||||
|
||||
def preview(request: WSGIRequest):
|
||||
return {
|
||||
"preview_enabled": request.session.get("preview", False),
|
||||
}
|
||||
|
|
|
@ -1,4 +1,6 @@
|
|||
from django.conf import settings
|
||||
from django.core.handlers.wsgi import WSGIRequest
|
||||
from django.http import HttpResponse
|
||||
|
||||
|
||||
def debug_toolbar_bypass_internal_ips(_) -> bool:
|
||||
|
@ -9,3 +11,31 @@ def debug_toolbar_bypass_internal_ips(_) -> bool:
|
|||
This is impossible to predict in a docker/k8s environment so we bypass this check.
|
||||
"""
|
||||
return settings.DEBUG_TOOLBAR
|
||||
|
||||
|
||||
class PreviewMiddleware:
|
||||
def __init__(self, get_response):
|
||||
self.get_response = get_response
|
||||
|
||||
def __call__(self, request: WSGIRequest):
|
||||
enable_preview = "enable_preview" in request.GET
|
||||
disable_preview = "disable_preview" in request.GET
|
||||
|
||||
new_value = None
|
||||
|
||||
if enable_preview:
|
||||
new_value = True
|
||||
elif disable_preview:
|
||||
new_value = False
|
||||
|
||||
if new_value is not None:
|
||||
request.session["preview"] = new_value
|
||||
|
||||
response: HttpResponse = self.get_response(request)
|
||||
|
||||
if new_value is True:
|
||||
response.set_cookie("preview", "enabled")
|
||||
elif new_value is False:
|
||||
response.delete_cookie("preview")
|
||||
|
||||
return response
|
||||
|
|
|
@ -97,6 +97,7 @@ MIDDLEWARE = [
|
|||
"django.contrib.messages.middleware.MessageMiddleware",
|
||||
"django.middleware.clickjacking.XFrameOptionsMiddleware",
|
||||
"django_htmx.middleware.HtmxMiddleware",
|
||||
"charasheet.middleware.PreviewMiddleware",
|
||||
]
|
||||
if DEBUG_TOOLBAR:
|
||||
MIDDLEWARE.insert(0, "debug_toolbar.middleware.DebugToolbarMiddleware")
|
||||
|
@ -117,6 +118,7 @@ TEMPLATES = [
|
|||
"django.contrib.auth.context_processors.auth",
|
||||
"django.contrib.messages.context_processors.messages",
|
||||
"charasheet.context_processors.app",
|
||||
"charasheet.context_processors.preview",
|
||||
],
|
||||
},
|
||||
},
|
||||
|
|
7
src/common/static/vendor/bootstrap-5.2.2/bootstrap.bundle.min.js
vendored
Normal file
7
src/common/static/vendor/bootstrap-5.2.2/bootstrap.bundle.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/common/static/vendor/bootstrap-5.2.2/bootstrap.bundle.min.js.map
vendored
Normal file
1
src/common/static/vendor/bootstrap-5.2.2/bootstrap.bundle.min.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
7
src/common/static/vendor/bootstrap-5.2.2/bootstrap.min.css
vendored
Normal file
7
src/common/static/vendor/bootstrap-5.2.2/bootstrap.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/common/static/vendor/bootstrap-5.2.2/bootstrap.min.css.map
vendored
Normal file
1
src/common/static/vendor/bootstrap-5.2.2/bootstrap.min.css.map
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
6
src/common/static/vendor/fontawesome-6.2.0/css/brands.min.css
vendored
Normal file
6
src/common/static/vendor/fontawesome-6.2.0/css/brands.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
src/common/static/vendor/fontawesome-6.2.0/css/fontawesome.min.css
vendored
Normal file
6
src/common/static/vendor/fontawesome-6.2.0/css/fontawesome.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
|
@ -1,6 +1,6 @@
|
|||
/*!
|
||||
* Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com
|
||||
* Font Awesome Free 6.2.0 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
* Copyright 2023 Fonticons, Inc.
|
||||
* Copyright 2022 Fonticons, Inc.
|
||||
*/
|
||||
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}
|
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-brands-400.ttf
vendored
Normal file
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-brands-400.ttf
vendored
Normal file
Binary file not shown.
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-brands-400.woff2
vendored
Normal file
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-brands-400.woff2
vendored
Normal file
Binary file not shown.
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-solid-900.ttf
vendored
Normal file
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-solid-900.ttf
vendored
Normal file
Binary file not shown.
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-solid-900.woff2
vendored
Normal file
BIN
src/common/static/vendor/fontawesome-6.2.0/webfonts/fa-solid-900.woff2
vendored
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
1
src/common/static/vendor/htmx-1.8.2.min.js
vendored
Normal file
1
src/common/static/vendor/htmx-1.8.2.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
src/common/static/vendor/htmx-1.9.10.min.js
vendored
1
src/common/static/vendor/htmx-1.9.10.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -10,10 +10,10 @@
|
|||
{% include "common/icons.html" %}
|
||||
{% include "common/opengraph.html" %}
|
||||
|
||||
<link rel="stylesheet" href="{% static "vendor/bootstrap-5.3.2/bootstrap.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/fontawesome-6.5.1/css/fontawesome.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/fontawesome-6.5.1/css/brands.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/fontawesome-6.5.1/css/solid.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/bootstrap-5.2.2/bootstrap.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/fontawesome-6.2.0/css/fontawesome.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/fontawesome-6.2.0/css/brands.min.css" %}">
|
||||
<link rel="stylesheet" href="{% static "vendor/fontawesome-6.2.0/css/solid.min.css" %}">
|
||||
<style>
|
||||
body {
|
||||
margin-bottom: 2em;
|
||||
|
@ -35,7 +35,7 @@
|
|||
</main>
|
||||
{% include "common/footer.html" %}
|
||||
|
||||
<script src="{% static 'vendor/htmx-1.9.10.min.js' %}" defer></script>
|
||||
<script src="{% static 'vendor/htmx-1.8.2.min.js' %}" defer></script>
|
||||
{% django_htmx_script %}
|
||||
{% if debug %}
|
||||
<script type="javascript">
|
||||
|
@ -51,7 +51,7 @@
|
|||
}
|
||||
</script>
|
||||
{% endif %}
|
||||
<script src="{% static "vendor/bootstrap-5.3.2/bootstrap.bundle.min.js" %}"></script>
|
||||
<script src="{% static "vendor/bootstrap-5.2.2/bootstrap.bundle.min.js" %}"></script>
|
||||
<script type="application/javascript" defer>
|
||||
let tooltipTriggerList = document.querySelectorAll('[data-bs-toggle="tooltip"]');
|
||||
let tooltipList = [...tooltipTriggerList].map(tooltipTriggerEl => new bootstrap.Tooltip(tooltipTriggerEl));
|
||||
|
|
|
@ -3,6 +3,11 @@
|
|||
<span>
|
||||
Version : {{ build.describe }}
|
||||
• {{ build.date }}
|
||||
{% if preview_enabled %}
|
||||
• <a class="text-muted" href="?disable_preview">Disable preview</a>
|
||||
{% else %}
|
||||
• <a class="text-muted" href="?enable_preview">Enable preview</a>
|
||||
{% endif %}
|
||||
</span>
|
||||
<div>
|
||||
<a href="https://github.com/Crocmagnon/charasheet" class="text-muted"><i class="fa-brands fa-github"></i></a>
|
||||
|
|
Loading…
Reference in a new issue