@@ -1,3 +1,10 @@
|
||||
from django.contrib import admin
|
||||
from .models import YearData
|
||||
from .models import MonthData
|
||||
from .models import Event
|
||||
from .models import CalendarData
|
||||
|
||||
# Register your models here.
|
||||
admin.site.register(YearData)
|
||||
admin.site.register(MonthData)
|
||||
admin.site.register(Event)
|
||||
admin.site.register(CalendarData)
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 08:12
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CalendarData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('current_year', models.SmallIntegerField(verbose_name='CurrentYear')),
|
||||
('current_month', models.SmallIntegerField(verbose_name='CurrentMonth')),
|
||||
('current_day', models.SmallIntegerField(verbose_name='CurrentDay')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.SmallIntegerField(verbose_name='Year')),
|
||||
('month', models.SmallIntegerField(verbose_name='Month')),
|
||||
('day', models.SmallIntegerField(verbose_name='Day')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:03
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='MonthData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.SmallIntegerField(unique=True, verbose_name='Number')),
|
||||
('name', models.CharField(max_length=64, unique=True, verbose_name='Name')),
|
||||
('folkname', models.CharField(max_length=64, unique=True, verbose_name='Folkname')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,31 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:17
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0002_monthdata'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='description',
|
||||
field=models.TextField(default=0, max_length=2500, verbose_name='Description'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='time',
|
||||
field=models.TimeField(default=0, verbose_name='Time'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='title',
|
||||
field=models.CharField(default=0, max_length=250, verbose_name='Title'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:23
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0003_auto_20220713_1117'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.DeleteModel(
|
||||
name='CalendarData',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Event',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='MonthData',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:23
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0004_auto_20220713_1123'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CalendarData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('current_year', models.SmallIntegerField(verbose_name='CurrentYear')),
|
||||
('current_month', models.SmallIntegerField(verbose_name='CurrentMonth')),
|
||||
('current_day', models.SmallIntegerField(verbose_name='CurrentDay')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.SmallIntegerField(verbose_name='Year')),
|
||||
('month', models.SmallIntegerField(verbose_name='Month')),
|
||||
('day', models.SmallIntegerField(verbose_name='Day')),
|
||||
('time', models.TimeField(verbose_name='Time')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Title')),
|
||||
('description', models.TextField(max_length=2500, verbose_name='Description')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MonthData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.SmallIntegerField(unique=True, verbose_name='Number')),
|
||||
('name', models.CharField(max_length=64, unique=True, verbose_name='Name')),
|
||||
('folkname', models.CharField(max_length=64, unique=True, verbose_name='Folkname')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:26
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0005_calendardata_event_monthdata'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.DeleteModel(
|
||||
name='CalendarData',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Event',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='MonthData',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,45 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:27
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0006_auto_20220713_1126'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='CalendarData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('current_year', models.SmallIntegerField(verbose_name='CurrentYear')),
|
||||
('current_month', models.SmallIntegerField(verbose_name='CurrentMonth')),
|
||||
('current_day', models.SmallIntegerField(verbose_name='CurrentDay')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.SmallIntegerField(verbose_name='Year')),
|
||||
('month', models.SmallIntegerField(verbose_name='Month')),
|
||||
('day', models.SmallIntegerField(verbose_name='Day')),
|
||||
('time', models.TimeField(verbose_name='Time')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Title')),
|
||||
('description', models.TextField(max_length=2500, verbose_name='Description')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MonthData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.SmallIntegerField(unique=True, verbose_name='Number')),
|
||||
('name', models.CharField(max_length=64, unique=True, verbose_name='Name')),
|
||||
('folkname', models.CharField(max_length=64, unique=True, verbose_name='Folkname')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:45
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0007_calendardata_event_monthdata'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='monthdata',
|
||||
name='folkname',
|
||||
field=models.CharField(max_length=64, verbose_name='Folkname'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:49
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0008_alter_monthdata_folkname'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='monthdata',
|
||||
name='folkname',
|
||||
field=models.CharField(blank=True, max_length=64, unique=True, verbose_name='Folkname'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 11:50
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0009_alter_monthdata_folkname'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='monthdata',
|
||||
name='folkname',
|
||||
field=models.CharField(blank=True, max_length=64, verbose_name='Folkname'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 12:31
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0010_alter_monthdata_folkname'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='monthdata',
|
||||
name='is_oneday',
|
||||
field=models.BooleanField(default=0, verbose_name='IsOneday'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-13 12:35
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0011_monthdata_is_oneday'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='calendardata',
|
||||
name='leap_month',
|
||||
field=models.SmallIntegerField(default=11, verbose_name='LeapMonth'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 07:31
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0012_calendardata_leap_month'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='calendardata',
|
||||
name='current_month',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.monthdata'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,66 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 08:40
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0013_alter_calendardata_current_month'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='YearData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.SmallIntegerField(verbose_name='Year')),
|
||||
],
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='calendardata',
|
||||
name='current_month',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='calendardata',
|
||||
name='current_year',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='calendardata',
|
||||
name='leap_month',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='event',
|
||||
name='month',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='event',
|
||||
name='year',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='monthdata',
|
||||
name='is_leap_month',
|
||||
field=models.BooleanField(default=0, verbose_name='IsLeapMonth'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='DayData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.SmallIntegerField(unique=True, verbose_name='Number')),
|
||||
('month', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.monthdata')),
|
||||
('year', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.yeardata')),
|
||||
],
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='calendardata',
|
||||
name='current_day',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.daydata'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='day',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.daydata'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,40 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 09:06
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0014_auto_20220714_0840'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='daydata',
|
||||
name='month',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='daydata',
|
||||
name='year',
|
||||
),
|
||||
migrations.RemoveField(
|
||||
model_name='event',
|
||||
name='day',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='CalendarData',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='DayData',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='Event',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='MonthData',
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='YearData',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,68 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 09:07
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0015_auto_20220714_0906'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='DayData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.SmallIntegerField(unique=True, verbose_name='Number')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='MonthData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('number', models.SmallIntegerField(unique=True, verbose_name='Number')),
|
||||
('name', models.CharField(max_length=64, unique=True, verbose_name='Name')),
|
||||
('folkname', models.CharField(blank=True, max_length=64, verbose_name='Folkname')),
|
||||
('is_oneday', models.BooleanField(verbose_name='IsOneday')),
|
||||
('is_leap_month', models.BooleanField(verbose_name='IsLeapMonth')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='YearData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('year', models.SmallIntegerField(verbose_name='Year')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Event',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('time', models.TimeField(verbose_name='Time')),
|
||||
('title', models.CharField(max_length=250, verbose_name='Title')),
|
||||
('description', models.TextField(max_length=2500, verbose_name='Description')),
|
||||
('day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.daydata')),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='daydata',
|
||||
name='month',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.monthdata'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='daydata',
|
||||
name='year',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.yeardata'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='CalendarData',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('current_day', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.daydata')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,34 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 11:36
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0016_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='yeardata',
|
||||
name='year',
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='yeardata',
|
||||
name='number',
|
||||
field=models.SmallIntegerField(default=1, validators=[django.core.validators.RegexValidator('^-?[1-9]\\d{0,3}$', 'Year must be not zero and between -9999 and 9999')], verbose_name='Number'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='daydata',
|
||||
name='number',
|
||||
field=models.SmallIntegerField(unique=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(30)], verbose_name='Number'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='monthdata',
|
||||
name='number',
|
||||
field=models.SmallIntegerField(unique=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(18)], verbose_name='Number'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,52 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 13:05
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0017_auto_20220714_1136'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='calendardata',
|
||||
name='current_month',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.monthdata'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='calendardata',
|
||||
name='current_year',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.yeardata'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='current_month',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.monthdata'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='current_year',
|
||||
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, to='faerun_calendar.yeardata'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='calendardata',
|
||||
name='current_day',
|
||||
field=models.SmallIntegerField(unique=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(30)], verbose_name='Number'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='day',
|
||||
field=models.SmallIntegerField(unique=True, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(30)], verbose_name='Number'),
|
||||
),
|
||||
migrations.DeleteModel(
|
||||
name='DayData',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,23 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-14 13:12
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0018_auto_20220714_1305'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RenameField(
|
||||
model_name='event',
|
||||
old_name='current_month',
|
||||
new_name='month',
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='event',
|
||||
old_name='current_year',
|
||||
new_name='year',
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.12 on 2022-11-01 13:52
|
||||
|
||||
import django.core.validators
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0019_auto_20220714_1312'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='day',
|
||||
field=models.SmallIntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(30)], verbose_name='Number'),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 3.2.12 on 2022-11-02 06:49
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('faerun_calendar', '0020_alter_event_day'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='is_only_for_gm',
|
||||
field=models.BooleanField(default=False, verbose_name='IsOnlyForGm'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='is_suggested',
|
||||
field=models.BooleanField(default=False, verbose_name='IsSuggested'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
@@ -1,3 +1,68 @@
|
||||
from django.db import models
|
||||
from django.core.validators import RegexValidator
|
||||
from django.core.validators import MinValueValidator
|
||||
from django.core.validators import MaxValueValidator
|
||||
|
||||
# Create your models here.
|
||||
|
||||
class YearData(models.Model):
|
||||
number = models.SmallIntegerField('Number', validators=[
|
||||
RegexValidator(r'^-?[1-9]\d{0,3}$', 'Year must be not zero and between -9999 and 9999')
|
||||
])
|
||||
|
||||
@property
|
||||
def is_leap(self):
|
||||
if self.number == 0:
|
||||
return False
|
||||
elif self.number % 400 == 0:
|
||||
return True
|
||||
elif self.number % 100 == 0:
|
||||
return False
|
||||
elif self.number % 4 == 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.number}, {self.is_leap})'
|
||||
|
||||
|
||||
class MonthData(models.Model):
|
||||
number = models.SmallIntegerField('Number', unique=True, validators=[
|
||||
MinValueValidator(1),
|
||||
MaxValueValidator(18),
|
||||
])
|
||||
name = models.CharField('Name', max_length=64, unique=True)
|
||||
folkname = models.CharField('Folkname', max_length=64, blank=True)
|
||||
is_oneday = models.BooleanField('IsOneday')
|
||||
is_leap_month = models.BooleanField('IsLeapMonth')
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.number}, {self.name}, {self.folkname}, {self.is_oneday}, {self.is_leap_month})'
|
||||
|
||||
|
||||
class CalendarData(models.Model):
|
||||
current_day = models.SmallIntegerField('Number', unique=True, validators=[
|
||||
MinValueValidator(1),
|
||||
MaxValueValidator(30),
|
||||
])
|
||||
current_month = models.ForeignKey(MonthData, on_delete=models.CASCADE)
|
||||
current_year = models.ForeignKey(YearData, on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.current_day}, {self.current_month}, {self.current_year})'
|
||||
|
||||
|
||||
class Event(models.Model):
|
||||
day = models.SmallIntegerField('Number', validators=[
|
||||
MinValueValidator(1),
|
||||
MaxValueValidator(30),
|
||||
])
|
||||
month = models.ForeignKey(MonthData, on_delete=models.CASCADE)
|
||||
year = models.ForeignKey(YearData, on_delete=models.CASCADE)
|
||||
time = models.TimeField('Time')
|
||||
title = models.CharField('Title', max_length=250)
|
||||
description = models.TextField('Description', max_length=2500)
|
||||
is_suggested = models.BooleanField('IsSuggested')
|
||||
is_only_for_gm = models.BooleanField('IsOnlyForGm')
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.day}, {self.time}, {self.title})'
|
||||
|
||||
@@ -5,6 +5,13 @@ div.calendarpage {
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
h2.year {
|
||||
text-align: center;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid black;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
table.month, table.month th, table.month td {
|
||||
border: 1px solid white;
|
||||
border-collapse: collapse;
|
||||
@@ -12,13 +19,16 @@ table.month, table.month th, table.month td {
|
||||
background: gainsboro;
|
||||
}
|
||||
|
||||
table.month th {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.month td {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.month td.current {
|
||||
background: dimgrey;
|
||||
color: white;
|
||||
}
|
||||
|
||||
table.month th.subtitle {
|
||||
@@ -26,14 +36,86 @@ table.month th.subtitle {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
table.month a {
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
|
||||
table.month td.current a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
div.calendar {
|
||||
column-width: 350px;
|
||||
}
|
||||
|
||||
div.calendar-events {
|
||||
display: flex;
|
||||
flex-flow: row wrap;
|
||||
justify-content: space-around;
|
||||
}
|
||||
|
||||
div.calendar-events > p,
|
||||
div.calendar-error > p {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
table.month {
|
||||
margin: 10px;
|
||||
width: 350px;
|
||||
max-width: 350px;
|
||||
}
|
||||
|
||||
div.event,
|
||||
div.event-gm,
|
||||
div.event-suggested {
|
||||
border: 1px solid black;
|
||||
padding: 20px;
|
||||
margin: 20px;
|
||||
border-radius: 10px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.event {
|
||||
border: 1px solid black;
|
||||
}
|
||||
|
||||
div.event-gm {
|
||||
border: 2px solid BlueViolet;
|
||||
}
|
||||
|
||||
div.event-suggested {
|
||||
border: 2px solid crimson;
|
||||
}
|
||||
|
||||
div.event-time {
|
||||
border: 1px solid black;
|
||||
border-radius: 3px;
|
||||
padding: 3px 5px;
|
||||
margin-right: 15px;
|
||||
float: left;
|
||||
font-weight: bold;
|
||||
background: DeepSkyBlue;
|
||||
font-size: 150%;
|
||||
}
|
||||
|
||||
div.event-title {
|
||||
font-weight: bold;
|
||||
text-decoration: underline;
|
||||
font-size: 200%;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
p.event-description {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
p.calendar-error {
|
||||
color: crimson;
|
||||
font-size: 200%;
|
||||
}
|
||||
|
||||
p.calendar-info {
|
||||
font-size: 200%;
|
||||
}
|
||||
|
||||
@@ -1,22 +0,0 @@
|
||||
<div class="calendar">
|
||||
{% include 'faerun_calendar/month.html' with title="Хаммер" subtitle="Глубокозимье" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Зимний солнцеворот" subtitle="Мертвозимье" oneday=1 %}
|
||||
{% include 'faerun_calendar/month.html' with title="Альтурик" subtitle="Коготь зимы" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Чез" subtitle="Коготь закатов" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Тарсак" subtitle="Коготь бурь" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Зеленотравье" oneday=1 %}
|
||||
|
||||
{% include 'faerun_calendar/month.html' with title="Миртул" subtitle="Таяние" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Кайторн" subtitle="Время цветов" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Флеймрул" subtitle="Разгар лета" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Летний солнцеворот" oneday=1 %}
|
||||
{% include 'faerun_calendar/month.html' with title="Шильдмит*" oneday=1 %}
|
||||
{% include 'faerun_calendar/month.html' with title="Элесис" subtitle="Солнцестояние" %}
|
||||
|
||||
{% include 'faerun_calendar/month.html' with title="Элейнт" subtitle="Увядание" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Праздник урожая" oneday=1 %}
|
||||
{% include 'faerun_calendar/month.html' with title="Марпенот" subtitle="Листопад" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Уктар" subtitle="Перегной" %}
|
||||
{% include 'faerun_calendar/month.html' with title="Пир луны" oneday=1 %}
|
||||
{% include 'faerun_calendar/month.html' with title="Найтал" subtitle="Спячка" %}
|
||||
</div>
|
||||
@@ -12,8 +12,53 @@
|
||||
|
||||
{% block content %}
|
||||
<div class="calendarpage">
|
||||
{% if type == 'year' %}
|
||||
<h1 class="title">Календарь</h1>
|
||||
{% include 'faerun_calendar/calendar.html' %}
|
||||
<h2 class="year">Год {{year_data.number}}-й</h2>
|
||||
|
||||
<div class="calendar">
|
||||
{% for month in month_data %}
|
||||
{% if not month.is_leap_month or year_data.is_leap %}
|
||||
{% include 'faerun_calendar/month.html' with month=month calendar_data=calendar_data month_days=month_days events=events %}
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% elif type == 'day' %}
|
||||
<h1 class="title">Календарь — События</h1>
|
||||
<h2 class="year">Год {{year_data.number}}-й, {{month_data.name}}{% if not month_data.is_oneday %}, день {{day}}-й{% endif %}</h2>
|
||||
|
||||
<div class="calendar-events">
|
||||
{% if events.count == 0 %}
|
||||
<p class="calendar-info">Событий нет</p>
|
||||
{% else %}
|
||||
{% for event in events %}
|
||||
{% if event.is_suggested %}
|
||||
<div class="event-suggested">
|
||||
{% elif event.is_only_for_gm %}
|
||||
<div class="event-gm">
|
||||
{% else %}
|
||||
<div class="event">
|
||||
{% endif %}
|
||||
|
||||
<div class="event-time">{{event.time}}</div>
|
||||
<div class="event-title">{{event.title}}</div>
|
||||
<p class="event-description">{{event.description}}</p>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% elif type == 'error' %}
|
||||
<h1 class="title">Календарь — Ошибка</h1>
|
||||
|
||||
<div class="calendar-error">
|
||||
{% if error_type == 'year' %}
|
||||
<p class="calendar-error">Неверный год</p>
|
||||
{% elif error_type == 'month' %}
|
||||
<p class="calendar-error">Неверный месяц</p>
|
||||
{% elif error_type == 'day' %}
|
||||
<p class="calendar-error">Неверный день</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -1,53 +1,38 @@
|
||||
<div class="month">
|
||||
<table class="month">
|
||||
<tr>
|
||||
<th colspan="10" class="title">{{title}}</th>
|
||||
</tr>
|
||||
{% if subtitle %}
|
||||
<th colspan="10" class="subtitle">{{subtitle}}</th>
|
||||
{% endif %}
|
||||
{% if oneday != 1 %}
|
||||
<tr>
|
||||
<td>1</td>
|
||||
<td>2</td>
|
||||
<td>3</td>
|
||||
<td>4</td>
|
||||
<td>5</td>
|
||||
<td>6</td>
|
||||
<td>7</td>
|
||||
<td>8</td>
|
||||
<td>9</td>
|
||||
<td>10</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>11</td>
|
||||
<td>12</td>
|
||||
<td>13</td>
|
||||
<td>14</td>
|
||||
<td>15</td>
|
||||
<td>16</td>
|
||||
<td>17</td>
|
||||
<td>18</td>
|
||||
{% if title == "Миртул" %}
|
||||
<td class="current">19</td>
|
||||
<th colspan="10" class="title">
|
||||
{% if not month.is_oneday %}
|
||||
{{month.name}}
|
||||
{% else %}
|
||||
<td>19</td>
|
||||
<a href="{{year_data.number}}/{{month.number}}/{{1}}">{{month.name}}</a>
|
||||
{% endif %}
|
||||
</th>
|
||||
</tr>
|
||||
{% if month.folkname %}
|
||||
<th colspan="10" class="subtitle">{{month.folkname}}</th>
|
||||
{% endif %}
|
||||
|
||||
<td>20</td>
|
||||
</tr>
|
||||
{% if not month.is_oneday %}
|
||||
{% for day in month_days %}
|
||||
{% if forloop.counter0|divisibleby:10 %}
|
||||
<tr>
|
||||
<td>21</td>
|
||||
<td>22</td>
|
||||
<td>23</td>
|
||||
<td>24</td>
|
||||
<td>25</td>
|
||||
<td>26</td>
|
||||
<td>27</td>
|
||||
<td>28</td>
|
||||
<td>29</td>
|
||||
<td>30</td>
|
||||
{% endif %}
|
||||
|
||||
{% if day == calendar_data.current_day and year_data == calendar_data.current_year and month == calendar_data.current_month %}
|
||||
<td class="current">
|
||||
{% else %}
|
||||
<td>
|
||||
{% endif %}
|
||||
|
||||
<a href="{{year_data.number}}/{{month.number}}/{{day}}">{{day}}</a>
|
||||
|
||||
</td>
|
||||
|
||||
{% if forloop.counter|divisibleby:10 %}
|
||||
</tr>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
@@ -1,3 +1,43 @@
|
||||
from django.test import TestCase
|
||||
from .models import FaerunDate
|
||||
|
||||
|
||||
class FaerunDateTestCase(TestCase):
|
||||
class TestDate:
|
||||
def __init__(self, date: FaerunDate, repr: str, is_leap_year: bool, is_valid: bool):
|
||||
self.date = date
|
||||
self.repr = repr
|
||||
self.is_leap_year = is_leap_year
|
||||
self.is_valid = is_valid
|
||||
|
||||
def setUp(self):
|
||||
self.dates = (
|
||||
FaerunDateTestCase.TestDate(FaerunDate(0, 0, 0), 'FaerunDate(0, 0, 0)', False, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(1, -1, 1), 'FaerunDate(1, -1, 1)', False, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(1, 1, 1), 'FaerunDate(1, 1, 1)', False, True),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 1, 1), 'FaerunDate(4, 1, 1)', True, True),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, -1, 1), 'FaerunDate(4, -1, 1)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 0, 1), 'FaerunDate(4, 0, 1)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 19, 1), 'FaerunDate(4, 19, 1)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 1, -1), 'FaerunDate(4, 1, -1)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 1, 0), 'FaerunDate(4, 1, 0)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 1, 31), 'FaerunDate(4, 1, 31)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 2, 2), 'FaerunDate(4, 2, 2)', True, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 1, 2), 'FaerunDate(4, 1, 2)', True, True),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(1, 11, 1), 'FaerunDate(1, 11, 1)', False, False),
|
||||
FaerunDateTestCase.TestDate(FaerunDate(4, 11, 1), 'FaerunDate(4, 11, 1)', True, True),
|
||||
)
|
||||
|
||||
def test_repr(self):
|
||||
for date in self.dates:
|
||||
self.assertEqual(date.date.__repr__(), date.repr)
|
||||
|
||||
def test_leap(self):
|
||||
for date in self.dates:
|
||||
self.assertEqual(date.date.is_leap_year, date.is_leap_year, date.date.__repr__())
|
||||
|
||||
def test_valid(self):
|
||||
for date in self.dates:
|
||||
self.assertEqual(date.date.is_valid, date.is_valid, date.date.__repr__())
|
||||
|
||||
|
||||
# Create your tests here.
|
||||
|
||||
@@ -4,5 +4,7 @@ from . import views
|
||||
|
||||
urlpatterns = [
|
||||
path('', views.index, name='index'),
|
||||
path('<int:year>', views.year_page, name='index'),
|
||||
path('<int:year>/<int:month>/<int:day>', views.day_page, name='index'),
|
||||
]
|
||||
|
||||
|
||||
+106
-1
@@ -1,6 +1,111 @@
|
||||
from django.shortcuts import render
|
||||
from django.http import HttpResponseNotFound
|
||||
|
||||
from .models import YearData
|
||||
from .models import MonthData
|
||||
from .models import CalendarData
|
||||
from .models import Event
|
||||
|
||||
|
||||
def day_page(request, year: int, month: int, day: int):
|
||||
params = None
|
||||
|
||||
select_suggested = False
|
||||
select_only_for_gm = False
|
||||
|
||||
if not params:
|
||||
try:
|
||||
year_data = YearData.objects.get(number=year)
|
||||
except YearData.DoesNotExist:
|
||||
params = {'type': 'error', 'error_type': 'year'}
|
||||
|
||||
if not params:
|
||||
try:
|
||||
year_id = getattr(year_data, 'id')
|
||||
except AttributeError:
|
||||
params = {'type': 'error', 'error_type': 'year'}
|
||||
|
||||
if not params:
|
||||
try:
|
||||
month_data = MonthData.objects.get(number=month)
|
||||
except MonthData.DoesNotExist:
|
||||
params = {'type': 'error', 'error_type': 'month'}
|
||||
|
||||
if not params:
|
||||
try:
|
||||
month_id = getattr(month_data, 'id')
|
||||
except AttributeError:
|
||||
params = {'type': 'error', 'error_type': 'month'}
|
||||
|
||||
if not params:
|
||||
try:
|
||||
is_leap = getattr(year_data, 'is_leap')
|
||||
except AttributeError:
|
||||
params = {'type': 'error', 'error_type': 'year'}
|
||||
else:
|
||||
try:
|
||||
is_leap_month = getattr(month_data, 'is_leap_month')
|
||||
except AttributeError:
|
||||
params = {'type': 'error', 'error_type': 'month'}
|
||||
else:
|
||||
if not is_leap and is_leap_month:
|
||||
params = {'type': 'error', 'error_type': 'month'}
|
||||
|
||||
if not params:
|
||||
try:
|
||||
events = Event.objects.filter(year=year_id, month=month_id, day=day,
|
||||
is_suggested=select_suggested, is_only_for_gm=select_only_for_gm
|
||||
).order_by('time')
|
||||
except Event.DoesNotExist:
|
||||
params = {'type': 'error', 'error_type': 'events'}
|
||||
|
||||
if not params:
|
||||
try:
|
||||
is_oneday = getattr(month_data, 'is_oneday')
|
||||
except AttributeError:
|
||||
params = {'type': 'error', 'error_type': 'month'}
|
||||
else:
|
||||
if is_oneday and day != 1 or not 1 <= day <= 30:
|
||||
params = {'type': 'error', 'error_type': 'day'}
|
||||
|
||||
if not params:
|
||||
params = {
|
||||
'type': 'day',
|
||||
'year_data': year_data,
|
||||
'month_data': month_data,
|
||||
'day': day,
|
||||
'events': events,
|
||||
}
|
||||
|
||||
return render(request, 'faerun_calendar/index.html', params)
|
||||
|
||||
|
||||
def year_page(request, year: int):
|
||||
try:
|
||||
year_data = YearData.objects.get(number=year)
|
||||
except YearData.DoesNotExist:
|
||||
return HttpResponseNotFound('<h1>404 Not Found</h1>')
|
||||
|
||||
month_data = MonthData.objects.all()
|
||||
calendar_data = CalendarData.objects.first()
|
||||
events = Event.objects.all()
|
||||
|
||||
params = {
|
||||
'type': 'year',
|
||||
'calendar_data': calendar_data,
|
||||
'year_data': year_data,
|
||||
'month_data': month_data,
|
||||
'month_days': tuple(i+1 for i in range(30)),
|
||||
'events': events,
|
||||
}
|
||||
|
||||
return render(request, 'faerun_calendar/index.html', params)
|
||||
|
||||
|
||||
def index(request):
|
||||
return render(request, 'faerun_calendar/index.html')
|
||||
try:
|
||||
current_year = getattr(getattr(CalendarData.objects.first(), 'current_year'), 'number')
|
||||
except AttributeError:
|
||||
current_year = 0
|
||||
|
||||
return year_page(request, current_year)
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-12 13:01
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Link',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('url', models.CharField(max_length=250, verbose_name='URL')),
|
||||
('text', models.CharField(max_length=250, verbose_name='Text')),
|
||||
],
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.12 on 2022-07-12 13:39
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('links', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='link',
|
||||
name='order',
|
||||
field=models.SmallIntegerField(default=1, verbose_name='Order'),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
Reference in New Issue
Block a user