Skip to content

Instantly share code, notes, and snippets.

View spookylukey's full-sized avatar

Luke Plant spookylukey

View GitHub Profile
I have been attempting to sign up for an HL SIPP, and I cannot proceed past due to errors on this page.
This is an error report that needs to be passed on to your developers. It is preventing me from being able to access your services and start an account.
Web browser: Firefox
spookylukey /
Last active November 29, 2023 09:17
get_all_subclasses utility
import itertools
flatten = itertools.chain.from_iterable
def get_all_subclasses(cls: type) -> set[type]:
Return all subclasses of a class, recursively.
# `type` and other metaclasses don't behave nicely with `__subclasses__`,
# we have to filter them out
The make_OnboardingRenameTeamForm class was a hack to try to get around some problems:
We want to do this at module level:
OnboardingRenameTeamForm = global_preference_form_builder(preferences=[("organization_name", "branding")])
However, this is a problem because `global_preference_form_builder` does database queries,
which is in general a bad idea to do when modules are loading, and it breaks our test suite badly.
First idea - change `OnboardingRenameTeamForm` to a function that will return the form - the wizard shouldn't
npm run dev:report git master ~/devel/clients/datapane/datapane-hosted/web-components [12:56]
> datapane-next@0.0.0 dev:report
> NODE_ENV=development vite build --mode development --config base/vite.config.ts && NODE_ENV=development vite build --watch --mode development --config report/vite.config.ts
vite v3.2.5 building for development...
transforming (32) node_modules/core-js/internals/create-property-descriptor.jsUse of eval is strongly discouraged, as it poses security risks and may cause issues with minification
✓ 243 modules transformed.
dist/base/style.css 79.34 KiB / gzip: 12.87 KiB
dist/base/ 269.97 KiB / gzip: 68.23 KiB
# This file is automatically @generated by Poetry and should not be changed by hand.
name = "boltons"
version = "21.0.0"
description = "When they're not builtins, they're boltons."
category = "main"
optional = false
python-versions = "*"
files = [
UPDATE "bookings_bookingaccount"
SET "email" = NULL,
"address_line1" = %s,
"address_line2" = %s,
"address_city" = %s,
"address_county" = %s,
"address_country" = NULL,
"address_post_code" = %s,
"phone_number" = %s,
"share_phone_number" = %s,
spookylukey /
Last active January 19, 2023 15:18
Debug utilities for Django DB queries. Warning - this code is not polished!
import contextlib
import io
import itertools
import logging
import os
import re
import shutil
import sys
import time
import traceback
<?xml version="1.0" encoding="utf-8"?>
<html xmlns="">
<title>magit: tmp</title>
<meta name="generator" content="emacs 26.3; htmlfontify 0.21" />
<style type="text/css"><!--
body { font-family: Rec Mono Semicasual; font-stretch: normal; font-weight: 500; font-style: normal; color: #655370; background: #fbf8ef; font-size: 9pt; text-decoration: none; }
span.default { font-family: Rec Mono Semicasual; font-stretch: normal; font-weight: 500; font-style: normal; color: #655370; background: #fbf8ef; font-size: 9pt; text-decoration: none; }
spookylukey /
Created September 2, 2021 20:31
AfterFetchQuerySetMixin for Django
class AfterFetchQuerySetMixin:
QuerySet mixin to enable functions to run immediately
after records have been fetched from the DB.
# This is most useful for registering 'prefetch_related' like operations
# or complex aggregations that need to be run after fetching, but while
# still allowing chaining of other QuerySet methods.
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
spookylukey /
Created November 14, 2020 10:41
Visidata 2 glue code for Django models and attrs, with type support
from datetime import date
from django.db.models import QuerySet
import visidata
def get_main_attrs(instance):
if hasattr(instance, '_meta'):
return meta_to_col_list(instance._meta)