chore(*): reformat using ruff (#22)
This is the remainder except for `jdav_web/members/`.mk-personal-profile
parent
aaa1324da9
commit
78c117f300
@ -1,28 +1,26 @@
|
||||
import os
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.core.management.base import BaseCommand
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Creates a super-user non-interactively if it doesn't exist."
|
||||
|
||||
def handle(self, *args, **options):
|
||||
User = get_user_model()
|
||||
|
||||
username = os.environ.get('DJANGO_SUPERUSER_USERNAME', '')
|
||||
password = os.environ.get('DJANGO_SUPERUSER_PASSWORD', '')
|
||||
username = os.environ.get("DJANGO_SUPERUSER_USERNAME", "")
|
||||
password = os.environ.get("DJANGO_SUPERUSER_PASSWORD", "")
|
||||
|
||||
if not username or not password:
|
||||
self.stdout.write(
|
||||
self.style.WARNING('Superuser data was not set. Skipping.')
|
||||
)
|
||||
self.stdout.write(self.style.WARNING("Superuser data was not set. Skipping."))
|
||||
return
|
||||
|
||||
if not User.objects.filter(username=username).exists():
|
||||
User.objects.create_superuser(username=username, password=password)
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS('Successfully created superuser.')
|
||||
)
|
||||
self.stdout.write(self.style.SUCCESS("Successfully created superuser."))
|
||||
else:
|
||||
self.stdout.write(
|
||||
self.style.SUCCESS('Superuser with configured username already exists. Skipping.')
|
||||
self.style.SUCCESS("Superuser with configured username already exists. Skipping.")
|
||||
)
|
||||
|
||||
@ -1,136 +1,293 @@
|
||||
# Generated by Django 4.0.1 on 2023-03-29 22:16
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('members', '0002_remove_member_not_waiting_and_more'),
|
||||
("members", "0002_remove_member_not_waiting_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Ledger',
|
||||
name="Ledger",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=30, verbose_name='Name')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=30, verbose_name="Name")),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Ledger',
|
||||
'verbose_name_plural': 'Ledgers',
|
||||
"verbose_name": "Ledger",
|
||||
"verbose_name_plural": "Ledgers",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Statement',
|
||||
name="Statement",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('short_description', models.CharField(blank=True, max_length=30, verbose_name='Short description')),
|
||||
('explanation', models.TextField(blank=True, verbose_name='Explanation')),
|
||||
('night_cost', models.DecimalField(decimal_places=2, default=0, max_digits=5, verbose_name='Price per night')),
|
||||
('submitted', models.BooleanField(default=False, verbose_name='Submitted')),
|
||||
('submitted_date', models.DateTimeField(default=None, null=True, verbose_name='Submitted on')),
|
||||
('confirmed', models.BooleanField(default=False, verbose_name='Confirmed')),
|
||||
('confirmed_date', models.DateTimeField(default=None, null=True, verbose_name='Paid on')),
|
||||
('confirmed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='confirmed_statements', to='members.member', verbose_name='Authorized by')),
|
||||
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_statements', to='members.member', verbose_name='Created by')),
|
||||
('excursion', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='members.freizeit', verbose_name='Associated excursion')),
|
||||
('submitted_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='submitted_statements', to='members.member', verbose_name='Submitted by')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"short_description",
|
||||
models.CharField(blank=True, max_length=30, verbose_name="Short description"),
|
||||
),
|
||||
("explanation", models.TextField(blank=True, verbose_name="Explanation")),
|
||||
(
|
||||
"night_cost",
|
||||
models.DecimalField(
|
||||
decimal_places=2, default=0, max_digits=5, verbose_name="Price per night"
|
||||
),
|
||||
),
|
||||
("submitted", models.BooleanField(default=False, verbose_name="Submitted")),
|
||||
(
|
||||
"submitted_date",
|
||||
models.DateTimeField(default=None, null=True, verbose_name="Submitted on"),
|
||||
),
|
||||
("confirmed", models.BooleanField(default=False, verbose_name="Confirmed")),
|
||||
(
|
||||
"confirmed_date",
|
||||
models.DateTimeField(default=None, null=True, verbose_name="Paid on"),
|
||||
),
|
||||
(
|
||||
"confirmed_by",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="confirmed_statements",
|
||||
to="members.member",
|
||||
verbose_name="Authorized by",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_by",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="created_statements",
|
||||
to="members.member",
|
||||
verbose_name="Created by",
|
||||
),
|
||||
),
|
||||
(
|
||||
"excursion",
|
||||
models.OneToOneField(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
to="members.freizeit",
|
||||
verbose_name="Associated excursion",
|
||||
),
|
||||
),
|
||||
(
|
||||
"submitted_by",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="submitted_statements",
|
||||
to="members.member",
|
||||
verbose_name="Submitted by",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Statement',
|
||||
'verbose_name_plural': 'Statements',
|
||||
'permissions': [('may_edit_submitted_statements', 'Is allowed to edit submitted statements')],
|
||||
"verbose_name": "Statement",
|
||||
"verbose_name_plural": "Statements",
|
||||
"permissions": [
|
||||
("may_edit_submitted_statements", "Is allowed to edit submitted statements")
|
||||
],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Transaction',
|
||||
name="Transaction",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('reference', models.TextField(verbose_name='Reference')),
|
||||
('amount', models.DecimalField(decimal_places=2, max_digits=6, verbose_name='Amount')),
|
||||
('confirmed', models.BooleanField(default=False, verbose_name='Paid')),
|
||||
('confirmed_date', models.DateTimeField(default=None, null=True, verbose_name='Paid on')),
|
||||
('confirmed_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='confirmed_transactions', to='members.member', verbose_name='Authorized by')),
|
||||
('ledger', models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_NULL, to='finance.ledger', verbose_name='Ledger')),
|
||||
('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.member', verbose_name='Recipient')),
|
||||
('statement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.statement', verbose_name='Statement')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("reference", models.TextField(verbose_name="Reference")),
|
||||
(
|
||||
"amount",
|
||||
models.DecimalField(decimal_places=2, max_digits=6, verbose_name="Amount"),
|
||||
),
|
||||
("confirmed", models.BooleanField(default=False, verbose_name="Paid")),
|
||||
(
|
||||
"confirmed_date",
|
||||
models.DateTimeField(default=None, null=True, verbose_name="Paid on"),
|
||||
),
|
||||
(
|
||||
"confirmed_by",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="confirmed_transactions",
|
||||
to="members.member",
|
||||
verbose_name="Authorized by",
|
||||
),
|
||||
),
|
||||
(
|
||||
"ledger",
|
||||
models.ForeignKey(
|
||||
default=None,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
to="finance.ledger",
|
||||
verbose_name="Ledger",
|
||||
),
|
||||
),
|
||||
(
|
||||
"member",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="members.member",
|
||||
verbose_name="Recipient",
|
||||
),
|
||||
),
|
||||
(
|
||||
"statement",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="finance.statement",
|
||||
verbose_name="Statement",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Transaction',
|
||||
'verbose_name_plural': 'Transactions',
|
||||
"verbose_name": "Transaction",
|
||||
"verbose_name_plural": "Transactions",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Receipt',
|
||||
name="Receipt",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('short_description', models.CharField(max_length=30, verbose_name='Short description')),
|
||||
('amount', models.DecimalField(decimal_places=2, max_digits=6)),
|
||||
('comments', models.TextField()),
|
||||
('ledger', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.ledger', verbose_name='Ledger')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"short_description",
|
||||
models.CharField(max_length=30, verbose_name="Short description"),
|
||||
),
|
||||
("amount", models.DecimalField(decimal_places=2, max_digits=6)),
|
||||
("comments", models.TextField()),
|
||||
(
|
||||
"ledger",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="finance.ledger",
|
||||
verbose_name="Ledger",
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Bill',
|
||||
name="Bill",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('short_description', models.CharField(max_length=30, verbose_name='Short description')),
|
||||
('explanation', models.TextField(blank=True, verbose_name='Explanation')),
|
||||
('amount', models.DecimalField(decimal_places=2, default=0, max_digits=6)),
|
||||
('costs_covered', models.BooleanField(default=False, verbose_name='Covered')),
|
||||
('refunded', models.BooleanField(default=False, verbose_name='Refunded')),
|
||||
('proof', models.ImageField(blank=True, upload_to='bill_images', verbose_name='Proof')),
|
||||
('paid_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='members.member', verbose_name='Paid by')),
|
||||
('statement', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='finance.statement', verbose_name='Statement')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"short_description",
|
||||
models.CharField(max_length=30, verbose_name="Short description"),
|
||||
),
|
||||
("explanation", models.TextField(blank=True, verbose_name="Explanation")),
|
||||
("amount", models.DecimalField(decimal_places=2, default=0, max_digits=6)),
|
||||
("costs_covered", models.BooleanField(default=False, verbose_name="Covered")),
|
||||
("refunded", models.BooleanField(default=False, verbose_name="Refunded")),
|
||||
(
|
||||
"proof",
|
||||
models.ImageField(blank=True, upload_to="bill_images", verbose_name="Proof"),
|
||||
),
|
||||
(
|
||||
"paid_by",
|
||||
models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
to="members.member",
|
||||
verbose_name="Paid by",
|
||||
),
|
||||
),
|
||||
(
|
||||
"statement",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="finance.statement",
|
||||
verbose_name="Statement",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Bill',
|
||||
'verbose_name_plural': 'Bills',
|
||||
"verbose_name": "Bill",
|
||||
"verbose_name_plural": "Bills",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='StatementConfirmed',
|
||||
fields=[
|
||||
],
|
||||
name="StatementConfirmed",
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'Paid statement',
|
||||
'verbose_name_plural': 'Paid statements',
|
||||
'permissions': (('may_manage_confirmed_statements', 'Can view and manage confirmed statements.'),),
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
"verbose_name": "Paid statement",
|
||||
"verbose_name_plural": "Paid statements",
|
||||
"permissions": (
|
||||
(
|
||||
"may_manage_confirmed_statements",
|
||||
"Can view and manage confirmed statements.",
|
||||
),
|
||||
),
|
||||
"proxy": True,
|
||||
"indexes": [],
|
||||
"constraints": [],
|
||||
},
|
||||
bases=('finance.statement',),
|
||||
bases=("finance.statement",),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='StatementSubmitted',
|
||||
fields=[
|
||||
],
|
||||
name="StatementSubmitted",
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'Submitted statement',
|
||||
'verbose_name_plural': 'Submitted statements',
|
||||
'permissions': (('may_manage_submitted_statements', 'Can view and manage submitted statements.'),),
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
"verbose_name": "Submitted statement",
|
||||
"verbose_name_plural": "Submitted statements",
|
||||
"permissions": (
|
||||
(
|
||||
"may_manage_submitted_statements",
|
||||
"Can view and manage submitted statements.",
|
||||
),
|
||||
),
|
||||
"proxy": True,
|
||||
"indexes": [],
|
||||
"constraints": [],
|
||||
},
|
||||
bases=('finance.statement',),
|
||||
bases=("finance.statement",),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='StatementUnSubmitted',
|
||||
fields=[
|
||||
],
|
||||
name="StatementUnSubmitted",
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'Statement in preparation',
|
||||
'verbose_name_plural': 'Statements in preparation',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
"verbose_name": "Statement in preparation",
|
||||
"verbose_name_plural": "Statements in preparation",
|
||||
"proxy": True,
|
||||
"indexes": [],
|
||||
"constraints": [],
|
||||
},
|
||||
bases=('finance.statement',),
|
||||
bases=("finance.statement",),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,18 +1,20 @@
|
||||
# Generated by Django 4.0.1 on 2024-12-02 00:22
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('finance', '0003_alter_bill_options_and_more'),
|
||||
("finance", "0003_alter_bill_options_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='bill',
|
||||
name='amount',
|
||||
field=models.DecimalField(decimal_places=2, default=0, max_digits=6, verbose_name='Amount'),
|
||||
model_name="bill",
|
||||
name="amount",
|
||||
field=models.DecimalField(
|
||||
decimal_places=2, default=0, max_digits=6, verbose_name="Amount"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,20 @@
|
||||
# Generated by Django 4.0.1 on 2024-12-26 09:45
|
||||
|
||||
from django.db import migrations
|
||||
import utils
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('finance', '0004_alter_bill_amount'),
|
||||
("finance", "0004_alter_bill_amount"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='bill',
|
||||
name='proof',
|
||||
field=utils.RestrictedFileField(blank=True, upload_to='bill_images', verbose_name='Proof'),
|
||||
model_name="bill",
|
||||
name="proof",
|
||||
field=utils.RestrictedFileField(
|
||||
blank=True, upload_to="bill_images", verbose_name="Proof"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,26 +1,38 @@
|
||||
# Generated by Django 4.0.1 on 2025-01-18 19:08
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0032_member_upload_registration_form_key'),
|
||||
('members', '0033_freizeit_approved_extra_youth_leader_count'),
|
||||
('finance', '0005_alter_bill_proof'),
|
||||
("members", "0032_member_upload_registration_form_key"),
|
||||
("members", "0033_freizeit_approved_extra_youth_leader_count"),
|
||||
("finance", "0005_alter_bill_proof"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='statement',
|
||||
name='allowance_to',
|
||||
field=models.ManyToManyField(help_text='The youth leaders to which an allowance should be paid. The count must match the number of permitted youth leaders.', related_name='receives_allowance_for_statements', to='members.Member', verbose_name='Pay allowance to'),
|
||||
model_name="statement",
|
||||
name="allowance_to",
|
||||
field=models.ManyToManyField(
|
||||
help_text="The youth leaders to which an allowance should be paid. The count must match the number of permitted youth leaders.",
|
||||
related_name="receives_allowance_for_statements",
|
||||
to="members.Member",
|
||||
verbose_name="Pay allowance to",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='statement',
|
||||
name='subsidy_to',
|
||||
field=models.ForeignKey(help_text='The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='receives_subsidy_for_statements', to='members.member', verbose_name='Pay subsidy to'),
|
||||
model_name="statement",
|
||||
name="subsidy_to",
|
||||
field=models.ForeignKey(
|
||||
help_text="The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.",
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="receives_subsidy_for_statements",
|
||||
to="members.member",
|
||||
verbose_name="Pay subsidy to",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,25 @@
|
||||
# Generated by Django 4.0.1 on 2025-01-18 22:00
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0033_freizeit_approved_extra_youth_leader_count'),
|
||||
('finance', '0006_statement_add_allowance_to_subsidy_to'),
|
||||
("members", "0033_freizeit_approved_extra_youth_leader_count"),
|
||||
("finance", "0006_statement_add_allowance_to_subsidy_to"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='statement',
|
||||
name='allowance_to',
|
||||
field=models.ManyToManyField(blank=True, help_text='The youth leaders to which an allowance should be paid. The count must match the number of permitted youth leaders.', related_name='receives_allowance_for_statements', to='members.Member', verbose_name='Pay allowance to'),
|
||||
model_name="statement",
|
||||
name="allowance_to",
|
||||
field=models.ManyToManyField(
|
||||
blank=True,
|
||||
help_text="The youth leaders to which an allowance should be paid. The count must match the number of permitted youth leaders.",
|
||||
related_name="receives_allowance_for_statements",
|
||||
to="members.Member",
|
||||
verbose_name="Pay allowance to",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,25 +1,39 @@
|
||||
# Generated by Django 4.0.1 on 2025-01-23 22:16
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0033_freizeit_approved_extra_youth_leader_count'),
|
||||
('finance', '0007_alter_statement_allowance_to'),
|
||||
("members", "0033_freizeit_approved_extra_youth_leader_count"),
|
||||
("finance", "0007_alter_statement_allowance_to"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='statement',
|
||||
name='allowance_to',
|
||||
field=models.ManyToManyField(blank=True, help_text='The youth leaders to which an allowance should be paid.', related_name='receives_allowance_for_statements', to='members.Member', verbose_name='Pay allowance to'),
|
||||
model_name="statement",
|
||||
name="allowance_to",
|
||||
field=models.ManyToManyField(
|
||||
blank=True,
|
||||
help_text="The youth leaders to which an allowance should be paid.",
|
||||
related_name="receives_allowance_for_statements",
|
||||
to="members.Member",
|
||||
verbose_name="Pay allowance to",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='statement',
|
||||
name='subsidy_to',
|
||||
field=models.ForeignKey(blank=True, help_text='The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='receives_subsidy_for_statements', to='members.member', verbose_name='Pay subsidy to'),
|
||||
model_name="statement",
|
||||
name="subsidy_to",
|
||||
field=models.ForeignKey(
|
||||
blank=True,
|
||||
help_text="The person that should receive the subsidy for night and travel costs. Typically the person who paid for them.",
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="receives_subsidy_for_statements",
|
||||
to="members.member",
|
||||
verbose_name="Pay subsidy to",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,20 +1,28 @@
|
||||
# Generated by Django 4.2.20 on 2025-04-03 21:04
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0039_membertraining_certificate_attendance'),
|
||||
('finance', '0008_alter_statement_allowance_to_and_more'),
|
||||
("members", "0039_membertraining_certificate_attendance"),
|
||||
("finance", "0008_alter_statement_allowance_to_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='statement',
|
||||
name='ljp_to',
|
||||
field=models.ForeignKey(blank=True, help_text='The person that should receive the ljp contributions for the participants. Should be only selected if an ljp request was submitted.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='receives_ljp_for_statements', to='members.member', verbose_name='Pay ljp contributions to'),
|
||||
model_name="statement",
|
||||
name="ljp_to",
|
||||
field=models.ForeignKey(
|
||||
blank=True,
|
||||
help_text="The person that should receive the ljp contributions for the participants. Should be only selected if an ljp request was submitted.",
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="receives_ljp_for_statements",
|
||||
to="members.member",
|
||||
verbose_name="Pay ljp contributions to",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,55 +1,58 @@
|
||||
# Generated by Django 4.0.1 on 2024-11-23 21:15
|
||||
|
||||
import django.contrib.auth.models
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('auth', '0012_alter_user_first_name_max_length'),
|
||||
("auth", "0012_alter_user_first_name_max_length"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='RegistrationPassword',
|
||||
name="RegistrationPassword",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('password', models.CharField(max_length=100, verbose_name='Password')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("password", models.CharField(max_length=100, verbose_name="Password")),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='AuthGroup',
|
||||
fields=[
|
||||
],
|
||||
name="AuthGroup",
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'Permission group',
|
||||
'verbose_name_plural': 'Permission groups',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
"verbose_name": "Permission group",
|
||||
"verbose_name_plural": "Permission groups",
|
||||
"proxy": True,
|
||||
"indexes": [],
|
||||
"constraints": [],
|
||||
},
|
||||
bases=('auth.group',),
|
||||
bases=("auth.group",),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.GroupManager()),
|
||||
("objects", django.contrib.auth.models.GroupManager()),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='LoginDatum',
|
||||
fields=[
|
||||
],
|
||||
name="LoginDatum",
|
||||
fields=[],
|
||||
options={
|
||||
'verbose_name': 'Login Datum',
|
||||
'verbose_name_plural': 'Login Data',
|
||||
'proxy': True,
|
||||
'indexes': [],
|
||||
'constraints': [],
|
||||
"verbose_name": "Login Datum",
|
||||
"verbose_name_plural": "Login Data",
|
||||
"proxy": True,
|
||||
"indexes": [],
|
||||
"constraints": [],
|
||||
},
|
||||
bases=('auth.user',),
|
||||
bases=("auth.user",),
|
||||
managers=[
|
||||
('objects', django.contrib.auth.models.UserManager()),
|
||||
("objects", django.contrib.auth.models.UserManager()),
|
||||
],
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,2 +1,4 @@
|
||||
# ruff: noqa F403
|
||||
|
||||
from .oauth import *
|
||||
from .views import *
|
||||
from .oauth import *
|
||||
@ -1,46 +1,194 @@
|
||||
# Generated by Django 4.0.1 on 2023-03-29 20:40
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
replaces = [('ludwigsburgalpin', '0001_initial'), ('ludwigsburgalpin', '0002_auto_20190926_1432'), ('ludwigsburgalpin', '0003_auto_20190926_1749'), ('ludwigsburgalpin', '0004_alter_termin_id'), ('ludwigsburgalpin', '0005_alter_termin_id'), ('ludwigsburgalpin', '0006_termin_anforderung_dauer_termin_anforderung_hoehe_and_more'), ('ludwigsburgalpin', '0007_alter_termin_group')]
|
||||
|
||||
dependencies = [
|
||||
replaces = [
|
||||
("ludwigsburgalpin", "0001_initial"),
|
||||
("ludwigsburgalpin", "0002_auto_20190926_1432"),
|
||||
("ludwigsburgalpin", "0003_auto_20190926_1749"),
|
||||
("ludwigsburgalpin", "0004_alter_termin_id"),
|
||||
("ludwigsburgalpin", "0005_alter_termin_id"),
|
||||
("ludwigsburgalpin", "0006_termin_anforderung_dauer_termin_anforderung_hoehe_and_more"),
|
||||
("ludwigsburgalpin", "0007_alter_termin_group"),
|
||||
]
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Termin',
|
||||
name="Termin",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=100, verbose_name='Titel')),
|
||||
('start_date', models.DateField(verbose_name='Von')),
|
||||
('end_date', models.DateField(verbose_name='Bis')),
|
||||
('group', models.CharField(choices=[('ASG', 'Alpinsportgruppe'), ('OGB', 'Ortsgruppe Bietigheim'), ('OGV', 'Ortsgruppe Vaihingen'), ('JUG', 'Jugend'), ('FAM', 'Familie'), ('Ü30', 'Ü30'), ('MTB', 'Mountainbike'), ('RA', 'RegioAktiv'), ('SEK', 'Sektion')], max_length=100, verbose_name='Gruppe')),
|
||||
('description', models.TextField(blank=True, verbose_name='Beschreibung')),
|
||||
('email', models.EmailField(max_length=100, verbose_name='Email')),
|
||||
('phone', models.CharField(blank=True, max_length=20, verbose_name='Telefonnumer')),
|
||||
('responsible', models.CharField(max_length=100, verbose_name='Organisator')),
|
||||
('anforderung_dauer', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Etappendauer in Stunden')),
|
||||
('anforderung_hoehe', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Höhenmeter in Meter')),
|
||||
('anforderung_strecke', models.IntegerField(blank=True, default=0, validators=[django.core.validators.MinValueValidator(0)], verbose_name='Strecke in Kilometer')),
|
||||
('category', models.CharField(choices=[('WAN', 'Wandern'), ('BW', 'Bergwandern'), ('KST', 'Klettersteig'), ('KL', 'Klettern'), ('SKI', 'Piste, Loipe'), ('SCH', 'Schneeschuhgehen'), ('ST', 'Skitour'), ('STH', 'Skihochtour'), ('HT', 'Hochtour'), ('MTB', 'Montainbike'), ('AUS', 'Ausbildung'), ('SON', 'Sonstiges z.B. Treffen')], default='SON', max_length=100, verbose_name='Kategorie')),
|
||||
('condition', models.CharField(choices=[('gering', 'gering'), ('mittel', 'mittel'), ('groß', 'groß'), ('sehr groß', 'sehr groß')], default='mittel', max_length=100, verbose_name='Kondition')),
|
||||
('equipment', models.TextField(blank=True, verbose_name='Ausrüstung')),
|
||||
('eventart', models.CharField(choices=[('Einzeltermin', 'Einzeltermin'), ('Mehrtagesevent', 'Mehrtagesevent'), ('Regelmäßiges Event/Training', 'Regelmäßiges Event/Training'), ('Tagesevent', 'Tagesevent'), ('Wochenendevent', 'Wochenendevent')], default='Einzeltermin', max_length=100, verbose_name='Eventart')),
|
||||
('klassifizierung', models.CharField(choices=[('Gemeinschaftstour', 'Gemeinschaftstour'), ('Ausbildung', 'Ausbildung')], default='Gemeinschaftstour', max_length=100, verbose_name='Klassifizierung')),
|
||||
('max_participants', models.IntegerField(default=10, validators=[django.core.validators.MinValueValidator(1)], verbose_name='Max. Teilnehmerzahl')),
|
||||
('saison', models.CharField(choices=[('ganzjährig', 'ganzjährig'), ('Indoor', 'Indoor'), ('Sommer', 'Sommer'), ('Winter', 'Winter')], default='ganzjährig', max_length=100, verbose_name='Saison')),
|
||||
('subtitle', models.CharField(blank=True, max_length=100, verbose_name='Untertitel')),
|
||||
('technik', models.CharField(choices=[('leicht', 'leicht'), ('mittel', 'mittel'), ('schwer', 'schwer'), ('sehr schwer', 'sehr schwer')], default='mittel', max_length=100, verbose_name='Technik')),
|
||||
('voraussetzungen', models.TextField(blank=True, verbose_name='Voraussetzungen')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("title", models.CharField(max_length=100, verbose_name="Titel")),
|
||||
("start_date", models.DateField(verbose_name="Von")),
|
||||
("end_date", models.DateField(verbose_name="Bis")),
|
||||
(
|
||||
"group",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("ASG", "Alpinsportgruppe"),
|
||||
("OGB", "Ortsgruppe Bietigheim"),
|
||||
("OGV", "Ortsgruppe Vaihingen"),
|
||||
("JUG", "Jugend"),
|
||||
("FAM", "Familie"),
|
||||
("Ü30", "Ü30"),
|
||||
("MTB", "Mountainbike"),
|
||||
("RA", "RegioAktiv"),
|
||||
("SEK", "Sektion"),
|
||||
],
|
||||
max_length=100,
|
||||
verbose_name="Gruppe",
|
||||
),
|
||||
),
|
||||
("description", models.TextField(blank=True, verbose_name="Beschreibung")),
|
||||
("email", models.EmailField(max_length=100, verbose_name="Email")),
|
||||
("phone", models.CharField(blank=True, max_length=20, verbose_name="Telefonnumer")),
|
||||
("responsible", models.CharField(max_length=100, verbose_name="Organisator")),
|
||||
(
|
||||
"anforderung_dauer",
|
||||
models.IntegerField(
|
||||
blank=True,
|
||||
default=0,
|
||||
validators=[django.core.validators.MinValueValidator(0)],
|
||||
verbose_name="Etappendauer in Stunden",
|
||||
),
|
||||
),
|
||||
(
|
||||
"anforderung_hoehe",
|
||||
models.IntegerField(
|
||||
blank=True,
|
||||
default=0,
|
||||
validators=[django.core.validators.MinValueValidator(0)],
|
||||
verbose_name="Höhenmeter in Meter",
|
||||
),
|
||||
),
|
||||
(
|
||||
"anforderung_strecke",
|
||||
models.IntegerField(
|
||||
blank=True,
|
||||
default=0,
|
||||
validators=[django.core.validators.MinValueValidator(0)],
|
||||
verbose_name="Strecke in Kilometer",
|
||||
),
|
||||
),
|
||||
(
|
||||
"category",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("WAN", "Wandern"),
|
||||
("BW", "Bergwandern"),
|
||||
("KST", "Klettersteig"),
|
||||
("KL", "Klettern"),
|
||||
("SKI", "Piste, Loipe"),
|
||||
("SCH", "Schneeschuhgehen"),
|
||||
("ST", "Skitour"),
|
||||
("STH", "Skihochtour"),
|
||||
("HT", "Hochtour"),
|
||||
("MTB", "Montainbike"),
|
||||
("AUS", "Ausbildung"),
|
||||
("SON", "Sonstiges z.B. Treffen"),
|
||||
],
|
||||
default="SON",
|
||||
max_length=100,
|
||||
verbose_name="Kategorie",
|
||||
),
|
||||
),
|
||||
(
|
||||
"condition",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("gering", "gering"),
|
||||
("mittel", "mittel"),
|
||||
("groß", "groß"),
|
||||
("sehr groß", "sehr groß"),
|
||||
],
|
||||
default="mittel",
|
||||
max_length=100,
|
||||
verbose_name="Kondition",
|
||||
),
|
||||
),
|
||||
("equipment", models.TextField(blank=True, verbose_name="Ausrüstung")),
|
||||
(
|
||||
"eventart",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("Einzeltermin", "Einzeltermin"),
|
||||
("Mehrtagesevent", "Mehrtagesevent"),
|
||||
("Regelmäßiges Event/Training", "Regelmäßiges Event/Training"),
|
||||
("Tagesevent", "Tagesevent"),
|
||||
("Wochenendevent", "Wochenendevent"),
|
||||
],
|
||||
default="Einzeltermin",
|
||||
max_length=100,
|
||||
verbose_name="Eventart",
|
||||
),
|
||||
),
|
||||
(
|
||||
"klassifizierung",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("Gemeinschaftstour", "Gemeinschaftstour"),
|
||||
("Ausbildung", "Ausbildung"),
|
||||
],
|
||||
default="Gemeinschaftstour",
|
||||
max_length=100,
|
||||
verbose_name="Klassifizierung",
|
||||
),
|
||||
),
|
||||
(
|
||||
"max_participants",
|
||||
models.IntegerField(
|
||||
default=10,
|
||||
validators=[django.core.validators.MinValueValidator(1)],
|
||||
verbose_name="Max. Teilnehmerzahl",
|
||||
),
|
||||
),
|
||||
(
|
||||
"saison",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("ganzjährig", "ganzjährig"),
|
||||
("Indoor", "Indoor"),
|
||||
("Sommer", "Sommer"),
|
||||
("Winter", "Winter"),
|
||||
],
|
||||
default="ganzjährig",
|
||||
max_length=100,
|
||||
verbose_name="Saison",
|
||||
),
|
||||
),
|
||||
(
|
||||
"subtitle",
|
||||
models.CharField(blank=True, max_length=100, verbose_name="Untertitel"),
|
||||
),
|
||||
(
|
||||
"technik",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("leicht", "leicht"),
|
||||
("mittel", "mittel"),
|
||||
("schwer", "schwer"),
|
||||
("sehr schwer", "sehr schwer"),
|
||||
],
|
||||
default="mittel",
|
||||
max_length=100,
|
||||
verbose_name="Technik",
|
||||
),
|
||||
),
|
||||
("voraussetzungen", models.TextField(blank=True, verbose_name="Voraussetzungen")),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'Termine',
|
||||
'verbose_name': 'Termin',
|
||||
"verbose_name_plural": "Termine",
|
||||
"verbose_name": "Termin",
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,79 +1,165 @@
|
||||
# Generated by Django 4.0.1 on 2023-03-29 20:38
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import utils
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
replaces = [('mailer', '0001_initial'), ('mailer', '0002_auto_20190615_1225'), ('mailer', '0003_emailaddress'), ('mailer', '0004_auto_20200924_1744'), ('mailer', '0005_auto_20200924_2139'), ('mailer', '0006_auto_20210924_1155')]
|
||||
replaces = [
|
||||
("mailer", "0001_initial"),
|
||||
("mailer", "0002_auto_20190615_1225"),
|
||||
("mailer", "0003_emailaddress"),
|
||||
("mailer", "0004_auto_20200924_1744"),
|
||||
("mailer", "0005_auto_20200924_2139"),
|
||||
("mailer", "0006_auto_20210924_1155"),
|
||||
]
|
||||
|
||||
dependencies = [
|
||||
('members', '0006_auto_20190914_2341'),
|
||||
('members', '0008_auto_20210924_1155'),
|
||||
('members', '0001_initial'),
|
||||
('members', '0007_auto_20200924_1512'),
|
||||
('members', '0005_auto_20190615_1224'),
|
||||
("members", "0006_auto_20190914_2341"),
|
||||
("members", "0008_auto_20210924_1155"),
|
||||
("members", "0001_initial"),
|
||||
("members", "0007_auto_20200924_1512"),
|
||||
("members", "0005_auto_20190615_1224"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Message',
|
||||
name="Message",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('subject', models.CharField(max_length=50, verbose_name='subject')),
|
||||
('content', models.TextField(verbose_name='content')),
|
||||
('sent', models.BooleanField(default=False, verbose_name='sent')),
|
||||
('to_groups', models.ManyToManyField(blank=True, to='members.Group', verbose_name='to group')),
|
||||
('to_members', models.ManyToManyField(blank=True, to='members.Member', verbose_name='to member')),
|
||||
('reply_to', models.ManyToManyField(blank=True, related_name='reply_to', to='members.Member', verbose_name='reply to participant')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("subject", models.CharField(max_length=50, verbose_name="subject")),
|
||||
("content", models.TextField(verbose_name="content")),
|
||||
("sent", models.BooleanField(default=False, verbose_name="sent")),
|
||||
(
|
||||
"to_groups",
|
||||
models.ManyToManyField(blank=True, to="members.Group", verbose_name="to group"),
|
||||
),
|
||||
(
|
||||
"to_members",
|
||||
models.ManyToManyField(
|
||||
blank=True, to="members.Member", verbose_name="to member"
|
||||
),
|
||||
),
|
||||
(
|
||||
"reply_to",
|
||||
models.ManyToManyField(
|
||||
blank=True,
|
||||
related_name="reply_to",
|
||||
to="members.Member",
|
||||
verbose_name="reply to participant",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'messages',
|
||||
'permissions': (('submit_mails', 'Can submit mails'),),
|
||||
'verbose_name': 'message',
|
||||
"verbose_name_plural": "messages",
|
||||
"permissions": (("submit_mails", "Can submit mails"),),
|
||||
"verbose_name": "message",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Attachment',
|
||||
name="Attachment",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('f', utils.RestrictedFileField(blank=True, upload_to='attachments', verbose_name='file')),
|
||||
('msg', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mailer.message')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"f",
|
||||
utils.RestrictedFileField(
|
||||
blank=True, upload_to="attachments", verbose_name="file"
|
||||
),
|
||||
),
|
||||
(
|
||||
"msg",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE, to="mailer.message"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'attachments',
|
||||
'verbose_name': 'attachment',
|
||||
"verbose_name_plural": "attachments",
|
||||
"verbose_name": "attachment",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='EmailAddress',
|
||||
name="EmailAddress",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=50, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z]*$', 'Only alphanumeric characters are allowed')], verbose_name='name')),
|
||||
('to_members', models.ManyToManyField(blank=True, to='members.Member', verbose_name='Forward to participants')),
|
||||
('to_groups', models.ManyToManyField(blank=True, to='members.Group', verbose_name='Forward to group')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"name",
|
||||
models.CharField(
|
||||
max_length=50,
|
||||
validators=[
|
||||
django.core.validators.RegexValidator(
|
||||
"^[0-9a-zA-Z]*$", "Only alphanumeric characters are allowed"
|
||||
)
|
||||
],
|
||||
verbose_name="name",
|
||||
),
|
||||
),
|
||||
(
|
||||
"to_members",
|
||||
models.ManyToManyField(
|
||||
blank=True, to="members.Member", verbose_name="Forward to participants"
|
||||
),
|
||||
),
|
||||
(
|
||||
"to_groups",
|
||||
models.ManyToManyField(
|
||||
blank=True, to="members.Group", verbose_name="Forward to group"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'email addresses',
|
||||
'verbose_name': 'email address',
|
||||
"verbose_name_plural": "email addresses",
|
||||
"verbose_name": "email address",
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='message',
|
||||
name='reply_to_email_address',
|
||||
field=models.ManyToManyField(blank=True, related_name='reply_to_email_addr', to='mailer.EmailAddress', verbose_name='reply to custom email address'),
|
||||
model_name="message",
|
||||
name="reply_to_email_address",
|
||||
field=models.ManyToManyField(
|
||||
blank=True,
|
||||
related_name="reply_to_email_addr",
|
||||
to="mailer.EmailAddress",
|
||||
verbose_name="reply to custom email address",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='message',
|
||||
name='to_freizeit',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='members.freizeit', verbose_name='to freizeit'),
|
||||
model_name="message",
|
||||
name="to_freizeit",
|
||||
field=models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="members.freizeit",
|
||||
verbose_name="to freizeit",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='message',
|
||||
name='to_notelist',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='members.membernotelist', verbose_name='to notes list'),
|
||||
model_name="message",
|
||||
name="to_notelist",
|
||||
field=models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="members.membernotelist",
|
||||
verbose_name="to notes list",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,20 +1,27 @@
|
||||
# Generated by Django 4.0.1 on 2023-04-02 12:06
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0006_rename_permissions'),
|
||||
('mailer', '0001_initial_squashed_0006_auto_20210924_1155'),
|
||||
("members", "0006_rename_permissions"),
|
||||
("mailer", "0001_initial_squashed_0006_auto_20210924_1155"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='message',
|
||||
name='created_by',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_messages', to='members.member', verbose_name='Created by'),
|
||||
model_name="message",
|
||||
name="created_by",
|
||||
field=models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="created_messages",
|
||||
to="members.member",
|
||||
verbose_name="Created by",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,18 @@
|
||||
# Generated by Django 4.0.1 on 2024-11-17 23:31
|
||||
|
||||
from django.db import migrations
|
||||
import utils
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mailer', '0003_alter_message_options'),
|
||||
("mailer", "0003_alter_message_options"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='attachment',
|
||||
name='f',
|
||||
field=utils.RestrictedFileField(upload_to='attachments', verbose_name='file'),
|
||||
model_name="attachment",
|
||||
name="f",
|
||||
field=utils.RestrictedFileField(upload_to="attachments", verbose_name="file"),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,27 @@
|
||||
# Generated by Django 4.0.1 on 2024-11-23 14:03
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mailer', '0004_alter_attachment_f'),
|
||||
("mailer", "0004_alter_attachment_f"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='emailaddress',
|
||||
name='name',
|
||||
field=models.CharField(max_length=50, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z._-]*$', 'Only alphanumeric characters, ., - and _ are allowed')], verbose_name='name'),
|
||||
model_name="emailaddress",
|
||||
name="name",
|
||||
field=models.CharField(
|
||||
max_length=50,
|
||||
validators=[
|
||||
django.core.validators.RegexValidator(
|
||||
"^[0-9a-zA-Z._-]*$", "Only alphanumeric characters, ., - and _ are allowed"
|
||||
)
|
||||
],
|
||||
verbose_name="name",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,25 @@
|
||||
# Generated by Django 4.0.1 on 2024-12-01 15:54
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('members', '0029_alter_member_gender_alter_memberwaitinglist_gender'),
|
||||
('mailer', '0005_alter_emailaddress_name'),
|
||||
("members", "0029_alter_member_gender_alter_memberwaitinglist_gender"),
|
||||
("mailer", "0005_alter_emailaddress_name"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='emailaddress',
|
||||
name='allowed_senders',
|
||||
field=models.ManyToManyField(blank=True, help_text='Only forward e-mails of members of selected groups. Leave empty to allow all senders.', related_name='allowed_sender_on_emailaddresses', to='members.Group', verbose_name='Allowed sender'),
|
||||
model_name="emailaddress",
|
||||
name="allowed_senders",
|
||||
field=models.ManyToManyField(
|
||||
blank=True,
|
||||
help_text="Only forward e-mails of members of selected groups. Leave empty to allow all senders.",
|
||||
related_name="allowed_sender_on_emailaddresses",
|
||||
to="members.Group",
|
||||
verbose_name="Allowed sender",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,18 +1,22 @@
|
||||
# Generated by Django 4.0.1 on 2024-12-01 17:45
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mailer', '0006_emailaddress_allowed_senders'),
|
||||
("mailer", "0006_emailaddress_allowed_senders"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='emailaddress',
|
||||
name='internal_only',
|
||||
field=models.BooleanField(default=False, help_text='Only allow forwarding to this e-mail address from the internal domain.', verbose_name='Restrict to internal email addresses'),
|
||||
model_name="emailaddress",
|
||||
name="internal_only",
|
||||
field=models.BooleanField(
|
||||
default=False,
|
||||
help_text="Only allow forwarding to this e-mail address from the internal domain.",
|
||||
verbose_name="Restrict to internal email addresses",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,28 @@
|
||||
# Generated by Django 4.0.1 on 2024-12-03 23:19
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('mailer', '0007_emailaddress_internal_only'),
|
||||
("mailer", "0007_emailaddress_internal_only"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='emailaddress',
|
||||
name='name',
|
||||
field=models.CharField(max_length=50, unique=True, validators=[django.core.validators.RegexValidator('^[0-9a-zA-Z._-]*$', 'Only alphanumeric characters, ., - and _ are allowed')], verbose_name='name'),
|
||||
model_name="emailaddress",
|
||||
name="name",
|
||||
field=models.CharField(
|
||||
max_length=50,
|
||||
unique=True,
|
||||
validators=[
|
||||
django.core.validators.RegexValidator(
|
||||
"^[0-9a-zA-Z._-]*$", "Only alphanumeric characters, ., - and _ are allowed"
|
||||
)
|
||||
],
|
||||
verbose_name="name",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
from .models import *
|
||||
# ruff: noqa F403
|
||||
|
||||
from .admin import *
|
||||
from .views import *
|
||||
from .rules import *
|
||||
from .mailutils import *
|
||||
from .models import *
|
||||
from .rules import *
|
||||
from .views import *
|
||||
|
||||
@ -1,27 +1,33 @@
|
||||
from unittest import skip, mock
|
||||
from django.test import TestCase
|
||||
from django.conf import settings
|
||||
from django.utils import timezone
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import gettext as _
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from members.models import Member, Group, DIVERSE, Freizeit, MemberNoteList, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE
|
||||
from mailer.models import EmailAddress, EmailAddressForm, Message, MessageForm, Attachment
|
||||
from mailer.mailutils import SENT, NOT_SENT, PARTLY_SENT
|
||||
from mailer.models import EmailAddress
|
||||
from members.models import DIVERSE
|
||||
from members.models import Group
|
||||
from members.models import Member
|
||||
|
||||
|
||||
class BasicMailerTestCase(TestCase):
|
||||
def setUp(self):
|
||||
self.mygroup = Group.objects.create(name="My Group")
|
||||
self.fritz = Member.objects.create(prename="Fritz", lastname="Wulter", birth_date=timezone.now().date(),
|
||||
email='fritz@foo.com', gender=DIVERSE)
|
||||
self.fritz = Member.objects.create(
|
||||
prename="Fritz",
|
||||
lastname="Wulter",
|
||||
birth_date=timezone.now().date(),
|
||||
email="fritz@foo.com",
|
||||
gender=DIVERSE,
|
||||
)
|
||||
self.fritz.group.add(self.mygroup)
|
||||
self.fritz.save()
|
||||
self.fritz.generate_key()
|
||||
|
||||
self.paul = Member.objects.create(prename="Paul", lastname="Wulter", birth_date=timezone.now().date(),
|
||||
email='paul@foo.com', gender=DIVERSE)
|
||||
self.paul = Member.objects.create(
|
||||
prename="Paul",
|
||||
lastname="Wulter",
|
||||
birth_date=timezone.now().date(),
|
||||
email="paul@foo.com",
|
||||
gender=DIVERSE,
|
||||
)
|
||||
|
||||
self.em = EmailAddress.objects.create(name='foobar')
|
||||
self.em = EmailAddress.objects.create(name="foobar")
|
||||
self.em.to_groups.add(self.mygroup)
|
||||
self.em.to_members.add(self.paul)
|
||||
|
||||
@ -1,65 +1,59 @@
|
||||
from unittest import skip, mock
|
||||
from http import HTTPStatus
|
||||
|
||||
from django.urls import reverse
|
||||
from django.test import TestCase
|
||||
from django.conf import settings
|
||||
from django.utils import timezone
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import gettext as _
|
||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||
from members.models import Member, Group, DIVERSE, Freizeit, MemberNoteList, GEMEINSCHAFTS_TOUR, MUSKELKRAFT_ANREISE
|
||||
from mailer.models import EmailAddress, EmailAddressForm, Message, MessageForm, Attachment
|
||||
from mailer.mailutils import SENT, NOT_SENT, PARTLY_SENT
|
||||
|
||||
from .utils import BasicMailerTestCase
|
||||
|
||||
|
||||
class IndexTestCase(BasicMailerTestCase):
|
||||
def test_index(self):
|
||||
url = reverse('mailer:index')
|
||||
url = reverse("mailer:index")
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, HTTPStatus.FOUND)
|
||||
|
||||
|
||||
class UnsubscribeTestCase(BasicMailerTestCase):
|
||||
def test_unsubscribe(self):
|
||||
url = reverse('mailer:unsubscribe')
|
||||
url = reverse("mailer:unsubscribe")
|
||||
response = self.client.get(url)
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Here you can unsubscribe from the newsletter"))
|
||||
|
||||
def test_unsubscribe_key_invalid(self):
|
||||
url = reverse('mailer:unsubscribe')
|
||||
url = reverse("mailer:unsubscribe")
|
||||
|
||||
# invalid key
|
||||
response = self.client.get(url, data={'key': 'invalid'})
|
||||
response = self.client.get(url, data={"key": "invalid"})
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Can't verify this link. Try again!"))
|
||||
|
||||
# expired key
|
||||
self.fritz.unsubscribe_expire = timezone.now()
|
||||
self.fritz.save()
|
||||
response = self.client.get(url, data={'key': self.fritz.unsubscribe_key})
|
||||
response = self.client.get(url, data={"key": self.fritz.unsubscribe_key})
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Can't verify this link. Try again!"))
|
||||
|
||||
def test_unsubscribe_key(self):
|
||||
url = reverse('mailer:unsubscribe')
|
||||
response = self.client.get(url, data={'key': self.fritz.unsubscribe_key})
|
||||
url = reverse("mailer:unsubscribe")
|
||||
response = self.client.get(url, data={"key": self.fritz.unsubscribe_key})
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Successfully unsubscribed from the newsletter for "))
|
||||
|
||||
def test_unsubscribe_post_incomplete(self):
|
||||
url = reverse('mailer:unsubscribe')
|
||||
response = self.client.post(url, data={'post': True})
|
||||
url = reverse("mailer:unsubscribe")
|
||||
response = self.client.post(url, data={"post": True})
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Please fill in every field"))
|
||||
|
||||
response = self.client.post(url, data={'post': True, 'email': 'foobar@notexisting.com'})
|
||||
response = self.client.post(url, data={"post": True, "email": "foobar@notexisting.com"})
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Please fill in every field"))
|
||||
|
||||
def test_unsubscribe_post(self):
|
||||
url = reverse('mailer:unsubscribe')
|
||||
response = self.client.post(url, data={'post': True, 'email': self.fritz.email})
|
||||
url = reverse("mailer:unsubscribe")
|
||||
response = self.client.post(url, data={"post": True, "email": self.fritz.email})
|
||||
self.assertEqual(response.status_code, HTTPStatus.OK)
|
||||
self.assertContains(response, _("Sent confirmation mail to"))
|
||||
|
||||
@ -1,61 +1,98 @@
|
||||
# Generated by Django 4.0.1 on 2023-03-29 20:39
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
replaces = [('material', '0001_initial'), ('material', '0002_auto_20171011_2045')]
|
||||
replaces = [("material", "0001_initial"), ("material", "0002_auto_20171011_2045")]
|
||||
|
||||
dependencies = [
|
||||
('members', '0001_initial'),
|
||||
("members", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='MaterialPart',
|
||||
name="MaterialPart",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=30, verbose_name='name')),
|
||||
('description', models.CharField(default='', max_length=140, verbose_name='description')),
|
||||
('quantity', models.IntegerField(default=0, verbose_name='quantity')),
|
||||
('buy_date', models.DateField(verbose_name='purchase date')),
|
||||
('lifetime', models.DecimalField(decimal_places=0, max_digits=3, verbose_name='lifetime (years)')),
|
||||
('photo', models.ImageField(blank=True, upload_to='images', verbose_name='photo')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=30, verbose_name="name")),
|
||||
(
|
||||
"description",
|
||||
models.CharField(default="", max_length=140, verbose_name="description"),
|
||||
),
|
||||
("quantity", models.IntegerField(default=0, verbose_name="quantity")),
|
||||
("buy_date", models.DateField(verbose_name="purchase date")),
|
||||
(
|
||||
"lifetime",
|
||||
models.DecimalField(
|
||||
decimal_places=0, max_digits=3, verbose_name="lifetime (years)"
|
||||
),
|
||||
),
|
||||
("photo", models.ImageField(blank=True, upload_to="images", verbose_name="photo")),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'material part',
|
||||
'verbose_name_plural': 'material parts',
|
||||
"verbose_name": "material part",
|
||||
"verbose_name_plural": "material parts",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Ownership',
|
||||
name="Ownership",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('count', models.IntegerField(default=1, verbose_name='count')),
|
||||
('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='material.materialpart')),
|
||||
('owner', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='members.member', verbose_name='owner')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("count", models.IntegerField(default=1, verbose_name="count")),
|
||||
(
|
||||
"material",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE, to="material.materialpart"
|
||||
),
|
||||
),
|
||||
(
|
||||
"owner",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="members.member",
|
||||
verbose_name="owner",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'ownership',
|
||||
'verbose_name_plural': 'ownerships',
|
||||
"verbose_name": "ownership",
|
||||
"verbose_name_plural": "ownerships",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MaterialCategory',
|
||||
name="MaterialCategory",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=40, verbose_name='Name')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=40, verbose_name="Name")),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Material category',
|
||||
'verbose_name_plural': 'Material categories',
|
||||
"verbose_name": "Material category",
|
||||
"verbose_name_plural": "Material categories",
|
||||
},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='materialpart',
|
||||
name='material_cat',
|
||||
field=models.ManyToManyField(default=None, to='material.MaterialCategory', verbose_name='Material category'),
|
||||
model_name="materialpart",
|
||||
name="material_cat",
|
||||
field=models.ManyToManyField(
|
||||
default=None, to="material.MaterialCategory", verbose_name="Material category"
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,77 +1,152 @@
|
||||
# Generated by Django 4.0.1 on 2023-04-09 12:11
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django.utils.timezone
|
||||
import markdownx.models
|
||||
import utils
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('members', '0012_member_image_group_description'),
|
||||
("members", "0012_member_image_group_description"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Section',
|
||||
name="Section",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(max_length=50, verbose_name='Title')),
|
||||
('urlname', models.CharField(max_length=25, verbose_name='URL')),
|
||||
('website_text', markdownx.models.MarkdownxField(blank=True, default='', verbose_name='website text')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("title", models.CharField(max_length=50, verbose_name="Title")),
|
||||
("urlname", models.CharField(max_length=25, verbose_name="URL")),
|
||||
(
|
||||
"website_text",
|
||||
markdownx.models.MarkdownxField(
|
||||
blank=True, default="", verbose_name="website text"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Section',
|
||||
'verbose_name_plural': 'Sections',
|
||||
'unique_together': {('urlname',)},
|
||||
"verbose_name": "Section",
|
||||
"verbose_name_plural": "Sections",
|
||||
"unique_together": {("urlname",)},
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Post',
|
||||
name="Post",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('title', models.CharField(default='', max_length=50, verbose_name='Title')),
|
||||
('urlname', models.CharField(default='', max_length=50, verbose_name='URL')),
|
||||
('date', models.DateField(blank=True, default=django.utils.timezone.localdate, null=True, verbose_name='Date')),
|
||||
('website_text', markdownx.models.MarkdownxField(blank=True, default='', verbose_name='website text')),
|
||||
('detailed', models.BooleanField(default=False, verbose_name='detailed')),
|
||||
('groups', models.ManyToManyField(blank=True, to='members.Group', verbose_name='Groups')),
|
||||
('section', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='startpage.section', verbose_name='section')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("title", models.CharField(default="", max_length=50, verbose_name="Title")),
|
||||
("urlname", models.CharField(default="", max_length=50, verbose_name="URL")),
|
||||
(
|
||||
"date",
|
||||
models.DateField(
|
||||
blank=True,
|
||||
default=django.utils.timezone.localdate,
|
||||
null=True,
|
||||
verbose_name="Date",
|
||||
),
|
||||
),
|
||||
(
|
||||
"website_text",
|
||||
markdownx.models.MarkdownxField(
|
||||
blank=True, default="", verbose_name="website text"
|
||||
),
|
||||
),
|
||||
("detailed", models.BooleanField(default=False, verbose_name="detailed")),
|
||||
(
|
||||
"groups",
|
||||
models.ManyToManyField(blank=True, to="members.Group", verbose_name="Groups"),
|
||||
),
|
||||
(
|
||||
"section",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
to="startpage.section",
|
||||
verbose_name="section",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Post',
|
||||
'verbose_name_plural': 'Posts',
|
||||
'unique_together': {('section', 'urlname')},
|
||||
"verbose_name": "Post",
|
||||
"verbose_name_plural": "Posts",
|
||||
"unique_together": {("section", "urlname")},
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MemberOnPost',
|
||||
name="MemberOnPost",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('description', models.TextField(blank=True, default='', verbose_name='Description')),
|
||||
('tag', models.CharField(blank=True, default='', max_length=20, verbose_name='Tag')),
|
||||
('members', models.ManyToManyField(blank=True, to='members.Member', verbose_name='Member')),
|
||||
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='people', to='startpage.post', verbose_name='Member')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"description",
|
||||
models.TextField(blank=True, default="", verbose_name="Description"),
|
||||
),
|
||||
(
|
||||
"tag",
|
||||
models.CharField(blank=True, default="", max_length=20, verbose_name="Tag"),
|
||||
),
|
||||
(
|
||||
"members",
|
||||
models.ManyToManyField(blank=True, to="members.Member", verbose_name="Member"),
|
||||
),
|
||||
(
|
||||
"post",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="people",
|
||||
to="startpage.post",
|
||||
verbose_name="Member",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Person',
|
||||
'verbose_name_plural': 'Persons',
|
||||
"verbose_name": "Person",
|
||||
"verbose_name_plural": "Persons",
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Image',
|
||||
name="Image",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('f', utils.RestrictedFileField(blank=True, upload_to='images', verbose_name='file')),
|
||||
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='startpage.post')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"f",
|
||||
utils.RestrictedFileField(blank=True, upload_to="images", verbose_name="file"),
|
||||
),
|
||||
(
|
||||
"post",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE, to="startpage.post"
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'image',
|
||||
'verbose_name_plural': 'images',
|
||||
"verbose_name": "image",
|
||||
"verbose_name_plural": "images",
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,18 +1,18 @@
|
||||
# Generated by Django 4.0.1 on 2024-11-23 17:00
|
||||
|
||||
from django.db import migrations, models
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('startpage', '0001_initial'),
|
||||
("startpage", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='section',
|
||||
name='show_in_navigation',
|
||||
field=models.BooleanField(default=True, verbose_name='Show in navigation'),
|
||||
model_name="section",
|
||||
name="show_in_navigation",
|
||||
field=models.BooleanField(default=True, verbose_name="Show in navigation"),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,19 +1,24 @@
|
||||
# Generated by Django 4.0.1 on 2024-11-23 17:41
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('startpage', '0002_section_show_in_navigation'),
|
||||
("startpage", "0002_section_show_in_navigation"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='post',
|
||||
name='section',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='startpage.section', verbose_name='section'),
|
||||
model_name="post",
|
||||
name="section",
|
||||
field=models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="startpage.section",
|
||||
verbose_name="section",
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
@ -1,29 +1,45 @@
|
||||
# Generated by Django 4.0.1 on 2025-02-25 12:20
|
||||
|
||||
from django.db import migrations, models
|
||||
import utils
|
||||
from django.db import migrations
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('startpage', '0003_alter_post_section'),
|
||||
("startpage", "0003_alter_post_section"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Link',
|
||||
name="Link",
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('icon', utils.RestrictedFileField(blank=True, upload_to='icons', verbose_name='Link Icon')),
|
||||
('title', models.CharField(blank=True, default='', max_length=100, verbose_name='Title')),
|
||||
('description', models.TextField(blank=True, default='', verbose_name='Description')),
|
||||
('url', models.URLField(max_length=250)),
|
||||
('visible', models.BooleanField(default=True, verbose_name='Visible')),
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"icon",
|
||||
utils.RestrictedFileField(
|
||||
blank=True, upload_to="icons", verbose_name="Link Icon"
|
||||
),
|
||||
),
|
||||
(
|
||||
"title",
|
||||
models.CharField(blank=True, default="", max_length=100, verbose_name="Title"),
|
||||
),
|
||||
(
|
||||
"description",
|
||||
models.TextField(blank=True, default="", verbose_name="Description"),
|
||||
),
|
||||
("url", models.URLField(max_length=250)),
|
||||
("visible", models.BooleanField(default=True, verbose_name="Visible")),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Link',
|
||||
'verbose_name_plural': 'Links',
|
||||
"verbose_name": "Link",
|
||||
"verbose_name_plural": "Links",
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
Loading…
Reference in New Issue