Skip to content

Commit be79d21

Browse files
authored
Merge branch 'enext' into send-email-tz-fix
2 parents d78c1d2 + a76a64f commit be79d21

File tree

314 files changed

+10917
-20455
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

314 files changed

+10917
-20455
lines changed

.github/workflows/deploy-docs.yml

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
name: Deploy Documentation
2+
3+
on:
4+
push:
5+
branches:
6+
- enext
7+
- main
8+
paths:
9+
- 'doc/**'
10+
- '.github/workflows/deploy-docs.yml'
11+
workflow_dispatch:
12+
13+
permissions:
14+
contents: read
15+
pages: write
16+
id-token: write
17+
18+
concurrency:
19+
group: "pages"
20+
cancel-in-progress: false
21+
22+
jobs:
23+
build:
24+
runs-on: ubuntu-latest
25+
steps:
26+
- name: Checkout
27+
uses: actions/checkout@v4
28+
with:
29+
submodules: recursive
30+
31+
- name: Set up Python
32+
uses: actions/setup-python@v5
33+
with:
34+
python-version: '3.11'
35+
36+
- name: Install system dependencies
37+
run: |
38+
sudo apt-get update
39+
sudo apt-get install -y \
40+
enchant-2 \
41+
libffi-dev \
42+
libssl-dev \
43+
libxml2-dev \
44+
libxslt1-dev \
45+
gettext \
46+
libfreetype-dev \
47+
libjpeg-dev \
48+
libpq-dev \
49+
build-essential
50+
51+
- name: Install dependencies
52+
run: |
53+
python -m pip install --upgrade pip
54+
cd doc
55+
# Install all dependencies (Sphinx, Django, and all packages)
56+
bash install-all-deps.sh
57+
58+
- name: Build unified documentation
59+
run: |
60+
cd doc
61+
# Set environment variables (conf.py handles Django setup automatically)
62+
export DJANGO_SETTINGS_MODULE=eventyay.config.settings
63+
export EVENTYAY_CONFIG_FILE=$(pwd)/eventyay-docs.cfg
64+
export DATABASE_URL="sqlite:///:memory:"
65+
export REDIS_URL="redis://localhost:6379/0"
66+
export MPLCONFIGDIR=/tmp/matplotlib
67+
mkdir -p $MPLCONFIGDIR
68+
# Build documentation
69+
make html
70+
71+
- name: Prepare deployment
72+
run: |
73+
mkdir -p _site
74+
# Copy unified documentation (includes all components: tickets, talk, video)
75+
echo "Copying unified documentation..."
76+
cp -r doc/_build/html/* _site/
77+
# Copy CNAME for custom domain (docs.eventyay.com)
78+
cp doc/CNAME _site/
79+
# Create .nojekyll to prevent GitHub Pages from ignoring files starting with _
80+
touch _site/.nojekyll
81+
# List contents for verification
82+
echo "Documentation site structure:"
83+
ls -la _site/
84+
85+
- name: Setup Pages
86+
uses: actions/configure-pages@v4
87+
88+
- name: Upload artifact
89+
uses: actions/upload-pages-artifact@v3
90+
with:
91+
path: '_site'
92+
93+
deploy:
94+
environment:
95+
name: github-pages
96+
url: ${{ steps.deployment.outputs.page_url }}
97+
runs-on: ubuntu-latest
98+
needs: build
99+
steps:
100+
- name: Deploy to GitHub Pages
101+
id: deployment
102+
uses: actions/deploy-pages@v4
103+

.github/workflows/gh-pages-deploy.yml

Lines changed: 0 additions & 42 deletions
This file was deleted.

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ __pycache__/
1919
.mypy_cache/
2020
.ipython/
2121
_static/
22+
# Exception: Track documentation static files
23+
!doc/_static/
24+
!doc/talk/_static/
25+
!doc/video/_static/
2226
.idea
2327
.secret
2428
atlassian-ide-plugin.xml

README.rst

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ Getting Started
5959
4. **Install Python packages**
6060

6161
Use ``uv`` to create virtual environment and install Python packages at the same time.
62+
**Make sure you are in app directory**
6263

6364
.. code-block:: sh
6465
@@ -88,10 +89,9 @@ From now on, you can do everything with the database without specifying password
8889

8990
.. code-block:: sh
9091
91-
dropdb eventyay-db
9292
psql eventyay-db
9393
94-
In case you cannot take adavantage of PostgreSQL *peer* mode, you need to create a *.env* file with these values:
94+
In case you cannot take advantage of PostgreSQL *peer* mode, you need to create a *.env* file with these values:
9595

9696
.. code-block:: sh
9797
@@ -102,9 +102,7 @@ In case you cannot take adavantage of PostgreSQL *peer* mode, you need to create
102102
103103
6. **Activate virtual environment**
104104

105-
After running ``uv sync```, ``uv`` will activate the virtual environment. But if you are back
106-
to work on the project another, we don't run ``uv``, then we activate the virtual environment by:
107-
105+
After running ``uv sync```, activate a virtual environment
108106

109107
.. code-block:: sh
110108
@@ -117,11 +115,23 @@ to work on the project another, we don't run ``uv``, then we activate the virtua
117115
118116
python manage.py migrate
119117
120-
8. **Create a superuser account** (for accessing the admin panel):
118+
If you see any Redis issues, Install Redis and start it:
119+
120+
**Update configuration**
121+
122+
123+
Edit ``app/eventyay.cfg`` and change Redis URLs from
124+
``redis://eventyay-next-redis`` **to**
125+
``redis://localhost:6379/``
126+
127+
128+
Do **not** edit the database numbers (0, 1, etc.).
129+
130+
8. **Create a admin user account** (for accessing the admin panel):
121131

122132
.. code-block:: bash
123133
124-
python manage.py createsuperuser
134+
python manage.py create_admin_user
125135
126136
9. **Run the development server**:
127137

@@ -166,7 +176,7 @@ We assume your current working directory is the checkout of this repo.
166176
167177
5. **Create a superuser account** (for accessing the admin panel):
168178

169-
This should be necessary only once, since the database is persisted
179+
This should be necessary only once, since the database is persisted
170180
as docker volume. If you see strange behaviour, see the point 3.
171181
on how to reset.
172182

app/eventyay/api/migrations/0001_initial.py

Lines changed: 15 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Generated by Django 5.1.9 on 2025-09-10 12:36
1+
# Generated by Django 5.2.5 on 2025-10-30 17:53
22

33
import oauth2_provider.generators
44
import oauth2_provider.models
@@ -8,20 +8,19 @@
88

99

1010
class Migration(migrations.Migration):
11+
1112
initial = True
1213

13-
dependencies = []
14+
dependencies = [
15+
]
1416

1517
operations = [
1618
migrations.CreateModel(
1719
name='OAuthAccessToken',
1820
fields=[
1921
('id', models.BigAutoField(primary_key=True, serialize=False)),
2022
('token', models.TextField()),
21-
(
22-
'token_checksum',
23-
oauth2_provider.models.TokenChecksumField(db_index=True, max_length=64, unique=True),
24-
),
23+
('token_checksum', oauth2_provider.models.TokenChecksumField(db_index=True, max_length=64, unique=True)),
2524
('expires', models.DateTimeField()),
2625
('scope', models.TextField(blank=True)),
2726
('created', models.DateTimeField(auto_now_add=True)),
@@ -35,83 +34,19 @@ class Migration(migrations.Migration):
3534
name='OAuthApplication',
3635
fields=[
3736
('id', models.BigAutoField(primary_key=True, serialize=False)),
38-
(
39-
'client_type',
40-
models.CharField(choices=[('confidential', 'Confidential'), ('public', 'Public')], max_length=32),
41-
),
42-
(
43-
'authorization_grant_type',
44-
models.CharField(
45-
choices=[
46-
('authorization-code', 'Authorization code'),
47-
('implicit', 'Implicit'),
48-
('password', 'Resource owner password-based'),
49-
('client-credentials', 'Client credentials'),
50-
('openid-hybrid', 'OpenID connect hybrid'),
51-
],
52-
max_length=32,
53-
),
54-
),
37+
('client_type', models.CharField(choices=[('confidential', 'Confidential'), ('public', 'Public')], max_length=32)),
38+
('authorization_grant_type', models.CharField(choices=[('authorization-code', 'Authorization code'), ('implicit', 'Implicit'), ('password', 'Resource owner password-based'), ('client-credentials', 'Client credentials'), ('openid-hybrid', 'OpenID connect hybrid')], max_length=32)),
5539
('hash_client_secret', models.BooleanField(default=True)),
5640
('skip_authorization', models.BooleanField(default=False)),
5741
('created', models.DateTimeField(auto_now_add=True)),
5842
('updated', models.DateTimeField(auto_now=True)),
59-
(
60-
'algorithm',
61-
models.CharField(
62-
blank=True,
63-
choices=[
64-
('', 'No OIDC support'),
65-
('RS256', 'RSA with SHA-2 256'),
66-
('HS256', 'HMAC with SHA-2 256'),
67-
],
68-
default='',
69-
max_length=5,
70-
),
71-
),
72-
(
73-
'allowed_origins',
74-
models.TextField(
75-
blank=True, default='', help_text='Allowed origins list to enable CORS, space separated'
76-
),
77-
),
43+
('algorithm', models.CharField(blank=True, choices=[('', 'No OIDC support'), ('RS256', 'RSA with SHA-2 256'), ('HS256', 'HMAC with SHA-2 256')], default='', max_length=5)),
44+
('allowed_origins', models.TextField(blank=True, default='', help_text='Allowed origins list to enable CORS, space separated')),
7845
('name', models.CharField(max_length=255, verbose_name='Application name')),
79-
(
80-
'redirect_uris',
81-
models.TextField(
82-
help_text='Allowed URIs list, space separated',
83-
validators=[oauth2_provider.validators.URIValidator],
84-
verbose_name='Redirection URIs',
85-
),
86-
),
87-
(
88-
'post_logout_redirect_uris',
89-
models.TextField(
90-
blank=True,
91-
default='',
92-
help_text='Allowed list with space separated',
93-
validators=[oauth2_provider.validators.URIValidator],
94-
),
95-
),
96-
(
97-
'client_id',
98-
models.CharField(
99-
db_index=True,
100-
default=oauth2_provider.generators.generate_client_id,
101-
max_length=100,
102-
unique=True,
103-
verbose_name='Client ID',
104-
),
105-
),
106-
(
107-
'client_secret',
108-
oauth2_provider.models.ClientSecretField(
109-
db_index=True,
110-
default=oauth2_provider.generators.generate_client_secret,
111-
max_length=255,
112-
verbose_name='Client secret',
113-
),
114-
),
46+
('redirect_uris', models.TextField(help_text='Allowed URIs list, space separated', validators=[oauth2_provider.validators.URIValidator], verbose_name='Redirection URIs')),
47+
('post_logout_redirect_uris', models.TextField(blank=True, default='', help_text='Allowed list with space separated', validators=[oauth2_provider.validators.URIValidator])),
48+
('client_id', models.CharField(db_index=True, default=oauth2_provider.generators.generate_client_id, max_length=100, unique=True, verbose_name='Client ID')),
49+
('client_secret', oauth2_provider.models.ClientSecretField(db_index=True, default=oauth2_provider.generators.generate_client_secret, max_length=255, verbose_name='Client secret')),
11550
('active', models.BooleanField(default=True)),
11651
],
11752
options={
@@ -128,12 +63,7 @@ class Migration(migrations.Migration):
12863
('created', models.DateTimeField(auto_now_add=True)),
12964
('updated', models.DateTimeField(auto_now=True)),
13065
('code_challenge', models.CharField(blank=True, default='', max_length=128)),
131-
(
132-
'code_challenge_method',
133-
models.CharField(
134-
blank=True, choices=[('plain', 'plain'), ('S256', 'S256')], default='', max_length=10
135-
),
136-
),
66+
('code_challenge_method', models.CharField(blank=True, choices=[('plain', 'plain'), ('S256', 'S256')], default='', max_length=10)),
13767
('nonce', models.CharField(blank=True, default='', max_length=255)),
13868
('claims', models.TextField(blank=True)),
13969
('redirect_uri', models.CharField(max_length=2500)),
@@ -176,10 +106,7 @@ class Migration(migrations.Migration):
176106
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
177107
('enabled', models.BooleanField(default=True, verbose_name='Enable webhook')),
178108
('target_url', models.URLField(verbose_name='Target URL')),
179-
(
180-
'all_events',
181-
models.BooleanField(default=True, verbose_name='All events (including newly created ones)'),
182-
),
109+
('all_events', models.BooleanField(default=True, verbose_name='All events (including newly created ones)')),
183110
],
184111
options={
185112
'ordering': ('id',),

0 commit comments

Comments
 (0)