This commit is contained in:
Alexis Métaireau 2024-02-26 22:32:20 +01:00
parent a7150d346b
commit eeb9b94453
7 changed files with 149 additions and 7 deletions

View file

@ -0,0 +1,26 @@
# Écrire
Avec — enfin — un peu de recul, je suis content de la quiétude et de l'espace mental qui se dégage pour moi ces temps cis.
En pleine traversée j'ai parfois trouvé refuge dans des ateliers d'écriture. Je trouve l'exercice à la fois réconfortant et stimulant intellectuellement. Au point que nous avons commencé avec des ami-es à en faire des ateliers réguliers.
Voici quelques contraintes qu'on a pu se donner au fur et à mesure des sessions, et que je garde ici pour pouvoir re-piocher dedans dans le futur.
J'en profite [pour déposer ici quelques textes écrits à l'occasion](https://blog.notmyidea.org/ecriture).
- **Temps**: On peut se donner une durée fixe, mais aussi plusieurs. J'ai bien aimé faire certains textes en « fractionné », 3 fois 15mn.
- **Extrait**: Devoir placer un bout de texte, un extrait, dans le texte qu'on va produire.
- **Champ Lexical**: On cherche à trouver des mots, à plusieurs, dans un champ lexical, puis on se dit qu'il faut placer ces mots dans le texte qui est produit.
- **Ne pas effacer**: écrire sans jamais effacer.
- **Homophones**: Texte libre à partir de mots énoncés oralement et à orthographier comme on le souhaite (en utiliser au moins 5 sur 7 et les décliner selon au moins 2 orthographes).
- **Objet**: Il faut que l'objet (par exemple une théière) ait une importance particulière.
- **Les premières pages d'un roman**
- **Qui dit, dit**: Sappuyer sur la structure « Qui dit… dit… » (répété autant de fois que voulu) et conclure par « Alors… ».
- **Mots fantômes**: Ne pas écrire les mots, mais faire un texte qui tourne autour d'eux.
- **Poème**: Faire un poème court
- **Objet animé**: Un objet habituellement inanimé devient vivant.
- Quelques pages d'un roman, très descriptif.
- Ca fait peur.
- **Boule de neige**: Utiliser l'effet « boule de neige », commencer avec un mot par phrase, puis deux, puis trois, etc.
- **Tirage à la ligne**: commencer par une phrase, puis l'étirer dans une seconde phrase, puis repartir de cette seconde phrase et l'étirer à nouveau. Répéter un nombre de fois défini.
- **Musique**: S'inspirer d'une musique, qu'on pourra réécouter à plusieurs reprises durant l'écriture.

View file

@ -0,0 +1,103 @@
---
title: Changing the primary key of a model in Django
tags: django, orm, migrations
---
I had to change the primary key of a django model, and I wanted to create a
migration for this.
The previous model was using django [automatic primary key fields](https://
docs.djangoproject.com/en/5.0/topics/db/models/#automatic-primary-key-fields)
I firstly changed the model to include the new `uuid` field, and added the `id`
field (the old primary key), like this:
```python
uuid = models.UUIDField(
unique=True, primary_key=True, default=uuid.uuid4, editable=False
)
id = models.IntegerField(null=True, blank=True)
```
Then I created the migration, it:
- Adds a new `uuid` field/column in the database
- Iterate over the existing items in the table, and generates an uuid for them
- Change the old primary key to a different type
- Drop the old index
- Mark the new uuid as a primary key.
To generate the migrations I did `django-admin makemigrations`, and iterated on
it. Here is the migration I ended up with:
```python
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("umap", "0017_migrate_to_openstreetmap_oauth2"),
]
operations = [
# Add the new uuid field
migrations.AddField(
model_name="datalayer",
name="uuid",
field=models.UUIDField(
default=uuid.uuid4, editable=False, null=True, serialize=False
),
),
# Generate UUIDs for existing records
migrations.RunSQL("UPDATE umap_datalayer SET uuid = gen_random_uuid()"),
# Remove the primary key constraint
migrations.RunSQL("ALTER TABLE umap_datalayer DROP CONSTRAINT umap_datalayer_pk"),
# Drop the "id" primary key…
migrations.AlterField(
"datalayer", name="id", field=models.IntegerField(null=True, blank=True)
),
# … to put it back on the "uuid"
migrations.AlterField(
model_name="datalayer",
name="uuid",
field=models.UUIDField(
default=uuid.uuid4,
editable=False,
unique=True,
primary_key=True,
serialize=False,
),
),
]
```
## Generating UUIDs in pure python
The uuid generation can also be done with pure python, like this. It works with all databases, but might be slower. Use it with `migrations.RunPython()`.
```python
def gen_uuid(apps, schema_editor):
DataLayer = apps.get_model("umap", "DataLayer")
for row in DataLayer.objects.all():
row.uuid = uuid.uuid4()
row.save(update_fields=["uuid"])
```
## Getting the constraint name
One of the things that took me some time is to have a way to get the constraint name before removing it. I wanted to do this with the Django ORM, but I didn't find how. So here is how in plain SQL. This only works with PostgreSQL, though.
```python
migrations.RunSQL("""
DO $$
BEGIN
EXECUTE 'ALTER TABLE umap_datalayer DROP CONSTRAINT ' || (
SELECT indexname
FROM pg_indexes
WHERE tablename = 'umap_datalayer' AND indexname LIKE '%pkey'
);
END $$;
"""),
```

View file

@ -4,9 +4,12 @@ slug: index
---
# À propos
👋 **Bienvenue par ici**, je suis Alexis, un développeur intéressé par les dynamiques collectives, les libertés numériques et la facilitation.
👋 **Bienvenue par ici**, je suis Alexis, un développeur intéressé par les
dynamiques collectives, les libertés numériques et la facilitation.
Vous retrouverez sur ce site [mes notes hebdomadaires](/weeknotes), quelques [billets de blog](/journal), des [notes de lectures](/lectures) et [des bouts de code](/code) que je veux garder quelque part. Bonne lecture !
Vous retrouverez sur ce site [mes notes hebdomadaires](/weeknotes), quelques
[billets de blog](/journal), des [notes de lectures](/lectures), [des bouts
de code](/code) et [textes](/ecriture) que je veux garder quelque part. Bonne lecture !
Pour me contacter, envoyez-moi un email sur ``alexis@`` ce domaine (en enlevant `blog.`).
@ -24,7 +27,6 @@ Coopération et médiation
faire pour que nos interactions soient les plus saines possibles. La qualité
des interactions m'intéresse autant que le travail en tant que tel.
Pragmatisme
: Tendre vers la perfection veut aussi dire ne pas trop s'attarder sur
certains détails. Parfois, « le mieux est l'ennemi du bien ».
@ -50,7 +52,7 @@ Frontend
: Bien que ça ne soit pas ma spécialité, j'ai pris beaucoup de plaisir
à travailler avec le langage [Elm](https://elm-lang.org/), qui permet de
travailler de manière sereine côté *front*, grace à un typage fort. J'ai surtout
travaillé sur des petits projets. Je suis à l'aise avec du HTML, du CSS ou du
travaillé sur des petits projets. Je suis aussi à l'aise avec du HTML, du CSS ou du
JavaScript.
Administration Système

View file

@ -5,6 +5,12 @@ template: worklog
total_days: 25
---
## Lundi 26 Février 2024 (10h, 5/5)
J'ai continué le passage vers les uuids pour les datalayers, le matin j'ai finalement trouvé un moyen de récupérer le nom de la contrainte, et l'après midi on a passé un peu de temps avec yohan pour faire de la migration de données pour les utilisateurs qui font un usage un peu détourné des datalayers (en les utilisant en remoteUrl).
Weekly, et puis on a discuté avec David et Yohan de comment on pourrait faire évoluer le formbuilder dans le futur. Une des pistes serait de faire des forms un peu à la django, qui pourraient ensuite se rendre de manière automatique. On a discuté du fait de passer sur une formule HTML un peu plus directe (plutôt que de manipuler le DOM en JavaScript), mais pour le moment on reste la dessus.
## Samedi 24 Février 2024 (4h, 5/5)
J'ai suivi mon envie de creuser sur les CRDT, je sens qu'on est bientôt prêts pour

View file

@ -49,7 +49,8 @@ projects: umap
- 🎧 [K.O. pour le véganisme ? - Valéry Giroux (Épisode spécial)](https://www.youtube.com/watch?v=BgC68CR1qN4), un épisode de podcast qui vient parler de l'anti spécisme du point de vue philosophique.
- 🎵Redécouvert [HERMIA & CECCALDI & DARRIFOURCQ](https://babel-label.bandcamp.com/track/ho-chi-minh) avec leur album de free jazz « God at the casino ». Génial.
- 🎵Découvert [Craven Faults](https://www.youtube.com/watch?v=KRT-tIn9yeE), de la musique ambiant progressive qui me rappelle [des vibes de Archive / Lights](https://www.youtube.com/watch?v=yLuOzNeHw5I). Si vous êtes en recherche de concentration et que vous aimez la répétition, en voici 26 minutes.
- 📖 J'ai continué « Oser la confiance »
- 📖 J'ai continué « Oser la confiance », plein de bouts intéressants.
- 🕸 [Au procès Assange : une audience pour le droit de se battre](https://www.mediapart.fr/journal/international/210224/au-proces-assange-une-audience-pour-le-droit-de-se-battre) chez médiapart, et [une vidéo qui essaye de sortir de vrai du faux](https://video.emergeheart.info/w/tnGmYurs4vitb16EjLG7AW)
## Notes
@ -97,4 +98,4 @@ C'est ce qui semble ressortir [dans leur FAQ](https://bsky.social/about/blog/5-1
> - Mutes are private, but mutelists are public lists. Your mutelist subscriptions are private.
> - Invites and invite trees are private.
Je n'arrive pas encore à y voir clair sur l'approche prise par Bluesky concernant la modération. Est-ce que c'est remettre à l'utilisateur les clés de la modération (avec la charge émotionnelle et politique qui va avec) ? A suivre.
Je n'arrive pas encore à y voir clair sur l'approche prise par Bluesky concernant la modération. Est-ce que c'est remettre à l'utilisateur les clés de la modération (avec la charge émotionnelle et politique qui va avec) ? A suivre.

View file

@ -17,7 +17,7 @@
{% for year, year_articles in articles | groupby('date.year') | reverse %}
<h2>{{ year }}</h2>
{% for article in year_articles %}
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title}}</a>,
<a href="{{ SITEURL }}/{{ article.url }}" id="page-title">{{ article.title}}</a>{% if not loop.last %} · {% endif %}
{% endfor %}
{% endfor %}
</ul>

View file

@ -63,4 +63,8 @@ CATEGORIES_DESCRIPTION = {
"Carnet de notes",
"Prises bien souvent en regardant une vidéo ou un article en ligne. Je les mets ici pour pouvoir les retrouver quand le besoin se fait sentir.",
),
"ecriture": (
"Écriture",
"Textes rédigés lors d'ateliers d'écriture",
),
}