Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co

## Project Overview

This is the Python Ireland (python.ie / pycon.ie) website, built with Django 5.2 and Wagtail CMS 7.2. It manages content for the Python Ireland community including meetups, sponsors, speakers, and PyCon talks/sessions.
This is the Python Ireland (python.ie / pycon.ie) website, built with Django 6.0 and Wagtail CMS 7.2. It manages content for the Python Ireland community including meetups, sponsors, speakers, and PyCon talks/sessions.

### Python Version

This project requires **Python 3.13**. All code must be compatible with Python 3.13. When developing locally without Docker, ensure you are using Python 3.13.x.
This project requires **Python 3.13.11** (or any Python 3.13.x). All code must be compatible with Python 3.13. When developing locally without Docker, ensure you are using Python 3.13.x.

## Architecture

Expand Down Expand Up @@ -42,8 +42,8 @@ Always specify settings module: `--settings=pythonie.settings.dev` (or `tests`,

### Key Dependencies

- Django ~5.2.0
- Wagtail ~7.2.0 (CMS framework)
- Django 6.0
- Wagtail 7.2.1 (CMS framework)
- Redis (caching, configured via `REDISCLOUD_URL`)
- WhiteNoise (static file serving)
- boto3/django-storages (S3 integration)
Expand Down Expand Up @@ -260,7 +260,7 @@ Tests use `pythonie.settings.tests` which configures SQLite and mock Redis. Run

### Deployment

The project is hosted on Heroku.
The project is hosted on Heroku using the **heroku-24** stack with PostgreSQL 17.

### Upgrading Wagtail

Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,7 @@ refactor/simplify-sponsor-model

### Python

- **Python version**: 3.13 (strict requirement)
- **Python version**: 3.13.11 (or any Python 3.13.x - strict requirement)
- **Formatter**: Ruff
- **Line length**: 88 characters (Ruff default)
- **Imports**: Sorted automatically by Ruff
Expand Down
17 changes: 9 additions & 8 deletions DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,16 @@

### Tech Stack

- **Framework**: Django 5.2.8
- **CMS**: Wagtail 7.2
- **Python**: 3.13 (required)
- **Framework**: Django 6.0
- **CMS**: Wagtail 7.2.1
- **Python**: 3.13.11 (or any Python 3.13.x - required)
- **Database**: PostgreSQL 17 (prod and dev via Docker)
- **Cache**: Redis 6.2
- **Storage**: AWS S3 (prod), Local (dev)
- **Server**: Gunicorn (prod), Runserver (dev)
- **Containerization**: Docker + docker-compose
- **Automation**: Task (Taskfile.yaml)
- **Deployment**: Heroku
- **Deployment**: Heroku (heroku-24 stack)

### Project Statistics

Expand Down Expand Up @@ -105,7 +105,7 @@ pythonie/

### Prerequisites

- Python 3.13 (required)
- Python 3.13.11 (or any Python 3.13.x - required)
- Docker + docker-compose
- Task (or Make)
- Git
Expand Down Expand Up @@ -1441,6 +1441,7 @@ pythonie/pythonie/wsgi.py # WSGI application
---

**Last updated**: 2025
**Django Version**: 5.2.8
**Wagtail Version**: 7.2
**Python Version**: 3.13
**Django Version**: 6.0
**Wagtail Version**: 7.2.1
**Python Version**: 3.13.11
**Heroku Stack**: heroku-24
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Python Ireland Website

Website for Python Ireland (python.ie / pycon.ie) community, built with Django 5.2 and Wagtail CMS 7.2. Manages meetups, sponsors, speakers, and conference sessions.
Website for Python Ireland (python.ie / pycon.ie) community, built with Django 6.0 and Wagtail CMS 7.2. Manages meetups, sponsors, speakers, and conference sessions.

## Prerequisites

Expand Down Expand Up @@ -213,7 +213,7 @@ export MEETUP_KEY=your_meetup_api_key # Get from https://secure.meetup.com/meet

## Deployment

The project is deployed on Heroku. Use Task commands for database operations:
The project is deployed on Heroku using the **heroku-24** stack with PostgreSQL 17. Use Task commands for database operations:

```bash
# View backups
Expand Down
6 changes: 3 additions & 3 deletions pythonie/core/factories.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import factory
from factory.django import DjangoModelFactory
from django.utils import timezone

from core.models import HomePage, SimplePage
from factory.django import DjangoModelFactory
from meetups.models import Meetup
from sponsors.models import SponsorshipLevel

from core.models import HomePage, SimplePage


class SponsorshipLevelFactory(DjangoModelFactory):
class Meta:
Expand Down
78 changes: 50 additions & 28 deletions pythonie/core/management/commands/generate_sample_data.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
from django.core.management.base import BaseCommand
from wagtail.models import Page, Site

from core.factories import SponsorshipLevelFactory, MeetupFactory, HomePageFactory, SimplePageFactory
from core.factories import (
HomePageFactory,
MeetupFactory,
SimplePageFactory,
SponsorshipLevelFactory,
)
from core.models import HomePage, SimplePage


Expand Down Expand Up @@ -84,45 +89,62 @@ def _create_page(self, parent, title, slug, body=None):
self.stdout.write(f" {title} already exists")
return SimplePage.objects.get(slug=slug)

page = SimplePageFactory.build(title=title, slug=slug, body=body or [], show_in_menus=True)
page = SimplePageFactory.build(
title=title, slug=slug, body=body or [], show_in_menus=True
)
parent.add_child(instance=page)
self.stdout.write(self.style.SUCCESS(f"Created {title}"))
return page

def _get_home_content(self):
return [
{"type": "heading", "value": "Introduction"},
{"type": "paragraph", "value": (
"<p>Python Ireland is the Irish organisation representing the various chapters of Python users. "
"We organise meet ups and events for software developers, students, academics and anyone who wants "
"to learn the language. One of our aims is to help grow and diversify the Python community in Ireland. "
"We also develop and foster links with other Python based communities overseas.</p>"
)},
{
"type": "paragraph",
"value": (
"<p>Python Ireland is the Irish organisation representing the various chapters of Python users. "
"We organise meet ups and events for software developers, students, academics and anyone who wants "
"to learn the language. One of our aims is to help grow and diversify the Python community in Ireland. "
"We also develop and foster links with other Python based communities overseas.</p>"
),
},
{"type": "heading", "value": "PyCon Ireland 2025"},
{"type": "paragraph", "value": (
"<p>We are thrilled to announce PyCon Ireland 2025, taking place in Dublin "
"on November 15th and 16th! Join us at the UCD O'Reilly Hall for this exciting event.</p>"
)},
{"type": "paragraph", "value": (
"<p>PyCon Ireland 2025 will feature two talk tracks and two workshop tracks on both days. "
"Your ticket includes breakfast and lunch. Join us Saturday evening for networking!</p>"
)},
{"type": "paragraph", "value": (
"<p>Please adhere to our <a href='/policies/code-of-conduct/'>Code of Conduct</a>. "
"Check <a href='/pycon-2025/'>Terms and conditions</a> for details.</p>"
)},
{
"type": "paragraph",
"value": (
"<p>We are thrilled to announce PyCon Ireland 2025, taking place in Dublin "
"on November 15th and 16th! Join us at the UCD O'Reilly Hall for this exciting event.</p>"
),
},
{
"type": "paragraph",
"value": (
"<p>PyCon Ireland 2025 will feature two talk tracks and two workshop tracks on both days. "
"Your ticket includes breakfast and lunch. Join us Saturday evening for networking!</p>"
),
},
{
"type": "paragraph",
"value": (
"<p>Please adhere to our <a href='/policies/code-of-conduct/'>Code of Conduct</a>. "
"Check <a href='/pycon-2025/'>Terms and conditions</a> for details.</p>"
),
},
{"type": "paragraph", "value": "<p>See you at PyCon Ireland 2025!</p>"},
]

def _get_meetups_content(self):
return [
{"type": "heading", "value": "Python Ireland Meetups"},
{"type": "paragraph", "value": (
"<p>Join us at our regular meetups! We hold events every month.</p>"
"<ul>"
"<li><a href='https://www.meetup.com/pythonireland/events/'>Upcoming Events</a></li>"
"<li><a href='https://www.meetup.com/pythonireland/photos/'>Photos</a></li>"
"<li><a href='https://www.meetup.com/pythonireland/'>Python Ireland on Meetup.com</a></li>"
"</ul>"
)},
{
"type": "paragraph",
"value": (
"<p>Join us at our regular meetups! We hold events every month.</p>"
"<ul>"
"<li><a href='https://www.meetup.com/pythonireland/events/'>Upcoming Events</a></li>"
"<li><a href='https://www.meetup.com/pythonireland/photos/'>Photos</a></li>"
"<li><a href='https://www.meetup.com/pythonireland/'>Python Ireland on Meetup.com</a></li>"
"</ul>"
),
},
]
2 changes: 0 additions & 2 deletions pythonie/core/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

import django.utils.timezone
import modelcluster.fields
import wagtail.fields
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("wagtailcore", "0013_update_golive_expire_help_text"),
]
Expand Down
1 change: 0 additions & 1 deletion pythonie/core/migrations/0002_simplepage.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@


class Migration(migrations.Migration):

dependencies = [
("core", "0001_initial"),
]
Expand Down
9 changes: 3 additions & 6 deletions pythonie/core/migrations/0003_media_in_simple_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
from __future__ import unicode_literals

import wagtail.blocks
import wagtail.fields
import wagtail.embeds.blocks
import wagtail.fields
import wagtail.images.blocks
from django.db import migrations, models
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("core", "0002_simplepage"),
]
Expand All @@ -22,9 +21,7 @@ class Migration(migrations.Migration):
(
(
"heading",
wagtail.blocks.CharBlock(
classname="full title", icon="home"
),
wagtail.blocks.CharBlock(classname="full title", icon="home"),
),
("paragraph", wagtail.blocks.RichTextBlock(icon="edit")),
("video", wagtail.embeds.blocks.EmbedBlock(icon="media")),
Expand Down
7 changes: 2 additions & 5 deletions pythonie/core/migrations/0004_auto_20150708_1416.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
from __future__ import unicode_literals

import wagtail.blocks
import wagtail.fields
import wagtail.embeds.blocks
import wagtail.fields
import wagtail.images.blocks
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
("core", "0003_media_in_simple_page"),
]
Expand All @@ -22,9 +21,7 @@ class Migration(migrations.Migration):
(
(
"heading",
wagtail.blocks.CharBlock(
icon="home", classname="full title"
),
wagtail.blocks.CharBlock(icon="home", classname="full title"),
),
("paragraph", wagtail.blocks.RichTextBlock(icon="edit")),
("video", wagtail.embeds.blocks.EmbedBlock(icon="media")),
Expand Down
1 change: 0 additions & 1 deletion pythonie/core/migrations/0005_auto_20150726_1416.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@


class Migration(migrations.Migration):

dependencies = [
("core", "0004_auto_20150708_1416"),
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@


class Migration(migrations.Migration):

dependencies = [
("sponsors", "0004_auto_20150726_1412"),
("core", "0005_auto_20150726_1416"),
Expand Down
1 change: 0 additions & 1 deletion pythonie/core/migrations/0007_homepage_sponsors.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@


class Migration(migrations.Migration):

dependencies = [
("sponsors", "0004_auto_20150726_1412"),
("core", "0006_homepagesponsorrelationship"),
Expand Down
13 changes: 4 additions & 9 deletions pythonie/core/migrations/0008_auto_20150821_2230.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,13 @@
from __future__ import unicode_literals

import wagtail.blocks
import wagtail.fields
import wagtail.embeds.blocks
import wagtail.fields
import wagtail.images.blocks
from django.db import migrations, models
from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
("core", "0007_homepage_sponsors"),
]
Expand All @@ -22,9 +21,7 @@ class Migration(migrations.Migration):
(
(
"heading",
wagtail.blocks.CharBlock(
icon="home", classname="full title"
),
wagtail.blocks.CharBlock(icon="home", classname="full title"),
),
("paragraph", wagtail.blocks.RichTextBlock(icon="edit")),
("video", wagtail.embeds.blocks.EmbedBlock(icon="media")),
Expand All @@ -42,9 +39,7 @@ class Migration(migrations.Migration):
(
(
"heading",
wagtail.blocks.CharBlock(
icon="home", classname="full title"
),
wagtail.blocks.CharBlock(icon="home", classname="full title"),
),
("paragraph", wagtail.blocks.RichTextBlock(icon="edit")),
("video", wagtail.embeds.blocks.EmbedBlock(icon="media")),
Expand Down
1 change: 0 additions & 1 deletion pythonie/core/migrations/0009_auto_20160703_0857.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@


class Migration(migrations.Migration):

dependencies = [
("core", "0008_auto_20150821_2230"),
]
Expand Down
Loading