Skip to content

Instantly share code, notes, and snippets.

class DeferredHTMLMiddleware):
"""Adds `deferred_html` to request.
Use with the defer and render_deferred template tags.
"""
def __init__(self, get_response: Callable):
self.get_response = get_resposne
def __call__(self, request: HttpRequest) -> HttpResponse:
@danjac
danjac / k3s-ansible.yaml
Created February 18, 2025 18:52
K3s ansible playbook
- name: Install K3s
hosts: kubernetes
remote_user: root
become: false
vars:
ansible_user: root
vars_files:
- vars/config.yml
- vars/secrets.yml
tasks:
@danjac
danjac / docker-main.yml
Created February 5, 2025 14:54
Ansible role for provisioning Docker on a VM
- name: Install dependencies
ansible.builtin.apt:
name: "{{ item }}"
state: present
update_cache: true
loop:
- apt-transport-https
- ca-certificates
- curl
- gnupg-agent
@danjac
danjac / download_csv.py
Created June 14, 2024 12:15
Django CSV download using StreamingHttpResponse
import csv
class CSVBuffer:
"""Handles CSV output."""
def write(self, value):
"""Handles file-like write, just returning the value"""
return value
def download_csv(request):
@danjac
danjac / form.html
Last active March 12, 2024 15:52
Django form using AlpineJS to render rating field
{#
class ReviewForm(forms.ModelForm):
class Meta:
model = Review
fields = (
"comment",
"score",
)
help_texts: ClassVar = {
@danjac
danjac / markdown_test.py
Created December 31, 2023 09:25
Using pytest.param with parametrize
class TestMarkdown:
@pytest.mark.parametrize(
("value", "expected"),
[
pytest.param(None, "", id="none"),
pytest.param("", "", id="empty"),
pytest.param("test", "<p>test</p>\n", id="text"),
pytest.param(" ", "", id="space"),
pytest.param("<p>test</p>", "<p>test</p>", id="html"),
pytest.param("<p>test</p> ", "<p>test</p>", id="html and spaces"),
@danjac
danjac / cover-image.js
Last active November 29, 2023 18:39
HTML component for rendering image with fallback to placeholder
class CoverImage extends HTMLElement {
/*
Usage:
<cover-image placeholder="placeholder.jpg">
<img src="cover.jpg" loading"lazy">
</cover-image>
*/
connectedCallback() {
const images = this.querySelectorAll("img");
const placeholder = this.getAttribute("placeholder");
@danjac
danjac / htmx_fragments.py
Created June 30, 2023 09:33
Django helper function to render one or more template blocks with HTMX
from django.http import HttpRequest, HttpResponse
from django.template.response import TemplateResponse
from render_block import render_block_to_string
def render_template_fragments(
request: HttpRequest,
template_name: str,
context: dict | None = None,
*,
@danjac
danjac / form_views.py
Created June 26, 2023 07:34
Form handler function
# https://docs.djangoproject.com/en/4.2/topics/forms/
# original example
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == "POST":
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
@danjac
danjac / form_views.py
Created June 26, 2023 07:25
Tidier form validation
# example from Django docs https://docs.djangoproject.com/en/4.2/topics/forms/
def get_name(request):
# if this is a POST request we need to process the form data
if request.method == "POST":
# create a form instance and populate it with data from the request:
form = NameForm(request.POST)
# check whether it's valid:
if form.is_valid():
# process the data in form.cleaned_data as required
# ...