6 Commits

Author SHA1 Message Date
Sirius Nottin
a686ead3cc Mise à jour du serializer d'événements pour spécifier les champs inclus 2025-03-02 17:34:46 +01:00
Sirius Nottin
72f11eef14 supprime le commentaire 2025-03-01 23:41:36 +01:00
Sirius Nottin
b31b5cfdb5 Ajout de la pagination 2025-03-01 23:41:15 +01:00
Sirius Nottin
296476ebf4 Ajout de l'API pour les événements 2025-03-01 23:21:08 +01:00
Sirius Nottin
89904e25ab Ajout de Pygments aux dépendances de dev 2025-03-01 23:20:08 +01:00
Sirius Nottin
14cf8f6e50 Ajout de djangorestframework 2025-03-01 23:19:50 +01:00
162 changed files with 3740 additions and 1035 deletions

View File

@@ -66,7 +66,3 @@ On peut ensuite modifier le mot de passe de l'utilisateur root qui a tous les dr
* ```cp src/agenda_culturel/migrations/images/* src/media/```
### Complètement réinitialiser une instance
* ```docker compose down --rmi all --volumes```
* ```make build-dev```

View File

@@ -63,7 +63,6 @@ class EventFilter(django_filters.FilterSet):
label="À proximité de",
method="no_filter",
empty_label=_("Select a location"),
to_field_name='slug',
queryset=ReferenceLocation.objects.filter(main__gt=0).order_by("-main", "name__unaccent")
)
@@ -111,13 +110,6 @@ class EventFilter(django_filters.FilterSet):
fields = ["tags", "exclude_tags", "status", "recurrences"]
def __init__(self, *args, **kwargs):
# urls were using pk, now we moved to slug
if len(args) > 0 and "position" in args[0] and args[0]["position"].isdigit():
args[0]._mutable = True
el = ReferenceLocation.objects.filter(pk=int(args[0]["position"])).values("slug").first()
args[0]["position"] = None if el is None else el["slug"]
args[0]._mutable = False
super().__init__(*args, **kwargs)
if not kwargs["request"].user.is_authenticated:
self.form.fields.pop("status")
@@ -156,7 +148,7 @@ class EventFilter(django_filters.FilterSet):
lookup = "__".join([name, "isnull"])
return queryset.filter(**{lookup: value == "remove_recurrent"})
def no_filter(self, queryset, name, value):
def no_filter(self, queryset, name, value):
return queryset
@property
@@ -213,7 +205,7 @@ class EventFilter(django_filters.FilterSet):
return {}
except KeyError:
return {}
def get_tags(self):
return self.get_cleaned_data("tags")
@@ -320,7 +312,7 @@ class EventFilter(django_filters.FilterSet):
def get_url_add_suggested_position(self, location):
result = self.request.get_full_path()
return result + ('&' if '?' in result else '?') + 'position=' + str(location.slug) + "&radius=" + str(location.suggested_distance)
return result + ('&' if '?' in result else '?') + 'position=' + str(location.pk) + "&radius=" + str(location.suggested_distance)
class EventFilterAdmin(django_filters.FilterSet):

View File

@@ -0,0 +1,79 @@
# Generated by Django 4.2.7 on 2023-11-15 14:57
import ckeditor.fields
import colorfield.fields
from django.db import migrations, models
import django.db.models.deletion
import django_better_admin_arrayfield.models.fields
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Category name', max_length=512, verbose_name='Name')),
('alt_name', models.CharField(help_text='Alternative name used with a time period', max_length=512, verbose_name='Alternative Name')),
('codename', models.CharField(help_text='Short name of the category', max_length=3, verbose_name='Short name')),
('color', colorfield.fields.ColorField(blank=True, default=None, help_text='Color used as background for the category', image_field=None, max_length=25, null=True, samples=None, verbose_name='Color')),
],
options={
'verbose_name': 'Category',
'verbose_name_plural': 'Categories',
},
),
migrations.CreateModel(
name='EventSubmissionForm',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('url', models.URLField(help_text='URL where this event can be found.', max_length=512, verbose_name='URL')),
],
options={
'verbose_name': 'Event submission form',
'verbose_name_plural': 'Event submissions forms',
'db_table': 'eventsubmissionform',
},
),
migrations.CreateModel(
name='StaticContent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Category name', max_length=512, unique=True, verbose_name='Name')),
('text', ckeditor.fields.RichTextField(help_text='Text as shown to the visitors', verbose_name='Content')),
('url_path', models.CharField(help_text='URL path where the content is included.', verbose_name='URL path')),
],
),
migrations.CreateModel(
name='Event',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_date', models.DateTimeField(auto_now_add=True)),
('modified_date', models.DateTimeField(auto_now=True)),
('title', models.CharField(help_text='Short title', max_length=512, verbose_name='Title')),
('status', models.CharField(choices=[('published', 'Published'), ('trash', 'Trash'), ('draft', 'Draft')], default='published', max_length=20, verbose_name='Status')),
('start_day', models.DateField(help_text='Day of the event', verbose_name='Day of the event')),
('start_time', models.TimeField(blank=True, help_text='Starting time', null=True, verbose_name='Starting time')),
('end_day', models.DateField(blank=True, help_text='End day of the event, only required if different from the start day.', null=True, verbose_name='End day of the event')),
('end_time', models.TimeField(blank=True, help_text='Final time', null=True, verbose_name='Final time')),
('location', models.CharField(help_text='Address of the event', max_length=512, verbose_name='Location')),
('description', models.TextField(blank=True, help_text='General description of the event', null=True, verbose_name='Description')),
('local_image', models.ImageField(blank=True, help_text='Illustration image stored in the agenda server', max_length=1024, null=True, upload_to='', verbose_name='Illustration (local image)')),
('image', models.URLField(blank=True, help_text='URL of the illustration image', max_length=1024, null=True, verbose_name='Illustration')),
('image_alt', models.CharField(blank=True, help_text='Alternative text used by screen readers for the image', max_length=1024, null=True, verbose_name='Illustration description')),
('reference_urls', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.URLField(max_length=512), blank=True, help_text='List of all the urls where this event can be found.', null=True, size=None, verbose_name='URLs')),
('tags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that describe the event.', null=True, size=None, verbose_name='Tags')),
('category', models.ForeignKey(default=None, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category')),
],
options={
'verbose_name': 'Event',
'verbose_name_plural': 'Events',
},
),
]

View File

@@ -1,974 +0,0 @@
# Generated by Django 4.2.19 on 2025-03-02 11:46
import autoslug.fields
import ckeditor.fields
import colorfield.fields
from django.conf import settings
import django.contrib.gis.geos.point
import django.contrib.postgres.operations
from django.db import migrations, models
import django.db.models.deletion
import django.db.models.functions.text
import django_better_admin_arrayfield.models.fields
import django_ckeditor_5.fields
import django_resized.forms
import location_field.models.plain
import location_field.models.spatial
import recurrence.fields
def set_representative_from_fixed_masked(apps, cats):
# get all duplicated events
DuplicatedEvents = apps.get_model("agenda_culturel", "DuplicatedEvents")
duplicated = DuplicatedEvents.objects.all().prefetch_related('event_set')
to_update = []
for d in duplicated:
# there is no representative
d.representative = None
# except if d is fixed
if d.fixed:
# and if there is at least one non masked (should be the case)
e_not_masked = [e for e in d.event_set.all() if not e.masked]
# keep the first one
if len(e_not_masked) >= 1:
d.representative = e_not_masked[0]
to_update.append(d)
DuplicatedEvents.objects.bulk_update(to_update, fields=["representative"])
def set_fixed_masked_from_representative(apps, cats):
Event = apps.get_model("agenda_culturel", "Event")
events = Event.objects.all().prefetch_related("possibly_duplicated")
to_update = []
for e in events:
if not e.possibly_duplicated:
e.masked = False
else:
e.masked = e.possibly_duplicated.representative and e.possibly_duplicated.representative == e
to_update.append(e)
Event.objects.bulk_update(to_update, fields=["masked"])
# get all duplicated events
DuplicatedEvents = apps.get_model("agenda_culturel", "DuplicatedEvents")
duplicated = DuplicatedEvents.objects.all().prefetch_related('event_set')
# for each event
to_update = []
for d in duplicated:
d.fixed = not d.representative is None
to_update.append(d)
DuplicatedEvents.objects.bulk_update(to_update, fields=["fixed"])
def strip_place_aliases(apps, schema_editor):
Place = apps.get_model("agenda_culturel", "Place")
places = Place.objects.all()
for p in places:
if not p.aliases is None:
p.aliases = [a.strip() for a in p.aliases]
Place.objects.bulk_update(places, fields=["aliases"])
def do_nothing(apps, schema_editor):
pass
def migrate_data_slug_forward(apps, schema_editor):
Category = apps.get_model("agenda_culturel", "Category")
for instance in Category.objects.all():
print("Generating slug for %s"%instance)
instance.save() # Will trigger slug update
def migrate_data_slug_backward(apps, schema_editor):
pass
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Category',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Category name', max_length=512, verbose_name='Name')),
('color', colorfield.fields.ColorField(blank=True, default=None, help_text='Color used as background for the category', image_field=None, max_length=25, null=True, samples=None, verbose_name='Color')),
],
options={
'verbose_name': 'Category',
'verbose_name_plural': 'Categories',
},
),
migrations.CreateModel(
name='StaticContent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Category name', max_length=512, unique=True, verbose_name='Name')),
('text', ckeditor.fields.RichTextField(help_text='Text as shown to the visitors', verbose_name='Content')),
('url_path', models.CharField(help_text='URL path where the content is included.', verbose_name='URL path')),
],
),
migrations.CreateModel(
name='Message',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subject', models.CharField(help_text='The subject of your message', max_length=512, verbose_name='Subject')),
('name', models.CharField(blank=True, help_text='Your name', max_length=512, null=True, verbose_name='Name')),
('date', models.DateTimeField(auto_now_add=True)),
('closed', models.BooleanField(default=False, help_text='this message has been processed and no longer needs to be handled', verbose_name='Closed')),
('message', ckeditor.fields.RichTextField(help_text='Your message', verbose_name='Message')),
('email', models.EmailField(blank=True, help_text='Your email address', max_length=254, null=True, verbose_name='Email address')),
('comments', ckeditor.fields.RichTextField(blank=True, default='', help_text='Comments on the message from the moderation team', null=True, verbose_name='Comments')),
],
),
migrations.CreateModel(
name='BatchImportation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_date', models.DateTimeField(auto_now_add=True)),
('source', models.URLField(blank=True, help_text='URL of the source document', max_length=1024, null=True, verbose_name='Source')),
('browsable_url', models.URLField(blank=True, help_text='URL of the corresponding document that will be shown to visitors.', max_length=1024, null=True, verbose_name='Browsable url')),
('status', models.CharField(choices=[('running', 'Running'), ('canceled', 'Canceled'), ('success', 'Success'), ('failed', 'Failed')], default='running', max_length=20, verbose_name='Status')),
('error_message', models.CharField(blank=True, max_length=512, null=True, verbose_name='Error message')),
('nb_imported', models.PositiveIntegerField(default=0, verbose_name='Number of imported events')),
('nb_initial', models.PositiveIntegerField(default=0, verbose_name='Number of collected events')),
('celery_id', models.CharField(default='', max_length=128)),
('nb_removed', models.PositiveIntegerField(default=0, verbose_name='Number of removed events')),
('nb_updated', models.PositiveIntegerField(default=0, verbose_name='Number of updated events')),
],
),
migrations.CreateModel(
name='DuplicatedEvents',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
),
migrations.CreateModel(
name='Event',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_date', models.DateTimeField(editable=False)),
('modified_date', models.DateTimeField(blank=True, null=True)),
('title', models.CharField(help_text='Short title', max_length=512, verbose_name='Title')),
('status', models.CharField(choices=[('published', 'Published'), ('draft', 'Draft'), ('trash', 'Trash')], default='published', max_length=20, verbose_name='Status')),
('start_day', models.DateField(help_text='Day of the event', verbose_name='Day of the event')),
('start_time', models.TimeField(blank=True, help_text='Starting time', null=True, verbose_name='Starting time')),
('end_day', models.DateField(blank=True, help_text='End day of the event, only required if different from the start day.', null=True, verbose_name='End day of the event')),
('end_time', models.TimeField(blank=True, help_text='Final time', null=True, verbose_name='Final time')),
('location', models.CharField(help_text='Address of the event', max_length=512, verbose_name='Location')),
('description', models.TextField(blank=True, help_text='General description of the event', null=True, verbose_name='Description')),
('local_image', models.ImageField(blank=True, help_text='Illustration image stored in the agenda server', max_length=1024, null=True, upload_to='', verbose_name='Illustration (local image)')),
('image', models.URLField(blank=True, help_text='URL of the illustration image', max_length=1024, null=True, verbose_name='Illustration')),
('image_alt', models.CharField(blank=True, help_text='Alternative text used by screen readers for the image', max_length=1024, null=True, verbose_name='Illustration description')),
('reference_urls', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.URLField(max_length=512), blank=True, help_text='List of all the urls where this event can be found.', null=True, size=None, verbose_name='URLs')),
('tags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that describe the event.', null=True, size=None, verbose_name='Tags')),
('category', models.ForeignKey(default=None, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category')),
('uuids', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='UUIDs from import to detect duplicated entries.', null=True, size=None, verbose_name='UUIDs')),
('imported_date', models.DateTimeField(blank=True, null=True)),
('possibly_duplicated', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.duplicatedevents')),
],
options={
'verbose_name': 'Event',
'verbose_name_plural': 'Events',
},
),
django.contrib.postgres.operations.TrigramExtension(
),
migrations.AlterField(
model_name='event',
name='possibly_duplicated',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.duplicatedevents', verbose_name='Possibly duplicated'),
),
migrations.AddField(
model_name='event',
name='import_sources',
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='Importation source used to detect removed entries.', null=True, size=None, verbose_name='Importation source'),
),
migrations.AlterField(
model_name='event',
name='status',
field=models.CharField(choices=[('published', 'Published'), ('draft', 'Draft'), ('trash', 'Trash')], default='draft', max_length=20, verbose_name='Status'),
),
migrations.AddField(
model_name='event',
name='recurrence_dtend',
field=models.DateTimeField(blank=True, editable=False, null=True),
),
migrations.AddField(
model_name='event',
name='recurrence_dtstart',
field=models.DateTimeField(blank=True, editable=False, null=True),
),
migrations.AddField(
model_name='event',
name='recurrences',
field=recurrence.fields.RecurrenceField(blank=True, null=True, verbose_name='Recurrence'),
),
migrations.CreateModel(
name='RecurrentImport',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('processor', models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC')], default='ical', max_length=20, verbose_name='Processor')),
('recurrence', models.CharField(choices=[('daily', 'daily'), ('weekly', 'weekly')], default='daily', max_length=10, verbose_name='Import recurrence')),
('source', models.URLField(help_text='URL of the source document', max_length=1024, verbose_name='Source')),
('browsable_url', models.URLField(blank=True, help_text='URL of the corresponding document that will be shown to visitors.', max_length=1024, null=True, verbose_name='Browsable url')),
('defaultLocation', models.CharField(blank=True, help_text='Address for each imported event', max_length=512, null=True, verbose_name='Location')),
('defaultTags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that describe each imported event.', null=True, size=None, verbose_name='Tags for each imported event')),
('defaultCategory', models.ForeignKey(blank=True, default=None, help_text='Category of each imported event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category')),
('downloader', models.CharField(choices=[('simple', 'simple'), ('chromium headless', 'Headless Chromium')], default='simple', max_length=20, verbose_name='Downloader')),
('defaultPublished', models.BooleanField(default=True, help_text='Status of each imported event (published or draft)', verbose_name='Published')),
('name', models.CharField(default='', help_text='Recurrent import name', max_length=512, verbose_name='Name')),
],
),
migrations.AddField(
model_name='batchimportation',
name='recurrentImport',
field=models.ForeignKey(blank=True, editable=False, help_text='Reference to the recurrent import processing', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.recurrentimport', verbose_name='Recurrent import'),
),
migrations.RemoveField(
model_name='batchimportation',
name='browsable_url',
),
migrations.RemoveField(
model_name='batchimportation',
name='source',
),
migrations.CreateModel(
name='CategorisationRule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('weight', models.IntegerField(default=0, help_text='The lower is the weight, the earlier the filter is applied', verbose_name='Weight')),
('description_contains', models.CharField(blank=True, help_text='Text contained in the description', max_length=512, null=True, verbose_name='Contained in the description')),
('desc_exact', models.BooleanField(default=False, help_text='If checked, the extract will be searched for in the description using the exact form (capitals, accents).', verbose_name='Exact description extract')),
('title_contains', models.CharField(blank=True, help_text='Text contained in the event title', max_length=512, null=True, verbose_name='Contained in the title')),
('title_exact', models.BooleanField(default=False, help_text='If checked, the extract will be searched for in the title using the exact form (capitals, accents).', verbose_name='Exact title extract')),
('category', models.ForeignKey(help_text='Category applied to the event', on_delete=django.db.models.deletion.CASCADE, to='agenda_culturel.category', verbose_name='Category')),
],
),
migrations.AlterField(
model_name='event',
name='location',
field=models.CharField(default='', help_text='Address of the event', max_length=512, verbose_name='Location'),
),
migrations.AlterModelOptions(
name='batchimportation',
options={'permissions': [('run_batchimportation', 'Can run a batch importation')]},
),
migrations.AlterModelOptions(
name='categorisationrule',
options={'permissions': [('apply_categorisationrules', 'Apply a categorisation rule')]},
),
migrations.AlterModelOptions(
name='event',
options={'permissions': [('set_duplicated_event', 'Can set an event as duplicated')], 'verbose_name': 'Event', 'verbose_name_plural': 'Events'},
),
migrations.AlterModelOptions(
name='recurrentimport',
options={'permissions': [('run_recurrentimport', 'Can run a recurrent import')]},
),
migrations.CreateModel(
name='ModerationQuestion',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question', models.CharField(help_text='Text that will be shown to moderators', max_length=512, unique=True, verbose_name='Question')),
],
),
migrations.CreateModel(
name='ModerationAnswer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('answer', models.CharField(help_text='Text that will be shown to moderators', max_length=512, unique=True, verbose_name='Answer')),
('adds_tags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that will be added if you choose this answer.', null=True, size=None, verbose_name='Adds tags')),
('removes_tags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that will be removed if you choose this answer.', null=True, size=None, verbose_name='Removes tags')),
('description', models.ForeignKey(help_text='Associated question from moderation', on_delete=django.db.models.deletion.CASCADE, to='agenda_culturel.moderationquestion', verbose_name='Question')),
],
),
migrations.RenameField(
model_name='moderationanswer',
old_name='description',
new_name='question',
),
migrations.AlterField(
model_name='moderationanswer',
name='answer',
field=models.CharField(help_text='Text that will be shown to moderators', max_length=512, verbose_name='Answer'),
),
migrations.AlterField(
model_name='moderationanswer',
name='question',
field=models.ForeignKey(help_text='Associated question from moderation', on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='agenda_culturel.moderationquestion', verbose_name='Question'),
),
migrations.AlterModelOptions(
name='batchimportation',
options={'permissions': [('run_batchimportation', 'Can run a batch importation')], 'verbose_name': 'Batch importation', 'verbose_name_plural': 'Batch importations'},
),
migrations.AlterModelOptions(
name='categorisationrule',
options={'permissions': [('apply_categorisationrules', 'Apply a categorisation rule')], 'verbose_name': 'Categorisation rule', 'verbose_name_plural': 'Categorisation rules'},
),
migrations.AlterModelOptions(
name='message',
options={'verbose_name': 'Contact message', 'verbose_name_plural': 'Contact messages'},
),
migrations.AlterModelOptions(
name='moderationquestion',
options={'permissions': [('use_moderation_question', 'Can use a moderation question to tag an event')], 'verbose_name': 'Moderation question', 'verbose_name_plural': 'Moderation questions'},
),
migrations.AlterModelOptions(
name='recurrentimport',
options={'permissions': [('run_recurrentimport', 'Can run a recurrent import')], 'verbose_name': 'Recurrent import', 'verbose_name_plural': 'Recurrent imports'},
),
migrations.AddField(
model_name='event',
name='moderated_date',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AddField(
model_name='categorisationrule',
name='loc_exact',
field=models.BooleanField(default=False, help_text='If checked, the extract will be searched for in the location using the exact form (capitals, accents).', verbose_name='Exact location extract'),
),
migrations.AddField(
model_name='categorisationrule',
name='location_contains',
field=models.CharField(blank=True, help_text='Text contained in the event location', max_length=512, null=True, verbose_name='Contained in the location'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lephotomat', 'le photomat')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', 'la puce à loreille')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='name',
field=models.CharField(default='', help_text='Recurrent import name. Be careful to choose a name that is easy to understand, as it will be public and displayed on the sites About page.', max_length=512, verbose_name='Name'),
),
migrations.CreateModel(
name='Place',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Name of the place', verbose_name='Name')),
('address', models.CharField(help_text='Address of this place (without city name)', verbose_name='Address')),
('location', location_field.models.plain.PlainLocationField(max_length=63)),
('aliases', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='Alternative names or addresses used to match a place with the free-form location of an event.', null=True, size=None, verbose_name='Alternative names')),
('city', models.CharField(default='', help_text='City name', verbose_name='City')),
],
options={
'verbose_name': 'Place',
'verbose_name_plural': 'Places',
},
),
migrations.AlterField(
model_name='event',
name='location',
field=models.CharField(default='', help_text='Address of the event in case its not available in the already known places (free form)', max_length=512, verbose_name='Location (free form)'),
),
migrations.AddField(
model_name='event',
name='exact_location',
field=models.ForeignKey(help_text='Address of the event', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Location'),
),
migrations.AlterField(
model_name='place',
name='address',
field=models.CharField(blank=True, help_text='Address of this place (without city name)', null=True, verbose_name='Address'),
),
django.contrib.postgres.operations.UnaccentExtension(
),
migrations.AlterModelOptions(
name='duplicatedevents',
options={'verbose_name': 'Duplicated events', 'verbose_name_plural': 'Duplicated events'},
),
migrations.AlterModelOptions(
name='staticcontent',
options={'verbose_name': 'Static content', 'verbose_name_plural': 'Static contents'},
),
migrations.AlterField(
model_name='event',
name='exact_location',
field=models.ForeignKey(blank=True, help_text='Address of the event', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Location'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', 'la puce à loreille'), ('Plugin wordpress MEC', 'Plugin wordpress MEC')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterModelOptions(
name='place',
options={'ordering': ['name'], 'verbose_name': 'Place', 'verbose_name_plural': 'Places'},
),
migrations.AddField(
model_name='batchimportation',
name='url_source',
field=models.URLField(blank=True, editable=False, help_text='Source URL if no RecurrentImport is associated.', max_length=1024, null=True, verbose_name='URL (if not recurrent import)'),
),
migrations.AddField(
model_name='categorisationrule',
name='place',
field=models.ForeignKey(blank=True, help_text='Location from place', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Place'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page")], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='downloader',
field=models.CharField(choices=[('simple', 'simple'), ('chromium headless', 'Headless Chromium'), ('chromium (pause)', 'Headless Chromium (pause)')], default='simple', max_length=20, verbose_name='Downloader'),
),
migrations.AlterField(
model_name='message',
name='comments',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, default='', help_text='Comments on the message from the moderation team', null=True, verbose_name='Comments'),
),
migrations.AlterField(
model_name='message',
name='message',
field=django_ckeditor_5.fields.CKEditor5Field(help_text='Your message', verbose_name='Message'),
),
migrations.AlterField(
model_name='staticcontent',
name='text',
field=django_ckeditor_5.fields.CKEditor5Field(help_text='Text as shown to the visitors', verbose_name='Content'),
),
migrations.AlterField(
model_name='message',
name='message',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Your message', verbose_name='Message'),
),
migrations.AlterField(
model_name='staticcontent',
name='text',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Text as shown to the visitors', verbose_name='Content'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page"), ('cour3coquins', 'la cour des 3 coquins')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='event',
name='location',
field=models.CharField(blank=True, default='', help_text='Address of the event in case its not available in the already known places (free form)', max_length=512, null=True, verbose_name='Location (free form)'),
),
migrations.AddField(
model_name='category',
name='pictogram',
field=models.FileField(blank=True, help_text='Pictogram of the category (svg format)', max_length=1024, null=True, upload_to='', verbose_name='Pictogram'),
),
migrations.AddField(
model_name='category',
name='position',
field=models.IntegerField(default=0, verbose_name='Position for ordering categories'),
),
migrations.AddField(
model_name='message',
name='spam',
field=models.BooleanField(default=False, help_text='This message is a spam.', verbose_name='Spam'),
),
migrations.AddField(
model_name='place',
name='location_pt',
field=location_field.models.spatial.LocationField(default=django.contrib.gis.geos.point.Point(45.783329, 3.08333), srid=4326),
),
migrations.RemoveField(
model_name='place',
name='location',
),
migrations.RenameField(
model_name='place',
old_name='location_pt',
new_name='location',
),
migrations.AlterField(
model_name='place',
name='location',
field=location_field.models.spatial.LocationField(default=django.contrib.gis.geos.point.Point(3.08333, 45.783329), srid=4326),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.CreateModel(
name='ReferenceLocation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Name of the location', unique=True, verbose_name='Name')),
('location', location_field.models.spatial.LocationField(default=django.contrib.gis.geos.point.Point(3.08333, 45.783329), srid=4326)),
('main', models.BooleanField(default=False, help_text='This location is one of the main locations (shown first).', verbose_name='Main')),
],
options={
'verbose_name': 'Reference location',
'verbose_name_plural': 'Reference locations',
},
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins'), ('arachnee', 'Arachnée concert')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AddField(
model_name='duplicatedevents',
name='fixed',
field=models.BooleanField(blank=True, default=False, help_text='This duplicated events is fixed, ie exactly one of the listed events is not masked.', null=True, verbose_name='Fixed'),
),
migrations.AddField(
model_name='event',
name='masked',
field=models.BooleanField(blank=True, default=False, help_text='This event is masked by a duplicated version.', null=True, verbose_name='Masked'),
),
migrations.AlterField(
model_name='categorisationrule',
name='weight',
field=models.IntegerField(default=1, help_text='The lower is the weight, the earlier the filter is applied', verbose_name='Weight'),
),
migrations.CreateModel(
name='Tag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Tag name', max_length=512, verbose_name='Name')),
('description', models.TextField(blank=True, help_text='Description of the tag', null=True, verbose_name='Description')),
('principal', models.BooleanField(default=True, help_text='This tag is highlighted as a main tag for visitors, particularly in the filter.', verbose_name='Principal')),
],
),
migrations.AlterField(
model_name='tag',
name='description',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Description of the tag', null=True, verbose_name='Description'),
),
migrations.AlterField(
model_name='tag',
name='name',
field=models.CharField(help_text='Tag name', max_length=512, unique=True, verbose_name='Name'),
),
migrations.AddField(
model_name='tag',
name='category',
field=models.ForeignKey(blank=True, default=None, help_text='This tags corresponds to a sub-category of the given category', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AddField(
model_name='duplicatedevents',
name='representative',
field=models.ForeignKey(default=None, help_text='This event is the representative event of the duplicated events group', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.event', verbose_name='Representative event'),
),
migrations.RunPython(
code=set_representative_from_fixed_masked,
reverse_code=set_fixed_masked_from_representative,
),
migrations.RemoveField(
model_name='duplicatedevents',
name='fixed',
),
migrations.RemoveField(
model_name='event',
name='masked',
),
migrations.RenameField(
model_name='event',
old_name='possibly_duplicated',
new_name='other_versions',
),
migrations.AlterField(
model_name='event',
name='other_versions',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.duplicatedevents', verbose_name='Other versions'),
),
migrations.RunPython(
code=strip_place_aliases,
reverse_code=do_nothing,
),
migrations.DeleteModel(
name='ModerationAnswer',
),
migrations.DeleteModel(
name='ModerationQuestion',
),
migrations.AddField(
model_name='tag',
name='in_excluded_suggestions',
field=models.BooleanField(default=False, help_text='This tag will be part of the excluded suggestions.', verbose_name='In excluded suggestions'),
),
migrations.AddField(
model_name='tag',
name='in_included_suggestions',
field=models.BooleanField(default=False, help_text='This tag will be part of the included suggestions.', verbose_name='In included suggestions'),
),
migrations.AlterField(
model_name='referencelocation',
name='main',
field=models.IntegerField(default=0, help_text='This location is one of the main locations (shown first higher values).', verbose_name='Main'),
),
migrations.AddField(
model_name='place',
name='description',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Description of the place, including accessibility.', null=True, verbose_name='Description'),
),
migrations.RemoveField(
model_name='tag',
name='category',
),
migrations.CreateModel(
name='Organisation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Organisation name', max_length=512, unique=True, verbose_name='Name')),
('website', models.URLField(blank=True, help_text='Website of the organisation', max_length=1024, null=True, verbose_name='Website')),
('description', django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Description of the organisation.', null=True, verbose_name='Description')),
('principal_place', models.ForeignKey(blank=True, help_text='Place mainly associated with this organizer. Mainly used if there is a similarity in the name, to avoid redundant displays.', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Principal place')),
],
options={
'verbose_name': 'Organisation',
'verbose_name_plural': 'Organisations',
},
),
migrations.AddField(
model_name='recurrentimport',
name='defaultOrganiser',
field=models.ForeignKey(blank=True, default=None, help_text='Organiser of each imported event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.organisation', verbose_name='Organiser'),
),
migrations.AddField(
model_name='event',
name='organisers',
field=models.ManyToManyField(blank=True, help_text='list of event organisers. Organizers will only be displayed if one of them does not normally use the venue.', related_name='organised_events', to='agenda_culturel.organisation', verbose_name='Organisers'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['start_day', 'start_time'], name='agenda_cult_start_d_68ab5f_idx'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(models.F('start_time'), django.db.models.functions.text.Lower('title'), name='start_time title'),
),
migrations.AlterModelOptions(
name='tag',
options={'verbose_name': 'Étiquette', 'verbose_name_plural': 'Étiquettes'},
),
migrations.AddIndex(
model_name='category',
index=models.Index(fields=['name'], name='agenda_cult_name_28aa03_idx'),
),
migrations.AddIndex(
model_name='referencelocation',
index=models.Index(fields=['name'], name='agenda_cult_name_76f079_idx'),
),
migrations.AddIndex(
model_name='staticcontent',
index=models.Index(fields=['name'], name='agenda_cult_name_fe4995_idx'),
),
migrations.AddIndex(
model_name='tag',
index=models.Index(fields=['name'], name='agenda_cult_name_9c9c74_idx'),
),
migrations.AlterModelOptions(
name='tag',
options={'verbose_name': 'Tag', 'verbose_name_plural': 'Tags'},
),
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AlterField(
model_name='event',
name='description',
field=models.TextField(blank=True, null=True, verbose_name='Description'),
),
migrations.AlterField(
model_name='event',
name='end_day',
field=models.DateField(blank=True, null=True, verbose_name='End day'),
),
migrations.AlterField(
model_name='event',
name='end_time',
field=models.TimeField(blank=True, null=True, verbose_name='End time'),
),
migrations.AlterField(
model_name='event',
name='exact_location',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Location'),
),
migrations.AlterField(
model_name='event',
name='image',
field=models.URLField(blank=True, help_text='External URL of the illustration image', max_length=1024, null=True, verbose_name='Illustration (URL)'),
),
migrations.AlterField(
model_name='event',
name='local_image',
field=models.ImageField(blank=True, max_length=1024, null=True, upload_to='', verbose_name='Illustration'),
),
migrations.AlterField(
model_name='event',
name='start_day',
field=models.DateField(verbose_name='Start day'),
),
migrations.AlterField(
model_name='event',
name='start_time',
field=models.TimeField(blank=True, null=True, verbose_name='Start time'),
),
migrations.AlterField(
model_name='event',
name='tags',
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, null=True, size=None, verbose_name='Tags'),
),
migrations.AlterField(
model_name='event',
name='title',
field=models.CharField(max_length=512, verbose_name='Title'),
),
migrations.AddField(
model_name='referencelocation',
name='suggested_distance',
field=models.IntegerField(default=None, help_text='If this distance is given, this location is part of the suggested filters.', null=True, verbose_name='Suggested distance (km)'),
),
migrations.AddField(
model_name='message',
name='related_event',
field=models.ForeignKey(default=None, help_text='The message is associated with this event.', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.event', verbose_name='Related event'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AddField(
model_name='event',
name='created_by_user',
field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='created_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the event creation'),
),
migrations.AddField(
model_name='event',
name='imported_by_user',
field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='imported_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the last importation'),
),
migrations.AddField(
model_name='event',
name='moderated_by_user',
field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='moderated_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the last moderation'),
),
migrations.AddField(
model_name='event',
name='modified_by_user',
field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='modified_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the last modification'),
),
migrations.AddField(
model_name='place',
name='postcode',
field=models.CharField(blank=True, help_text='The post code is not displayed, but makes it easier to find an address when you enter it.', null=True, verbose_name='Postcode'),
),
migrations.AlterModelOptions(
name='message',
options={'verbose_name': 'Message', 'verbose_name_plural': 'Messages'},
),
migrations.AddField(
model_name='message',
name='user',
field=models.ForeignKey(default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to=settings.AUTH_USER_MODEL, verbose_name='Author of the message'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['end_day', 'end_time'], name='agenda_cult_end_day_4660a5_idx'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['status'], name='agenda_cult_status_893243_idx'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['recurrence_dtstart', 'recurrence_dtend'], name='agenda_cult_recurre_a8911c_idx'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(models.F('start_time'), models.F('start_day'), models.F('end_day'), models.F('end_time'), django.db.models.functions.text.Lower('title'), name='datetimes title'),
),
migrations.AddIndex(
model_name='batchimportation',
index=models.Index(fields=['created_date'], name='agenda_cult_created_a23990_idx'),
),
migrations.AddIndex(
model_name='batchimportation',
index=models.Index(fields=['status'], name='agenda_cult_status_54b205_idx'),
),
migrations.AddIndex(
model_name='batchimportation',
index=models.Index(fields=['created_date', 'recurrentImport'], name='agenda_cult_created_0296e4_idx'),
),
migrations.AddIndex(
model_name='duplicatedevents',
index=models.Index(fields=['representative'], name='agenda_cult_represe_9a4fa2_idx'),
),
migrations.AddIndex(
model_name='message',
index=models.Index(fields=['related_event'], name='agenda_cult_related_79de3c_idx'),
),
migrations.AddIndex(
model_name='message',
index=models.Index(fields=['user'], name='agenda_cult_user_id_42dc88_idx'),
),
migrations.AddIndex(
model_name='message',
index=models.Index(fields=['date'], name='agenda_cult_date_049c71_idx'),
),
migrations.AddIndex(
model_name='message',
index=models.Index(fields=['spam', 'closed'], name='agenda_cult_spam_22f9b3_idx'),
),
migrations.AddIndex(
model_name='place',
index=models.Index(fields=['name'], name='agenda_cult_name_222846_idx'),
),
migrations.AddIndex(
model_name='place',
index=models.Index(fields=['city'], name='agenda_cult_city_156dc7_idx'),
),
migrations.AddIndex(
model_name='place',
index=models.Index(fields=['location'], name='agenda_cult_locatio_6f3c05_idx'),
),
migrations.AddField(
model_name='recurrentimport',
name='forceLocation',
field=models.BooleanField(default=False, help_text='force location even if another is detected.', verbose_name='Force location'),
),
migrations.AddField(
model_name='message',
name='message_type',
field=models.CharField(choices=[('from_contributor', 'From contributor'), ('import_process', 'Import process'), ('contact_form', 'Contact form'), ('event_report', 'Event report'), ('from_contrib_no_msg', 'From contributor (without message)')], default=None, max_length=20, null=True, verbose_name='Type'),
),
migrations.AlterField(
model_name='event',
name='reference_urls',
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.URLField(max_length=512), blank=True, null=True, size=None, verbose_name='Online sources or ticketing'),
),
migrations.AlterField(
model_name='tag',
name='principal',
field=models.BooleanField(default=False, help_text='This tag is highlighted as a main tag for visitors, particularly in the filter.', verbose_name='Principal'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme'), ('iguana', 'Agenda iguana (médiathèques)')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AddField(
model_name='category',
name='slug',
field=autoslug.fields.AutoSlugField(default=None, editable=False, null=True, populate_from='name', unique=True),
),
migrations.RunPython(
code=migrate_data_slug_forward,
reverse_code=migrate_data_slug_backward,
),
migrations.AlterField(
model_name='message',
name='message_type',
field=models.CharField(choices=[('from_contributor', 'From contributor'), ('import_process', 'Import process'), ('update_process', 'Update process'), ('contact_form', 'Contact form'), ('event_report', 'Event report'), ('from_contrib_no_msg', 'From contributor (without message)')], default=None, max_length=20, null=True, verbose_name='Type'),
),
migrations.AlterField(
model_name='message',
name='message_type',
field=models.CharField(choices=[('from_contributor', 'From contributor'), ('import_process', 'Import process'), ('update_process', 'Update process'), ('contact_form', 'Contact form'), ('event_report', 'Event report'), ('from_contrib_no_msg', 'From contributor (without message)'), ('warning', 'Warning')], default=None, max_length=20, null=True, verbose_name='Type'),
),
migrations.AlterField(
model_name='event',
name='created_by_user',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='created_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the event creation'),
),
migrations.AlterField(
model_name='event',
name='imported_by_user',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='imported_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the last importation'),
),
migrations.AlterField(
model_name='event',
name='moderated_by_user',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='moderated_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the last moderation'),
),
migrations.AlterField(
model_name='event',
name='modified_by_user',
field=models.ForeignKey(blank=True, default=None, null=True, on_delete=django.db.models.deletion.SET_DEFAULT, related_name='modified_events', to=settings.AUTH_USER_MODEL, verbose_name='Author of the last modification'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('Billetterie CF', 'Billetterie Clermont-Ferrand'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme'), ('iguana', 'Agenda iguana (médiathèques)')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('Billetterie CF', 'Billetterie Clermont-Ferrand'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme'), ('iguana', 'Agenda iguana (médiathèques)'), ('Mille formes', 'Mille formes')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AddIndex(
model_name='event',
index=models.Index(fields=['recurrences'], name='agenda_cult_recurre_5c5094_idx'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('Billetterie CF', 'Billetterie Clermont-Ferrand'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme'), ('iguana', 'Agenda iguana (médiathèques)'), ('Mille formes', 'Mille formes'), ('Amis cerises', 'Les Amis du Temps des Cerises')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('Billetterie CF', 'Billetterie Clermont-Ferrand'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme'), ('iguana', 'Agenda iguana (médiathèques)'), ('Mille formes', 'Mille formes'), ('Amis cerises', 'Les Amis du Temps des Cerises'), ('Mobilizon', 'Mobilizon')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='recurrentimport',
name='source',
field=models.URLField(help_text='URL of the source document', max_length=1024, unique=True, verbose_name='Source'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('ical naive tz', 'ical naive timezone'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('Billetterie CF', 'Billetterie Clermont-Ferrand'), ('arachnee', 'Arachnée concert'), ('rio', 'Le Rio'), ('raymonde', 'La Raymonde'), ('apidae', 'Agenda apidae tourisme'), ('iguana', 'Agenda iguana (médiathèques)'), ('Mille formes', 'Mille formes'), ('Amis cerises', 'Les Amis du Temps des Cerises'), ('Mobilizon', 'Mobilizon')], default='ical', max_length=20, verbose_name='Processor'),
),
migrations.AlterField(
model_name='event',
name='local_image',
field=django_resized.forms.ResizedImageField(blank=True, crop=None, force_format='JPEG', keep_meta=True, max_length=1024, null=True, quality=75, scale=0.5, size=[900, None], upload_to='', verbose_name='Illustration'),
),
migrations.AlterField(
model_name='place',
name='city',
field=models.CharField(help_text='City name', verbose_name='City'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-11-15 14:59
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=1, help_text='Category of the event', on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-11-15 15:26
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0002_alter_event_category'),
]
operations = [
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=None, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-11-15 15:38
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0003_alter_event_category'),
]
operations = [
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=1, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,16 @@
# Generated by Django 4.2.7 on 2023-11-26 12:16
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0004_alter_event_category'),
]
operations = [
migrations.DeleteModel(
name='EventSubmissionForm',
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2023-12-12 19:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0005_delete_eventsubmissionform'),
]
operations = [
migrations.AlterField(
model_name='event',
name='status',
field=models.CharField(choices=[('published', 'Published'), ('draft', 'Draft'), ('trash', 'Trash')], default='published', max_length=20, verbose_name='Status'),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.7 on 2023-12-16 18:06
import ckeditor.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0006_alter_event_status'),
]
operations = [
migrations.CreateModel(
name='ContactMessage',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('subject', models.CharField(help_text='The subject of your message', max_length=512, verbose_name='Subject')),
('name', models.CharField(blank=True, help_text='Your name', max_length=512, null=True, verbose_name='Name')),
('author', models.EmailField(blank=True, help_text='Your email address', max_length=254, null=True, verbose_name='Email address')),
('date', models.DateTimeField(auto_now_add=True)),
('closed', models.BooleanField(default=False, help_text='this message has been processed and no longer needs to be handled', verbose_name='Closed')),
('message', ckeditor.fields.RichTextField(default='', help_text='Comments on the message from the modaration team', verbose_name='Comments')),
],
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.7 on 2023-12-16 18:33
import ckeditor.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0007_contactmessage'),
]
operations = [
migrations.RemoveField(
model_name='contactmessage',
name='author',
),
migrations.AddField(
model_name='contactmessage',
name='email',
field=models.EmailField(blank=True, help_text='Your email address', max_length=254, null=True, verbose_name='Email address'),
),
migrations.AlterField(
model_name='contactmessage',
name='message',
field=ckeditor.fields.RichTextField(default='', help_text='Comments on the message from the moderation team', verbose_name='Comments'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.7 on 2023-12-16 18:35
import ckeditor.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0008_remove_contactmessage_author_contactmessage_email_and_more'),
]
operations = [
migrations.AddField(
model_name='contactmessage',
name='comments',
field=ckeditor.fields.RichTextField(default='', help_text='Comments on the message from the moderation team', verbose_name='Comments'),
),
migrations.AlterField(
model_name='contactmessage',
name='message',
field=ckeditor.fields.RichTextField(help_text='Your message', verbose_name='Message'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-12-16 19:54
import ckeditor.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0009_contactmessage_comments_alter_contactmessage_message'),
]
operations = [
migrations.AlterField(
model_name='contactmessage',
name='comments',
field=ckeditor.fields.RichTextField(blank=True, default='', help_text='Comments on the message from the moderation team', null=True, verbose_name='Comments'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.7 on 2023-12-23 08:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0010_alter_contactmessage_comments'),
]
operations = [
migrations.CreateModel(
name='BatchImportation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_date', models.DateTimeField(auto_now_add=True)),
('source', models.URLField(blank=True, help_text='URL of the source document', max_length=1024, null=True, verbose_name='Source')),
('browsable_url', models.URLField(blank=True, help_text='URL of the corresponding document that will be shown to visitors.', max_length=1024, null=True, verbose_name='Browsable url')),
('running', models.BooleanField(default=True, help_text='This batch importation is still running', verbose_name='Running')),
('success', models.BooleanField(default=False, help_text='This batch importation successfully finished', verbose_name='Success')),
],
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.7 on 2023-12-23 08:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0011_batchimportation'),
]
operations = [
migrations.RemoveField(
model_name='batchimportation',
name='running',
),
migrations.RemoveField(
model_name='batchimportation',
name='success',
),
migrations.AddField(
model_name='batchimportation',
name='status',
field=models.CharField(choices=[('running', 'Running'), ('canceled', 'Canceled'), ('success', 'Success'), ('failed', 'Failed')], default='running', max_length=20, verbose_name='Status'),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.7 on 2023-12-23 10:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0012_remove_batchimportation_running_and_more'),
]
operations = [
migrations.AddField(
model_name='batchimportation',
name='error_message',
field=models.CharField(blank=True, max_length=512, null=True, verbose_name='Error message'),
),
migrations.AddField(
model_name='batchimportation',
name='nb_imported',
field=models.PositiveIntegerField(default=0, verbose_name='Number of imported events'),
),
migrations.AddField(
model_name='batchimportation',
name='nb_initial',
field=models.PositiveIntegerField(default=0, verbose_name='Number of collected events'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2023-12-23 11:06
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0013_batchimportation_error_message_and_more'),
]
operations = [
migrations.AddField(
model_name='batchimportation',
name='celery_id',
field=models.CharField(default='', max_length=128),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-12-23 11:58
from django.db import migrations, models
import django_better_admin_arrayfield.models.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0014_batchimportation_celery_id'),
]
operations = [
migrations.AddField(
model_name='event',
name='uuids',
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='UUIDs from import to detect duplicated entries.', null=True, size=None, verbose_name='UUIDs'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2023-12-23 12:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0015_event_uuids'),
]
operations = [
migrations.AddField(
model_name='batchimportation',
name='nb_removed',
field=models.PositiveIntegerField(default=0, verbose_name='Number of removed events'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2023-12-23 13:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0016_batchimportation_nb_removed'),
]
operations = [
migrations.AddField(
model_name='batchimportation',
name='nb_updated',
field=models.PositiveIntegerField(default=0, verbose_name='Number of updated events'),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.7 on 2023-12-23 13:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0017_batchimportation_nb_updated'),
]
operations = [
migrations.AddField(
model_name='event',
name='imported_date',
field=models.DateTimeField(blank=True, null=True),
),
migrations.AlterField(
model_name='event',
name='created_date',
field=models.DateTimeField(editable=False),
),
migrations.AlterField(
model_name='event',
name='modified_date',
field=models.DateTimeField(blank=True, null=True),
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.7 on 2023-12-29 11:44
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0018_event_imported_date_alter_event_created_date_and_more'),
]
operations = [
migrations.CreateModel(
name='DuplicatedEvents',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
],
),
migrations.AddField(
model_name='event',
name='possibly_duplicated',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.duplicatedevents'),
),
]

View File

@@ -0,0 +1,11 @@
from django.db import migrations
from django.contrib.postgres.operations import TrigramExtension
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0019_duplicatedevents_event_possibly_duplicated'),
]
operations = [TrigramExtension()]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-12-30 12:32
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0020_trigram_extension'),
]
operations = [
migrations.AlterField(
model_name='event',
name='possibly_duplicated',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.duplicatedevents', verbose_name='Possibly duplicated'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2023-12-31 20:06
from django.db import migrations, models
import django_better_admin_arrayfield.models.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0021_alter_event_possibly_duplicated'),
]
operations = [
migrations.AddField(
model_name='event',
name='import_sources',
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='Importation source used to detect removed entries.', null=True, size=None, verbose_name='Importation source'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-01-02 10:13
from django.db import migrations
import recurrence.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0022_event_import_sources'),
]
operations = [
migrations.AddField(
model_name='event',
name='recurrences',
field=recurrence.fields.RecurrenceField(blank=True, null=True),
),
]

View File

@@ -0,0 +1,28 @@
# Generated by Django 4.2.7 on 2024-01-04 18:58
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0023_event_recurrences'),
]
operations = [
migrations.AddField(
model_name='event',
name='dtend',
field=models.DateTimeField(blank=True, editable=False, null=True),
),
migrations.AddField(
model_name='event',
name='dtstart',
field=models.DateTimeField(blank=True, editable=False, null=True),
),
migrations.AlterField(
model_name='event',
name='status',
field=models.CharField(choices=[('published', 'Published'), ('draft', 'Draft'), ('trash', 'Trash')], default='draft', max_length=20, verbose_name='Status'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.7 on 2024-01-04 19:35
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0024_event_dtend_event_dtstart_alter_event_status'),
]
operations = [
migrations.RenameField(
model_name='event',
old_name='dtend',
new_name='recurrence_dtend',
),
migrations.RenameField(
model_name='event',
old_name='dtstart',
new_name='recurrence_dtstart',
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-01-05 15:23
from django.db import migrations
import recurrence.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0025_rename_dtend_event_recurrence_dtend_and_more'),
]
operations = [
migrations.AlterField(
model_name='event',
name='recurrences',
field=recurrence.fields.RecurrenceField(blank=True, null=True, verbose_name='Recurrence'),
),
]

View File

@@ -0,0 +1,24 @@
from django.db import migrations
def forwards_func(apps, schema_editor):
pass
#Event = apps.get_model("agenda_culturel", "Event")
#db_alias = schema_editor.connection.alias
#events = Event.objects.filter(recurrence_dtstart__isnull=True)
#for e in events:
# e.update_recurrence_dtstartend()
#Event.objects.bulk_update(events, ["recurrence_dtstart", "recurrence_dtend"])
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0026_alter_event_recurrences'),
]
operations = [
migrations.RunPython(forwards_func, reverse_code=forwards_func),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.7 on 2024-01-20 15:59
from django.db import migrations, models
import django.db.models.deletion
import django_better_admin_arrayfield.models.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0027_set_dtstart_dtend'),
]
operations = [
migrations.CreateModel(
name='RecurrentImport',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('processor', models.CharField(choices=[('ical', 'ical')], default='ical', max_length=20, verbose_name='Processor')),
('recurrence', models.CharField(choices=[('daily', 'daily'), ('weekly', 'weekly')], default='daily', max_length=10, verbose_name='Import recurrence')),
('source', models.URLField(help_text='URL of the source document', max_length=1024, verbose_name='Source')),
('browsable_url', models.URLField(blank=True, help_text='URL of the corresponding document that will be shown to visitors.', max_length=1024, null=True, verbose_name='Browsable url')),
('defaultLocation', models.CharField(blank=True, help_text='Address for each imported event', max_length=512, null=True, verbose_name='Location')),
('defaultTags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that describe each imported event.', null=True, size=None, verbose_name='Tags for each imported event')),
('defaultCategory', models.ForeignKey(blank=True, help_text='Category of each imported event', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.category', verbose_name='Category')),
],
),
migrations.AddField(
model_name='batchimportation',
name='recurrentImport',
field=models.ForeignKey(blank=True, editable=False, help_text='Reference to the recurrent import processing', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.recurrentimport', verbose_name='Recurrent import'),
),
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.7 on 2024-01-25 21:37
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0028_recurrentimport_batchimportation_recurrentimport'),
]
operations = [
migrations.RemoveField(
model_name='batchimportation',
name='browsable_url',
),
migrations.RemoveField(
model_name='batchimportation',
name='source',
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-01-26 10:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0029_remove_batchimportation_browsable_url_and_more'),
]
operations = [
migrations.AddField(
model_name='recurrentimport',
name='downloader',
field=models.CharField(choices=[('simple', 'simple'), ('chromium headless', 'Headless Chromium')], default='simple', max_length=20, verbose_name='Downloader'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-01-26 12:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0030_recurrentimport_downloader'),
]
operations = [
migrations.AddField(
model_name='recurrentimport',
name='defaultPublished',
field=models.BooleanField(default=True, help_text='Status of each imported event (published or draft)', verbose_name='Published'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.7 on 2024-02-17 08:45
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0031_recurrentimport_defaultpublished'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='defaultCategory',
field=models.ForeignKey(default=1, help_text='Category of each imported event', on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.7 on 2024-02-17 10:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0032_alter_recurrentimport_defaultcategory_and_more'),
]
operations = [
migrations.CreateModel(
name='CategorisationRule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('weight', models.IntegerField(default=0, help_text='The lower is the weight, the earlier the filter is applied', verbose_name='Weight')),
('description_contains', models.CharField(blank=True, help_text='Text contained in the description', max_length=512, null=True, verbose_name='Contained in the description')),
('desc_exact', models.BooleanField(default=False, help_text='If checked, the extract will be searched for in the description using the exact form (capitals, accents).', verbose_name='Exact description extract')),
('title_contains', models.CharField(blank=True, help_text='Text contained in the event title', max_length=512, null=True, verbose_name='Contained in the title')),
('title_exact', models.BooleanField(default=False, help_text='If checked, the extract will be searched for in the title using the exact form (capitals, accents).', verbose_name='Exact title extract')),
('category', models.ForeignKey(help_text='Category applied to the event', on_delete=django.db.models.deletion.CASCADE, to='agenda_culturel.category', verbose_name='Category')),
],
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-02-17 14:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0033_categorisationrule'),
]
operations = [
migrations.AddField(
model_name='recurrentimport',
name='name',
field=models.CharField(default='', help_text='Recurrent import name', max_length=512, verbose_name='Name'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-02-17 14:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0034_recurrentimport_name'),
]
operations = [
migrations.AlterField(
model_name='event',
name='location',
field=models.CharField(default='', help_text='Address of the event', max_length=512, verbose_name='Location'),
),
]

View File

@@ -0,0 +1,30 @@
# Create groups for several tasks
from django.db import migrations
from django.contrib.auth.models import Group
def groups_permissions_creation(apps, schema_editor):
user_roles = ["Automation Manager", "Q&A Manager", "Receptionist"]
for name in user_roles:
Group.objects.create(name=name)
def groups_permissions_deletion(apps, schema_editor):
user_roles = ["Automation Manager", "Q&A Manager", "Receptionist"]
for name in user_roles:
Group.objects.filter(name=name).delete()
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0035_alter_event_location'),
]
operations = [
migrations.RunPython(groups_permissions_creation, reverse_code=groups_permissions_deletion),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 4.2.7 on 2024-03-31 16:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0036_auto_20240331_1421'),
]
operations = [
migrations.AlterModelOptions(
name='batchimportation',
options={'permissions': [('run_batchimportation', 'Can run a batch importation')]},
),
migrations.AlterModelOptions(
name='categorisationrule',
options={'permissions': [('apply_categorisationrules', 'Apply a categorisation rule')]},
),
migrations.AlterModelOptions(
name='event',
options={'permissions': [('set_duplicated_event', 'Can set an event as duplicated')], 'verbose_name': 'Event', 'verbose_name_plural': 'Events'},
),
migrations.AlterModelOptions(
name='recurrentimport',
options={'permissions': [('run_recurrentimport', 'Can run a recurrent import')]},
),
]

View File

@@ -0,0 +1,50 @@
# Generated by Django 4.2.7 on 2024-03-31 16:15
from django.db import migrations
from django.contrib.auth.models import Group, Permission
def update_groups_permissions(apps, schema_editor):
# first add a missing role
user_roles = ["Moderator"]
for name in user_roles:
Group.objects.create(name=name)
all_perms = Permission.objects.all()
# set permissions for moderators
moderator_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['event', 'duplicatedevents']]
Group.objects.get(name="Moderator").permissions.add(*moderator_perms)
read_mod_perms = [i for i in moderator_perms if i.codename.startswith('view_')]
# set permissions for automation managers
automanager_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['batchimportation', 'recurrentimport', 'categorisationrule']]
Group.objects.get(name="Automation Manager").permissions.add(*automanager_perms)
Group.objects.get(name="Automation Manager").permissions.add(*read_mod_perms)
# set permissions for receptionists
receptionist_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['contactmessage']]
Group.objects.get(name="Receptionist").permissions.add(*receptionist_perms)
Group.objects.get(name="Receptionist").permissions.add(*read_mod_perms)
def update_groups_delete(apps, schema_editor):
user_roles = ["Moderator"]
for name in user_roles:
Group.objects.filter(name=name).delete()
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0037_alter_batchimportation_options_and_more'),
]
operations = [
migrations.RunPython(update_groups_permissions, reverse_code=update_groups_delete),
]

View File

@@ -0,0 +1,34 @@
# Generated by Django 4.2.7 on 2024-04-01 14:28
from django.db import migrations, models
import django.db.models.deletion
import django_better_admin_arrayfield.models.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0038_auto_20240331_1815'),
]
operations = [
migrations.CreateModel(
name='ModerationQuestion',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('question', models.CharField(help_text='Text that will be shown to moderators', max_length=512, unique=True, verbose_name='Question')),
],
),
migrations.CreateModel(
name='ModerationAnswer',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('answer', models.CharField(help_text='Text that will be shown to moderators', max_length=512, unique=True, verbose_name='Answer')),
('adds_tags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that will be added if you choose this answer.', null=True, size=None, verbose_name='Adds tags')),
('removes_tags', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=64), blank=True, help_text='A list of tags that will be removed if you choose this answer.', null=True, size=None, verbose_name='Removes tags')),
('description', models.ForeignKey(help_text='Associated question from moderation', on_delete=django.db.models.deletion.CASCADE, to='agenda_culturel.moderationquestion', verbose_name='Question')),
],
),
]

View File

@@ -0,0 +1,30 @@
# Generated by Django 4.2.7 on 2024-04-03 17:24
from django.db import migrations
from django.contrib.auth.models import Group, Permission
def update_groups_permissions(apps, schema_editor):
all_perms = Permission.objects.all()
moderator_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['event', 'duplicatedevents']]
read_mod_perms = [i for i in moderator_perms if i.codename.startswith('view_')]
# set permissions for receptionists
qanda_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['moderationquestion', 'moderationanswer']]
Group.objects.get(name="Q&A Manager").permissions.add(*qanda_perms)
Group.objects.get(name="Q&A Manager").permissions.add(*read_mod_perms)
def no_permission_change(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0039_moderationquestion_moderationanswer'),
]
operations = [
migrations.RunPython(update_groups_permissions, reverse_code=no_permission_change),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-03 20:01
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0040_auto_20240403_1924'),
]
operations = [
migrations.RenameField(
model_name='moderationanswer',
old_name='description',
new_name='question',
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-03 21:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0041_rename_description_moderationanswer_question'),
]
operations = [
migrations.AlterField(
model_name='moderationanswer',
name='answer',
field=models.CharField(help_text='Text that will be shown to moderators', max_length=512, verbose_name='Answer'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-04-03 21:14
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0042_alter_moderationanswer_answer'),
]
operations = [
migrations.AlterField(
model_name='moderationanswer',
name='question',
field=models.ForeignKey(help_text='Associated question from moderation', on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='agenda_culturel.moderationquestion', verbose_name='Question'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.7 on 2024-04-05 17:39
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0043_alter_moderationanswer_question'),
]
operations = [
migrations.AlterModelOptions(
name='batchimportation',
options={'permissions': [('run_batchimportation', 'Can run a batch importation')], 'verbose_name': 'Batch importation', 'verbose_name_plural': 'Batch importations'},
),
migrations.AlterModelOptions(
name='categorisationrule',
options={'permissions': [('apply_categorisationrules', 'Apply a categorisation rule')], 'verbose_name': 'Categorisation rule', 'verbose_name_plural': 'Categorisation rules'},
),
migrations.AlterModelOptions(
name='contactmessage',
options={'verbose_name': 'Contact message', 'verbose_name_plural': 'Contact messages'},
),
migrations.AlterModelOptions(
name='moderationquestion',
options={'permissions': [('use_moderation_question', 'Can use a moderation question to tag an event')], 'verbose_name': 'Moderation question', 'verbose_name_plural': 'Moderation questions'},
),
migrations.AlterModelOptions(
name='recurrentimport',
options={'permissions': [('run_recurrentimport', 'Can run a recurrent import')], 'verbose_name': 'Recurrent import', 'verbose_name_plural': 'Recurrent imports'},
),
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 4.2.7 on 2024-04-05 17:41
from django.db import migrations
from django.contrib.auth.models import Group, Permission
def update_groups_permissions(apps, schema_editor):
all_perms = Permission.objects.all()
# set permissions for moderators
mod_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model == 'moderationquestion' and i.codename.startswith('use_')]
Group.objects.get(name="Moderator").permissions.add(*mod_perms)
def no_permission_change(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0044_alter_batchimportation_options_and_more'),
]
operations = [
migrations.RunPython(update_groups_permissions, reverse_code=no_permission_change),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-13 09:25
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0045_auto_20240405_1941'),
]
operations = [
migrations.AddField(
model_name='event',
name='moderated_date',
field=models.DateTimeField(blank=True, null=True),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.7 on 2024-04-16 11:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0046_event_moderated_date'),
]
operations = [
migrations.AddField(
model_name='categorisationrule',
name='loc_exact',
field=models.BooleanField(default=False, help_text='If checked, the extract will be searched for in the location using the exact form (capitals, accents).', verbose_name='Exact location extract'),
),
migrations.AddField(
model_name='categorisationrule',
name='location_contains',
field=models.CharField(blank=True, help_text='Text contained in the event location', max_length=512, null=True, verbose_name='Contained in the location'),
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.7 on 2024-04-17 10:12
from django.db import migrations
from django.contrib.auth.models import Group, Permission
def update_groups_permissions(apps, schema_editor):
# first add a missing role
user_roles = ["Static content editor"]
for name in user_roles:
Group.objects.create(name=name)
all_perms = Permission.objects.all()
# set permissions for moderators
editor_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model == 'staticcontent']
Group.objects.get(name="Static content editor").permissions.add(*editor_perms)
def update_groups_delete(apps, schema_editor):
user_roles = ["Static content editor"]
for name in user_roles:
Group.objects.filter(name=name).delete()
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0047_categorisationrule_loc_exact_and_more'),
]
operations = [
migrations.RunPython(update_groups_permissions, reverse_code=update_groups_delete),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-19 12:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0048_auto_20240417_1212'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-19 21:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0049_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-20 10:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0050_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lephotomat', 'le photomat')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,13 @@
# Generated by Django 4.2.7 on 2024-04-20 11:53
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0051_alter_recurrentimport_processor'),
]
operations = [
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-20 11:53
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0052_auto_20240420_1353'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-20 13:51
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0053_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', 'la puce à loreille')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-22 09:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0054_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='name',
field=models.CharField(default='', help_text='Recurrent import name. Be careful to choose a name that is easy to understand, as it will be public and displayed on the sites About page.', max_length=512, verbose_name='Name'),
),
]

View File

@@ -0,0 +1,40 @@
# Generated by Django 4.2.7 on 2024-04-26 14:24
from django.db import migrations, models
import django.db.models.deletion
import django_better_admin_arrayfield.models.fields
import location_field.models.plain
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0055_alter_recurrentimport_name'),
]
operations = [
migrations.CreateModel(
name='Place',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Name of the place', verbose_name='Name')),
('address', models.CharField(help_text='Address of this place', verbose_name='Address')),
('location', location_field.models.plain.PlainLocationField(max_length=63)),
('aliases', django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='Alternative names or addresses used to match a place with a description form an event.', null=True, size=None, verbose_name='Alternative names')),
],
options={
'verbose_name': 'Place',
'verbose_name_plural': 'Places',
},
),
migrations.AlterField(
model_name='event',
name='location',
field=models.CharField(default='', help_text='Address of the event in case its not available in the already known places (free form)', max_length=512, verbose_name='Location (free form)'),
),
migrations.AddField(
model_name='event',
name='exact_location',
field=models.ForeignKey(help_text='Address of the event', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Location'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-04-27 07:44
from django.db import migrations, models
import django_better_admin_arrayfield.models.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0056_place_alter_event_location_event_exact_location'),
]
operations = [
migrations.AlterField(
model_name='place',
name='aliases',
field=django_better_admin_arrayfield.models.fields.ArrayField(base_field=models.CharField(max_length=512), blank=True, help_text='Alternative names or addresses used to match a place with the free-form location of an event.', null=True, size=None, verbose_name='Alternative names'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.7 on 2024-04-27 15:55
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0057_alter_place_aliases'),
]
operations = [
migrations.AddField(
model_name='place',
name='city',
field=models.CharField(default='', help_text='City name', verbose_name='City'),
preserve_default=False,
),
migrations.AlterField(
model_name='place',
name='address',
field=models.CharField(help_text='Address of this place (without city name)', verbose_name='Address'),
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 4.2.7 on 2024-04-27 16:29
from django.db import migrations
def update_groups_permissions(apps, schema_editor):
Group = apps.get_model("auth", "Group")
Permission = apps.get_model("auth", "Permission")
all_perms = Permission.objects.all()
# set permissions for moderators
moderator_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model in ['place']]
Group.objects.get(name="Moderator").permissions.add(*moderator_perms)
def no_permission_change(apps, schema_editor):
pass
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0058_place_city_alter_place_address'),
]
operations = [
migrations.RunPython(update_groups_permissions, reverse_code=no_permission_change),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-04-27 21:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0059_auto_20240427_1829'),
]
operations = [
migrations.AlterField(
model_name='place',
name='address',
field=models.CharField(blank=True, help_text='Address of this place (without city name)', null=True, verbose_name='Address'),
),
]

View File

@@ -0,0 +1,15 @@
# Generated by Django 4.2.7 on 2024-04-27 21:26
from django.db import migrations
from django.contrib.postgres.operations import UnaccentExtension
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0060_alter_place_address'),
]
operations = [
UnaccentExtension()
]

View File

@@ -0,0 +1,21 @@
# Generated by Django 4.2.7 on 2024-05-01 07:52
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0061_auto_20240427_2326'),
]
operations = [
migrations.AlterModelOptions(
name='duplicatedevents',
options={'verbose_name': 'Duplicated events', 'verbose_name_plural': 'Duplicated events'},
),
migrations.AlterModelOptions(
name='staticcontent',
options={'verbose_name': 'Static content', 'verbose_name_plural': 'Static contents'},
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-05-01 13:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0062_alter_duplicatedevents_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='event',
name='exact_location',
field=models.ForeignKey(blank=True, help_text='Address of the event', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Location'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-06-02 12:01
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0063_alter_event_exact_location'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', 'la puce à loreille'), ('Plugin wordpress MEC', 'Plugin wordpress MEC')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.7 on 2024-08-13 13:08
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0064_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterModelOptions(
name='place',
options={'ordering': ['name'], 'verbose_name': 'Place', 'verbose_name_plural': 'Places'},
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-08-17 09:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0065_alter_place_options'),
]
operations = [
migrations.AddField(
model_name='batchimportation',
name='url_source',
field=models.URLField(blank=True, editable=False, help_text='Source URL if no RecurrentImport is associated.', max_length=1024, null=True, verbose_name='URL (if not recurrent import)'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.7 on 2024-08-17 11:23
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0066_batchimportation_url_source'),
]
operations = [
migrations.AddField(
model_name='categorisationrule',
name='place',
field=models.ForeignKey(blank=True, help_text='Location from place', null=True, on_delete=django.db.models.deletion.SET_NULL, to='agenda_culturel.place', verbose_name='Place'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-08-28 21:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0067_categorisationrule_place'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page")], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.7 on 2024-08-28 23:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0068_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='downloader',
field=models.CharField(choices=[('simple', 'simple'), ('chromium headless', 'Headless Chromium'), ('chromium (pause)', 'Headless Chromium (pause)')], default='simple', max_length=20, verbose_name='Downloader'),
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 4.2.9 on 2024-08-29 19:16
from django.db import migrations
import django_ckeditor_5.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0069_alter_recurrentimport_downloader'),
]
operations = [
migrations.AlterField(
model_name='contactmessage',
name='comments',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, default='', help_text='Comments on the message from the moderation team', null=True, verbose_name='Comments'),
),
migrations.AlterField(
model_name='contactmessage',
name='message',
field=django_ckeditor_5.fields.CKEditor5Field(help_text='Your message', verbose_name='Message'),
),
migrations.AlterField(
model_name='staticcontent',
name='text',
field=django_ckeditor_5.fields.CKEditor5Field(help_text='Text as shown to the visitors', verbose_name='Content'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.9 on 2024-08-29 19:58
from django.db import migrations
import django_ckeditor_5.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0070_alter_contactmessage_comments_and_more'),
]
operations = [
migrations.AlterField(
model_name='contactmessage',
name='message',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Your message', verbose_name='Message'),
),
migrations.AlterField(
model_name='staticcontent',
name='text',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Text as shown to the visitors', verbose_name='Content'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-09-04 21:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0071_alter_contactmessage_message_and_more'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page"), ('cour3coquins', 'la cour des 3 coquins')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-09-04 21:57
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0072_alter_recurrentimport_processor'),
]
operations = [
migrations.AlterField(
model_name='event',
name='location',
field=models.CharField(blank=True, default='', help_text='Address of the event in case its not available in the already known places (free form)', max_length=512, null=True, verbose_name='Location (free form)'),
),
]

View File

@@ -0,0 +1,29 @@
# Generated by Django 4.2.9 on 2024-09-14 12:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0073_alter_event_location'),
]
operations = [
migrations.AddField(
model_name='category',
name='pictogram',
field=models.ImageField(blank=True, help_text='Pictogram of the category', max_length=1024, null=True, upload_to='', verbose_name='Pictogram'),
),
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=None, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AlterField(
model_name='recurrentimport',
name='defaultCategory',
field=models.ForeignKey(default=None, help_text='Category of each imported event', on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.9 on 2024-09-14 13:18
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0074_category_pictogram_alter_event_category_and_more'),
]
operations = [
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=1, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AlterField(
model_name='recurrentimport',
name='defaultCategory',
field=models.ForeignKey(default=1, help_text='Category of each imported event', on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-09-14 17:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0075_alter_event_category_and_more'),
]
operations = [
migrations.AlterField(
model_name='category',
name='pictogram',
field=models.FileField(blank=True, help_text='Pictogram of the category (svg format)', max_length=1024, null=True, upload_to='', verbose_name='Pictogram'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.9 on 2024-09-14 20:05
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0076_alter_category_pictogram'),
]
operations = [
migrations.AddField(
model_name='category',
name='position',
field=models.IntegerField(default=0, verbose_name='Position for ordering categories'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.9 on 2024-09-14 13:18
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0077_category_position_alter_event_category_and_more'),
]
operations = [
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=1, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AlterField(
model_name='recurrentimport',
name='defaultCategory',
field=models.ForeignKey(default=1, help_text='Category of each imported event', on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-10-09 16:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0078_alter_event_category_and_more'),
]
operations = [
migrations.AddField(
model_name='contactmessage',
name='spam',
field=models.BooleanField(default=False, help_text='This message is a spam.', verbose_name='Spam'),
),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.9 on 2024-10-10 20:34
import django.contrib.gis.geos.point
from django.db import migrations
import location_field.models.spatial
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0079_contactmessage_spam'),
]
operations = [
migrations.AddField(
model_name='place',
name='location_pt',
field=location_field.models.spatial.LocationField(default=django.contrib.gis.geos.point.Point(45.783329, 3.08333), srid=4326),
),
]

View File

@@ -0,0 +1,38 @@
# Generated by Django 4.2.9 on 2024-10-10 20:35
from django.db import migrations
from django.contrib.gis.geos import Point
def change_coord_format(apps, schema_editor):
Place = apps.get_model("agenda_culturel", "Place")
places = Place.objects.values("location", "location_pt").all()
for p in places:
l = p.location.split(',')
if len(l) == 2:
p.location_pt = Point(float(l[1]), float(l[0]))
else:
p.location_pt = Point(3.08333, 45.783329)
p.save(update_fields=["location_pt"])
def reverse_coord_format(apps, schema_editor):
Place = apps.get_model("agenda_culturel", "Place")
places = Place.objects.values("location", "location_pt").all()
for p in places:
p.location = ','.join([p.location_pt[1], p.location_pt[0]])
p.save(update_fields=["location"])
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0080_place_location_pt'),
]
operations = [
migrations.RunPython(change_coord_format, reverse_code=reverse_coord_format),
]

View File

@@ -0,0 +1,20 @@
# Generated by Django 4.2.9 on 2024-10-10 21:15
import django.contrib.gis.geos.point
from django.db import migrations
import location_field.models.spatial
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0081_auto_20241010_2235'),
]
operations = [
migrations.AlterField(
model_name='place',
name='location_pt',
field=location_field.models.spatial.LocationField(default=django.contrib.gis.geos.point.Point(3.08333, 45.783329), srid=4326),
),
]

View File

@@ -0,0 +1,17 @@
# Generated by Django 4.2.9 on 2024-10-10 21:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0082_alter_place_location_pt'),
]
operations = [
migrations.RemoveField(
model_name='place',
name='location',
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-10-10 21:15
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0083_remove_place_location'),
]
operations = [
migrations.RenameField(
model_name='place',
old_name='location_pt',
new_name='location',
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.9 on 2024-10-12 14:45
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0084_rename_location_pt_place_location'),
]
operations = [
migrations.AlterField(
model_name='event',
name='category',
field=models.ForeignKey(default=None, help_text='Category of the event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
migrations.AlterField(
model_name='recurrentimport',
name='defaultCategory',
field=models.ForeignKey(default=None, help_text='Category of each imported event', on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-10-16 09:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0085_alter_event_category_and_more'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,24 @@
# Generated by Django 4.2.9 on 2024-10-16 12:55
import django.contrib.gis.geos.point
from django.db import migrations, models
import location_field.models.spatial
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0086_alter_recurrentimport_processor'),
]
operations = [
migrations.CreateModel(
name='ReferenceLocation',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Name of the location', verbose_name='Name')),
('location', location_field.models.spatial.LocationField(default=django.contrib.gis.geos.point.Point(3.08333, 45.783329), srid=4326)),
('main', models.BooleanField(default=False, help_text='This location is one of the main locations (shown first).', verbose_name='Main')),
],
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.2.9 on 2024-10-16 18:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0087_referencelocation'),
]
operations = [
migrations.AlterModelOptions(
name='referencelocation',
options={'verbose_name': 'Reference location', 'verbose_name_plural': 'Reference locations'},
),
migrations.AlterField(
model_name='referencelocation',
name='name',
field=models.CharField(help_text='Name of the location', unique=True, verbose_name='Name'),
),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.9 on 2024-10-17 08:27
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0088_alter_referencelocation_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='defaultCategory',
field=models.ForeignKey(blank=True, default=None, help_text='Category of each imported event', null=True, on_delete=django.db.models.deletion.SET_DEFAULT, to='agenda_culturel.category', verbose_name='Category'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-10-19 13:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0089_alter_recurrentimport_defaultcategory'),
]
operations = [
migrations.AlterField(
model_name='recurrentimport',
name='processor',
field=models.CharField(choices=[('ical', 'ical'), ('icalnobusy', 'ical no busy'), ('icalnovc', 'ical no VC'), ('lacoope', 'lacoope.org'), ('lacomedie', 'la comédie'), ('lefotomat', 'le fotomat'), ('lapucealoreille', "la puce à l'oreille"), ('Plugin wordpress MEC', 'Plugin wordpress MEC'), ('Facebook events', "Événements d'une page FB"), ('cour3coquins', 'la cour des 3 coquins'), ('arachnee', 'Arachnée concert')], default='ical', max_length=20, verbose_name='Processor'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.9 on 2024-10-20 11:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0090_alter_recurrentimport_processor'),
]
operations = [
migrations.AddField(
model_name='duplicatedevents',
name='fixed',
field=models.BooleanField(blank=True, default=False, help_text='This duplicated events is fixed, ie exactly one of the listed events is not masked.', null=True, verbose_name='Fixed'),
),
migrations.AddField(
model_name='event',
name='masked',
field=models.BooleanField(blank=True, default=False, help_text='This event is masked by a duplicated version.', null=True, verbose_name='Masked'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-10-30 14:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0091_duplicatedevents_fixed_event_masked'),
]
operations = [
migrations.AlterField(
model_name='categorisationrule',
name='weight',
field=models.IntegerField(default=1, help_text='The lower is the weight, the earlier the filter is applied', verbose_name='Weight'),
),
]

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.2.9 on 2024-10-30 17:52
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0092_alter_categorisationrule_weight'),
]
operations = [
migrations.CreateModel(
name='Tag',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(help_text='Tag name', max_length=512, verbose_name='Name')),
('description', models.TextField(blank=True, help_text='Description of the tag', null=True, verbose_name='Description')),
('principal', models.BooleanField(default=True, help_text='This tag is highlighted as a main tag for visitors, particularly in the filter.', verbose_name='Principal')),
],
),
]

View File

@@ -0,0 +1,33 @@
# Generated by Django 4.2.9 on 2024-10-30 19:02
from django.db import migrations
from django.contrib.auth.models import Group, Permission
def update_groups_permissions(apps, schema_editor):
# first add a missing role
user_roles = ["Tag editor"]
for name in user_roles:
Group.objects.create(name=name)
all_perms = Permission.objects.all()
# set permissions for moderators
editor_perms = [i for i in all_perms if i.content_type.app_label == 'agenda_culturel' and i.content_type.model == 'tag']
Group.objects.get(name="Tag editor").permissions.add(*editor_perms)
def update_groups_delete(apps, schema_editor):
user_roles = ["Tag editor"]
for name in user_roles:
Group.objects.filter(name=name).delete()
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0093_tag'),
]
operations = [
migrations.RunPython(update_groups_permissions, reverse_code=update_groups_delete),
]

View File

@@ -0,0 +1,19 @@
# Generated by Django 4.2.9 on 2024-10-30 19:11
from django.db import migrations
import django_ckeditor_5.fields
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0094_auto_20241030_2002'),
]
operations = [
migrations.AlterField(
model_name='tag',
name='description',
field=django_ckeditor_5.fields.CKEditor5Field(blank=True, help_text='Description of the tag', null=True, verbose_name='Description'),
),
]

View File

@@ -0,0 +1,18 @@
# Generated by Django 4.2.9 on 2024-10-30 20:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0095_alter_tag_description'),
]
operations = [
migrations.AlterField(
model_name='tag',
name='name',
field=models.CharField(help_text='Tag name', max_length=512, unique=True, verbose_name='Name'),
),
]

View File

@@ -0,0 +1,23 @@
# Generated by Django 4.2.9 on 2024-11-01 22:07
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('agenda_culturel', '0096_alter_tag_name'),
]
operations = [
migrations.AlterField(
model_name='category',
name='alt_name',
field=models.CharField(blank=True, help_text='Alternative name used with a time period', max_length=512, null=True, verbose_name='Alternative Name'),
),
migrations.AlterField(
model_name='category',
name='codename',
field=models.CharField(blank=True, help_text='Short name of the category', max_length=3, null=True, verbose_name='Short name'),
),
]

Some files were not shown because too many files have changed in this diff Show More