class Migration(migrations.Migration): initial = True dependencies = [ ("people", "0001_creer_modeles"), ] operations = [ migrations.CreateModel( name="Membership", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField(auto_now=True, verbose_name="dernière modification"), ), ( "membership_type", models.IntegerField( choices=[ (10, "Membre du groupe"), (50, "Membre gestionnaire"), (100, "Animateur⋅rice"), ], default=10, verbose_name="Statut dans le groupe", ), ), ( "notifications_enabled", models.BooleanField( default=True, help_text= "Je recevrai des messages en cas de modification du groupe.", verbose_name="Recevoir les notifications de ce groupe", ), ), ], options={ "verbose_name": "adhésion", "verbose_name_plural": "adhésions", }, ), migrations.CreateModel( name="SupportGroup", fields=[ ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField(auto_now=True, verbose_name="dernière modification"), ), ( "id", models.UUIDField( default=uuid.uuid4, editable=False, help_text= "UUID interne à l'API pour identifier la ressource", primary_key=True, serialize=False, verbose_name="UUID", ), ), ( "coordinates", django.contrib.gis.db.models.fields.PointField( blank=True, geography=True, null=True, srid=4326, verbose_name="coordonnées", ), ), ( "coordinates_type", models.PositiveSmallIntegerField( choices=[ (0, "Coordonnées manuelles"), (10, "Coordonnées automatiques précises"), ( 20, "Coordonnées automatiques approximatives (niveau rue)", ), ( 25, "Coordonnées automatique approximatives (arrondissement)", ), (30, "Coordonnées automatiques approximatives (ville)" ), (50, "Coordonnées automatiques (qualité inconnue)"), (254, "Pas de position géographique"), (255, "Coordonnées introuvables"), ], editable=False, help_text= "Comment les coordonnées ci-dessus ont-elle été acquises", null=True, verbose_name="type de coordonnées", ), ), ( "location_name", models.CharField(blank=True, max_length=255, verbose_name="nom du lieu"), ), ( "location_address1", models.CharField(blank=True, max_length=100, verbose_name="adresse (1ère ligne)"), ), ( "location_address2", models.CharField(blank=True, max_length=100, verbose_name="adresse (2ème ligne)"), ), ( "location_citycode", models.CharField(blank=True, max_length=20, verbose_name="code INSEE"), ), ( "location_city", models.CharField(blank=True, max_length=100, verbose_name="ville"), ), ( "location_zip", models.CharField(blank=True, max_length=20, verbose_name="code postal"), ), ( "location_state", models.CharField(blank=True, max_length=40, verbose_name="état"), ), ( "location_country", django_countries.fields.CountryField(blank=True, default="FR", max_length=2, verbose_name="pays"), ), ( "contact_name", models.CharField(blank=True, max_length=255, verbose_name="nom du contact"), ), ( "contact_email", models.EmailField( blank=True, max_length=254, verbose_name="adresse email du contact", ), ), ( "contact_phone", models.CharField( blank=True, max_length=30, verbose_name="numéro de téléphone du contact", ), ), ( "contact_hide_phone", models.BooleanField( default=False, verbose_name="Cacher mon numéro de téléphone"), ), ( "image", stdimage.models.StdImageField( blank=True, help_text= "Vous pouvez ajouter une image de bannière : elle apparaîtra sur la page, et sur les réseaux sociaux en cas de partage. Préférez une image à peu près deux fois plus large que haute. Elle doit faire au minimum 1200 pixels de large et 630 de haut pour une qualité optimale.", upload_to=dynamic_filenames.FilePattern( filename_pattern= "{app_label}/{model_name}/{instance.id}/banner{ext}" ), validators=[ django.core.validators.FileExtensionValidator( allowed_extensions=[ "jpg", "jpeg", "gif", "png", "svg" ]) ], verbose_name="image", ), ), ( "description", agir.lib.models.DescriptionField( blank=True, help_text="Une courte description", verbose_name="description", ), ), ( "allow_html", models.BooleanField( default=False, verbose_name= "autoriser le HTML étendu dans la description", ), ), ( "name", models.CharField(help_text="Le nom du groupe", max_length=255, verbose_name="nom"), ), ( "type", models.CharField( choices=[ ("L", "Groupe local"), ("B", "Groupe thématique"), ("F", "Groupe fonctionnel"), ("P", "Groupe professionel"), ("2", "Équipe de soutien « Nous Sommes Pour ! »"), ], default="L", max_length=1, verbose_name="type de groupe", ), ), ( "published", models.BooleanField( default=True, help_text= "Le groupe doit-il être visible publiquement.", verbose_name="publié", ), ), ], options={ "verbose_name": "groupe d'action", "verbose_name_plural": "groupes d'action", "ordering": ("-created", ), "permissions": (( "view_hidden_supportgroup", "Peut afficher les groupes non publiés", ), ), }, ), migrations.CreateModel( name="SupportGroupSubtype", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField(auto_now=True, verbose_name="dernière modification"), ), ( "label", models.CharField(max_length=50, unique=True, verbose_name="nom"), ), ( "description", models.TextField(blank=True, verbose_name="description"), ), ( "visibility", models.CharField( choices=[ ("N", "Personne (plus utilisé)"), ("D", "Seulement depuis l'administration"), ("A", "N'importe qui"), ], default="D", max_length=1, verbose_name="Qui peut créer avec ce sous-type ?", ), ), ( "hide_text_label", models.BooleanField(default=False, verbose_name="cacher le label texte"), ), ( "icon", models.ImageField( blank=True, help_text= "L'icône associée aux marqueurs sur la carte.", upload_to=dynamic_filenames.FilePattern( filename_pattern= "{app_label}/{model_name}/{instance.id}/icon{ext}" ), verbose_name="icon", ), ), ( "icon_name", models.CharField( blank=True, max_length=200, verbose_name="Nom de l'icône Font Awesome", ), ), ( "color", models.CharField( blank=True, help_text= "La couleur associée aux marqueurs sur la carte.", max_length=7, validators=[ django.core.validators.RegexValidator( regex="^#[0-9A-Fa-f]{6}$") ], verbose_name="couleur", ), ), ( "icon_anchor_x", models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="ancre de l'icône (x)"), ), ( "icon_anchor_y", models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="ancre de l'icône (y)"), ), ( "popup_anchor_y", models.PositiveSmallIntegerField( blank=True, null=True, verbose_name= "placement de la popup (par rapport au point)", ), ), ( "config", models.JSONField(blank=True, default=dict, verbose_name="Configuration"), ), ( "allow_external", models.BooleanField( default=False, verbose_name="Les non-insoumis⋅es peuvent rejoindre", ), ), ( "external_help_text", models.TextField( blank=True, verbose_name= "Phrase d'explication pour rejoindre le groupe ou l'événement", ), ), ( "type", models.CharField( choices=[ ("L", "Groupe local"), ("B", "Groupe thématique"), ("F", "Groupe fonctionnel"), ("P", "Groupe professionel"), ("2", "Équipe de soutien « Nous Sommes Pour ! »"), ], max_length=1, verbose_name="type de groupe", ), ), ], options={ "verbose_name": "sous-type", }, ), migrations.CreateModel( name="SupportGroupTag", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "label", models.CharField(max_length=50, unique=True, verbose_name="nom"), ), ( "description", models.TextField(blank=True, verbose_name="description"), ), ], options={ "verbose_name": "tag", }, ), migrations.CreateModel( name="TransferOperation", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "timestamp", models.DateTimeField(auto_now_add=True, verbose_name="Heure de l'opération"), ), ( "former_group", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="+", to="groups.supportgroup", ), ), ], options={ "verbose_name": "Transfert de membres", "verbose_name_plural": "Transferts de membres", "ordering": ("timestamp", "former_group"), }, ), # Relations et index migrations.AddField( model_name="transferoperation", name="manager", field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, to="people.person", ), ), migrations.AddField( model_name="transferoperation", name="members", field=models.ManyToManyField( editable=False, related_name="_transferoperation_members_+", to="people.Person", ), ), migrations.AddField( model_name="transferoperation", name="new_group", field=models.ForeignKey( editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="+", to="groups.supportgroup", ), ), migrations.AddField( model_name="supportgroup", name="members", field=models.ManyToManyField( blank=True, related_name="supportgroups", through="groups.Membership", to="people.Person", ), ), migrations.AddField( model_name="supportgroup", name="subtypes", field=models.ManyToManyField( blank=True, related_name="supportgroups", to="groups.SupportGroupSubtype", ), ), migrations.AddField( model_name="supportgroup", name="tags", field=models.ManyToManyField(blank=True, related_name="groups", to="groups.SupportGroupTag"), ), migrations.AddField( model_name="membership", name="person", field=models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="memberships", to="people.person", ), ), migrations.AddField( model_name="membership", name="supportgroup", field=models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="memberships", to="groups.supportgroup", ), ), migrations.CreateModel( name="ThematicGroup", fields=[], options={ "verbose_name": "Groupe thématique", "verbose_name_plural": "Groupes thématiques", "proxy": True, "default_permissions": ("view", "change"), "indexes": [], "constraints": [], }, bases=("groups.supportgroup", ), ), migrations.AlterUniqueTogether( name="membership", unique_together={("supportgroup", "person")}, ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ("people", "0001_creer_modeles"), ("groups", "0001_creer_modeles"), ("payments", "0001_creer_modeles"), ] operations = [ migrations.CreateModel( name="Calendar", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("name", models.CharField(max_length=255, verbose_name="titre")), ("slug", models.SlugField(unique=True, verbose_name="slug")), ( "archived", models.BooleanField( default=False, verbose_name="Calendrier archivé" ), ), ( "user_contributed", models.BooleanField( default=False, verbose_name="Les utilisateurs peuvent ajouter des événements", ), ), ( "description", models.TextField( blank=True, help_text="Saisissez une description (HTML accepté)", verbose_name="description", ), ), ( "image", stdimage.models.StdImageField( blank=True, upload_to=dynamic_filenames.FilePattern( filename_pattern="{app_label}/{model_name}/{instance.name:slug}{ext}" ), verbose_name="bannière", ), ), ], options={"verbose_name": "Agenda",}, ), migrations.CreateModel( name="CalendarItem", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ], options={"verbose_name": "Élément de calendrier",}, ), migrations.CreateModel( name="Event", fields=[ ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "id", models.UUIDField( default=uuid.uuid4, editable=False, help_text="UUID interne à l'API pour identifier la ressource", primary_key=True, serialize=False, verbose_name="UUID", ), ), ( "coordinates", django.contrib.gis.db.models.fields.PointField( blank=True, geography=True, null=True, srid=4326, verbose_name="coordonnées", ), ), ( "coordinates_type", models.PositiveSmallIntegerField( choices=[ (0, "Coordonnées manuelles"), (10, "Coordonnées automatiques précises"), ( 20, "Coordonnées automatiques approximatives (niveau rue)", ), ( 25, "Coordonnées automatique approximatives (arrondissement)", ), (30, "Coordonnées automatiques approximatives (ville)"), (50, "Coordonnées automatiques (qualité inconnue)"), (254, "Pas de position géographique"), (255, "Coordonnées introuvables"), ], editable=False, help_text="Comment les coordonnées ci-dessus ont-elle été acquises", null=True, verbose_name="type de coordonnées", ), ), ( "location_name", models.CharField( blank=True, max_length=255, verbose_name="nom du lieu" ), ), ( "location_address1", models.CharField( blank=True, max_length=100, verbose_name="adresse (1ère ligne)" ), ), ( "location_address2", models.CharField( blank=True, max_length=100, verbose_name="adresse (2ème ligne)" ), ), ( "location_citycode", models.CharField( blank=True, max_length=20, verbose_name="code INSEE" ), ), ( "location_city", models.CharField(blank=True, max_length=100, verbose_name="ville"), ), ( "location_zip", models.CharField( blank=True, max_length=20, verbose_name="code postal" ), ), ( "location_state", models.CharField(blank=True, max_length=40, verbose_name="état"), ), ( "location_country", django_countries.fields.CountryField( blank=True, default="FR", max_length=2, verbose_name="pays" ), ), ( "contact_name", models.CharField( blank=True, max_length=255, verbose_name="nom du contact" ), ), ( "contact_email", models.EmailField( blank=True, max_length=254, verbose_name="adresse email du contact", ), ), ( "contact_phone", models.CharField( blank=True, max_length=30, verbose_name="numéro de téléphone du contact", ), ), ( "contact_hide_phone", models.BooleanField( default=False, verbose_name="Cacher mon numéro de téléphone" ), ), ( "image", stdimage.models.StdImageField( blank=True, help_text="Vous pouvez ajouter une image de bannière : elle apparaîtra sur la page, et sur les réseaux sociaux en cas de partage. Préférez une image à peu près deux fois plus large que haute. Elle doit faire au minimum 1200 pixels de large et 630 de haut pour une qualité optimale.", upload_to=dynamic_filenames.FilePattern( filename_pattern="{app_label}/{model_name}/{instance.id}/banner{ext}" ), validators=[ django.core.validators.FileExtensionValidator( allowed_extensions=["jpg", "jpeg", "gif", "png", "svg"] ) ], verbose_name="image", ), ), ( "description", agir.lib.models.DescriptionField( blank=True, help_text="Une courte description", verbose_name="description", ), ), ( "allow_html", models.BooleanField( default=False, verbose_name="autoriser le HTML étendu dans la description", ), ), ( "name", models.CharField( help_text="Le nom de l'événement", max_length=255, verbose_name="nom", ), ), ( "visibility", models.CharField( choices=[ ("A", "Caché"), ("O", "Visible par les organisateurs"), ("P", "Public"), ], default="P", max_length=1, verbose_name="Visibilité", ), ), ( "start_time", agir.events.models.CustomDateTimeField( verbose_name="date et heure de début" ), ), ( "end_time", agir.events.models.CustomDateTimeField( verbose_name="date et heure de fin" ), ), ( "max_participants", models.IntegerField( blank=True, null=True, verbose_name="Nombre maximum de participants", ), ), ( "allow_guests", models.BooleanField( default=False, verbose_name="Autoriser les participant⋅e⋅s à inscrire des invité⋅e⋅s", ), ), ( "facebook", agir.lib.model_fields.FacebookEventField( blank=True, max_length=20, verbose_name="Événement correspondant sur Facebook", ), ), ( "report_image", stdimage.models.StdImageField( blank=True, help_text="Cette image apparaîtra en tête de votre compte-rendu, et dans les partages que vous ferez du compte-rendu sur les réseaux sociaux.", upload_to=dynamic_filenames.FilePattern( filename_pattern="{app_label}/{model_name}/{instance.id}/report_banner{ext}" ), verbose_name="image de couverture", ), ), ( "report_content", agir.lib.models.DescriptionField( blank=True, help_text="Ajoutez un compte-rendu de votre événement. N'hésitez pas à inclure des photos.", verbose_name="compte-rendu de l'événement", ), ), ( "report_summary_sent", models.BooleanField( default=False, verbose_name="Le mail de compte-rendu a été envoyé", ), ), ( "payment_parameters", models.JSONField( blank=True, null=True, verbose_name="Paramètres de paiement" ), ), ( "scanner_event", models.IntegerField( blank=True, null=True, verbose_name="L'ID de l'événement sur le logiciel de tickets", ), ), ( "scanner_category", models.IntegerField( blank=True, null=True, verbose_name="La catégorie que doivent avoir les tickets sur scanner", ), ), ( "enable_jitsi", models.BooleanField( default=False, verbose_name="Activer la visio-conférence" ), ), ( "participation_template", models.TextField( blank=True, null=True, verbose_name="Template pour la page de participation", ), ), ( "do_not_list", models.BooleanField( default=False, help_text="L'événement n'apparaîtra pas sur la carte, ni sur le calendrier et ne sera pas cherchable via la recherche interne ou les moteurs de recherche.", verbose_name="Ne pas lister l'événement", ), ), ( "legal", models.JSONField( blank=True, default=dict, encoder=agir.lib.form_fields.CustomJSONEncoder, verbose_name="Informations juridiques", ), ), ( "for_users", models.CharField( choices=[ ("I", "Les insoumis⋅es"), ("2", "Les signataires « Nous Sommes Pour ! »"), ], default="I", max_length=1, verbose_name="Utilisateur⋅ices de la plateforme concerné⋅es par l'événement", ), ), ], options={ "verbose_name": "événement", "verbose_name_plural": "événements", "ordering": ("-start_time", "-end_time"), "permissions": ( ("every_event", "Peut éditer tous les événements"), ("view_hidden_event", "Peut voir les événements non publiés"), ), }, ), migrations.CreateModel( name="EventImage", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "image", stdimage.models.StdImageField( upload_to=dynamic_filenames.FilePattern( filename_pattern="events/event/{instance.event_id}/{uuid:s}{ext}" ), verbose_name="Fichier", ), ), ("legend", models.CharField(max_length=280, verbose_name="légende")), ], options={"abstract": False,}, ), migrations.CreateModel( name="EventSubtype", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "label", models.CharField(max_length=50, unique=True, verbose_name="nom"), ), ( "description", models.TextField(blank=True, verbose_name="description"), ), ( "visibility", models.CharField( choices=[ ("N", "Personne (plus utilisé)"), ("D", "Seulement depuis l'administration"), ("A", "N'importe qui"), ], default="D", max_length=1, verbose_name="Qui peut créer avec ce sous-type ?", ), ), ( "hide_text_label", models.BooleanField( default=False, verbose_name="cacher le label texte" ), ), ( "icon", models.ImageField( blank=True, help_text="L'icône associée aux marqueurs sur la carte.", upload_to=dynamic_filenames.FilePattern( filename_pattern="{app_label}/{model_name}/{instance.id}/icon{ext}" ), verbose_name="icon", ), ), ( "icon_name", models.CharField( blank=True, max_length=200, verbose_name="Nom de l'icône Font Awesome", ), ), ( "color", models.CharField( blank=True, help_text="La couleur associée aux marqueurs sur la carte.", max_length=7, validators=[ django.core.validators.RegexValidator( regex="^#[0-9A-Fa-f]{6}$" ) ], verbose_name="couleur", ), ), ( "icon_anchor_x", models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="ancre de l'icône (x)" ), ), ( "icon_anchor_y", models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="ancre de l'icône (y)" ), ), ( "popup_anchor_y", models.PositiveSmallIntegerField( blank=True, null=True, verbose_name="placement de la popup (par rapport au point)", ), ), ( "config", models.JSONField( blank=True, default=dict, verbose_name="Configuration" ), ), ( "allow_external", models.BooleanField( default=False, verbose_name="Les non-insoumis⋅es peuvent rejoindre", ), ), ( "external_help_text", models.TextField( blank=True, verbose_name="Phrase d'explication pour rejoindre le groupe ou l'événement", ), ), ( "type", models.CharField( choices=[ ("G", "Réunion de groupe"), ("M", "Événement public"), ("A", "Action publique"), ("O", "Autre"), ], max_length=1, verbose_name="Type d'événement", ), ), ( "default_description", agir.lib.models.DescriptionField( blank=True, help_text="La description par défaut pour les événements de ce sous-type.", verbose_name="description par défaut", ), ), ( "default_image", stdimage.models.StdImageField( blank=True, help_text="L'image associée par défaut à un événement de ce sous-type.", upload_to=dynamic_filenames.FilePattern( filename_pattern="{app_label}/{model_name}/{instance.id}/banner{ext}" ), verbose_name="image par défaut", ), ), ], options={ "verbose_name": "Sous-type d'événement", "verbose_name_plural": "Sous-types d'événement", }, ), migrations.CreateModel( name="EventTag", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "label", models.CharField(max_length=50, unique=True, verbose_name="nom"), ), ( "description", models.TextField(blank=True, verbose_name="description"), ), ], options={"verbose_name": "tag",}, ), migrations.CreateModel( name="IdentifiedGuest", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "status", models.CharField( choices=[ ("AP", "En attente du paiement"), ("CO", "Inscription confirmée"), ("CA", "Inscription annulée"), ], default="CO", max_length=2, verbose_name="Statut", ), ), ], options={"db_table": "events_rsvp_guests_form_submissions",}, ), migrations.CreateModel( name="JitsiMeeting", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "domain", models.CharField( default=agir.events.models.jitsi_default_domain, max_length=255 ), ), ( "room_name", models.CharField( default=agir.events.models.jitsi_default_room_name, max_length=255, unique=True, validators=[ django.core.validators.RegexValidator( re.compile("^[a-z0-9-_]+$"), "Seulement des lettres minuscules, des chiffres, des _ et des -.", "invalid", ) ], ), ), ( "start_time", models.DateTimeField( blank=True, null=True, verbose_name="Début effectif" ), ), ( "end_time", models.DateTimeField( blank=True, null=True, verbose_name="Fin effective" ), ), ], options={"verbose_name": "Visio-conférence",}, ), migrations.CreateModel( name="OrganizerConfig", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "is_creator", models.BooleanField( default=False, verbose_name="Créateur de l'événement" ), ), ( "notifications_enabled", models.BooleanField( default=True, verbose_name="Recevoir les notifications" ), ), ], ), migrations.CreateModel( name="RSVP", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "guests", models.PositiveIntegerField( default=0, verbose_name="nombre d'invités supplémentaires" ), ), ( "status", models.CharField( choices=[ ("AP", "En attente du paiement"), ("CO", "Inscription confirmée"), ("CA", "Inscription annulée"), ], default="CO", max_length=2, verbose_name="Statut", ), ), ( "notifications_enabled", models.BooleanField( default=True, verbose_name="Recevoir les notifications" ), ), ( "event", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="rsvps", to="events.event", ), ), ], options={"verbose_name": "RSVP", "verbose_name_plural": "RSVP",}, ), # relations et autres migrations.AddField( model_name="rsvp", name="form_submission", field=models.OneToOneField( editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="rsvp", to="people.personformsubmission", ), ), migrations.AddField( model_name="rsvp", name="guests_form_submissions", field=models.ManyToManyField( related_name="guest_rsvp", through="events.IdentifiedGuest", to="people.PersonFormSubmission", ), ), migrations.AddField( model_name="rsvp", name="jitsi_meeting", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="rsvps", to="events.jitsimeeting", ), ), migrations.AddField( model_name="rsvp", name="payment", field=models.OneToOneField( editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="rsvp", to="payments.payment", ), ), migrations.AddField( model_name="rsvp", name="person", field=models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="rsvps", to="people.person", ), ), migrations.AddField( model_name="organizerconfig", name="as_group", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="organizer_configs", to="groups.supportgroup", ), ), migrations.AddField( model_name="organizerconfig", name="event", field=models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="organizer_configs", to="events.event", ), ), migrations.AddField( model_name="organizerconfig", name="person", field=models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="organizer_configs", to="people.person", ), ), migrations.AddField( model_name="jitsimeeting", name="event", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="jitsi_meetings", to="events.event", ), ), migrations.AddField( model_name="identifiedguest", name="payment", field=models.OneToOneField( editable=False, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="identified_guest", to="payments.payment", ), ), migrations.AddField( model_name="identifiedguest", name="rsvp", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="identified_guests", to="events.rsvp", ), ), migrations.AddField( model_name="identifiedguest", name="submission", field=models.OneToOneField( db_column="personformsubmission_id", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="rsvp_guest", to="people.personformsubmission", ), ), migrations.AddField( model_name="eventimage", name="author", field=models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="event_images", to="people.person", ), ), migrations.AddField( model_name="eventimage", name="event", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="images", to="events.event", ), ), migrations.AddField( model_name="event", name="attendees", field=models.ManyToManyField( related_name="events", through="events.RSVP", to="people.Person" ), ), migrations.AddField( model_name="event", name="organizers", field=models.ManyToManyField( related_name="organized_events", through="events.OrganizerConfig", to="people.Person", ), ), migrations.AddField( model_name="event", name="organizers_groups", field=models.ManyToManyField( related_name="organized_events", through="events.OrganizerConfig", to="groups.SupportGroup", ), ), migrations.AddField( model_name="event", name="subscription_form", field=models.OneToOneField( blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to="people.personform", ), ), migrations.AddField( model_name="event", name="subtype", field=models.ForeignKey( default=agir.events.models.get_default_subtype, on_delete=django.db.models.deletion.PROTECT, related_name="events", to="events.eventsubtype", verbose_name="Sous-type", ), ), migrations.AddField( model_name="event", name="tags", field=models.ManyToManyField( blank=True, related_name="events", to="events.EventTag" ), ), migrations.AddField( model_name="calendaritem", name="calendar", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="items", to="events.calendar", ), ), migrations.AddField( model_name="calendaritem", name="event", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="calendar_items", to="events.event", ), ), migrations.AddField( model_name="calendar", name="events", field=models.ManyToManyField( related_name="calendars", through="events.CalendarItem", to="events.Event", ), ), migrations.AddField( model_name="calendar", name="parent", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="children", related_query_name="child", to="events.calendar", ), ), migrations.AlterUniqueTogether( name="rsvp", unique_together={("event", "person")}, ), migrations.AlterUniqueTogether( name="identifiedguest", unique_together={("rsvp", "submission")}, ), migrations.AddIndex( model_name="event", index=models.Index( fields=["start_time", "end_time"], name="events_datetime_index" ), ), migrations.AddIndex( model_name="event", index=models.Index(fields=["end_time"], name="events_end_time_index"), ), ]
class Migration(migrations.Migration): initial = True dependencies = [] operations = [ migrations.CreateModel( name="Person", fields=[ ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "id", models.UUIDField( default=uuid.uuid4, editable=False, help_text="UUID interne à l'API pour identifier la ressource", primary_key=True, serialize=False, verbose_name="UUID", ), ), ( "coordinates", django.contrib.gis.db.models.fields.PointField( blank=True, geography=True, null=True, srid=4326, verbose_name="coordonnées", ), ), ( "coordinates_type", models.PositiveSmallIntegerField( choices=[ (0, "Coordonnées manuelles"), (10, "Coordonnées automatiques précises"), ( 20, "Coordonnées automatiques approximatives (niveau rue)", ), ( 25, "Coordonnées automatique approximatives (arrondissement)", ), (30, "Coordonnées automatiques approximatives (ville)"), (50, "Coordonnées automatiques (qualité inconnue)"), (254, "Pas de position géographique"), (255, "Coordonnées introuvables"), ], editable=False, help_text="Comment les coordonnées ci-dessus ont-elle été acquises", null=True, verbose_name="type de coordonnées", ), ), ( "location_name", models.CharField( blank=True, max_length=255, verbose_name="nom du lieu" ), ), ( "location_address1", models.CharField( blank=True, max_length=100, verbose_name="adresse (1ère ligne)" ), ), ( "location_address2", models.CharField( blank=True, max_length=100, verbose_name="adresse (2ème ligne)" ), ), ( "location_citycode", models.CharField( blank=True, max_length=20, verbose_name="code INSEE" ), ), ( "location_city", models.CharField(blank=True, max_length=100, verbose_name="ville"), ), ( "location_zip", models.CharField( blank=True, max_length=20, verbose_name="code postal" ), ), ( "location_state", models.CharField(blank=True, max_length=40, verbose_name="état"), ), ( "location_country", django_countries.fields.CountryField( blank=True, default="FR", max_length=2, verbose_name="pays" ), ), ( "auto_login_salt", models.CharField(blank=True, default="", max_length=255), ), ( "is_insoumise", models.BooleanField(default=False, verbose_name="Insoumis⋅e"), ), ( "is_2022", models.BooleanField(default=False, verbose_name="Soutien 2022"), ), ( "membre_reseau_elus", models.CharField( choices=[ ("I", "Inconnu / Non pertinent"), ("S", "Souhaite faire partie du réseau des élus"), ("O", "Fait partie du réseau des élus"), ("N", "Ne souhaite pas faire partie du réseau des élus"), ("E", "Exclus du réseau"), ], default="I", help_text="Pertinent uniquement si la personne a un ou plusieurs mandats électoraux.", max_length=1, verbose_name="Membre du réseau des élus", ), ), ( "newsletters", agir.lib.model_fields.ChoiceArrayField( base_field=models.CharField( choices=[ ("LFI", "Lettre d'information de la France insoumise"), ("2022", "Lettre d'information NSP"), ( "2022_exceptionnel", "NSP : informations exceptionnelles", ), ("2022_en_ligne", "NSP actions en ligne"), ("2022_chez_moi", "NSP agir près de chez moi"), ("2022_programme", "NSP processus programme"), ], max_length=255, ), blank=True, default=list, size=None, ), ), ( "subscribed_sms", models.BooleanField( blank=True, default=True, help_text="Nous envoyons parfois des SMS plutôt que des emails lors des grands événements ! Vous ne recevrez que les informations auxquelles vous êtes abonné⋅e.", verbose_name="Recevoir les SMS d'information", ), ), ( "event_notifications", models.BooleanField( blank=True, default=True, help_text="Vous recevrez des messages quand les informations des événements auxquels vous souhaitez participer sont mis à jour ou annulés.", verbose_name="Recevoir les notifications des événements", ), ), ( "group_notifications", models.BooleanField( blank=True, default=True, help_text="Vous recevrez des messages quand les informations du groupe change, ou quand le groupe organise des événements.", verbose_name="Recevoir les notifications de mes groupes", ), ), ( "draw_participation", models.BooleanField( blank=True, default=False, help_text="Vous pourrez être tiré⋅e au sort parmis les Insoumis⋅es pour participer à des événements comme la Convention.Vous aurez la possibilité d'accepter ou de refuser cette participation.", verbose_name="Participer aux tirages au sort", ), ), ( "first_name", models.CharField(blank=True, max_length=255, verbose_name="prénom"), ), ( "last_name", models.CharField( blank=True, max_length=255, verbose_name="nom de famille" ), ), ( "contact_phone", agir.people.model_fields.ValidatedPhoneNumberField( blank=True, max_length=128, region=None, unverified_value="U", validated_field_name="contact_phone_status", verbose_name="Numéro de téléphone de contact", ), ), ( "contact_phone_status", models.CharField( choices=[ ("U", "Non vérifié"), ("V", "Vérifié"), ("P", "En attente de validation manuelle"), ], default="U", help_text="Pour les numéros hors France métropolitaine, merci de les indiquer sous la forme internationale, en les préfixant par '+' et le code du pays.", max_length=1, verbose_name="Statut du numéro de téléphone", ), ), ( "gender", models.CharField( blank=True, choices=[ ("F", "Femme"), ("M", "Homme"), ("O", "Autre/Non défini"), ], max_length=1, verbose_name="Genre", ), ), ( "date_of_birth", models.DateField( blank=True, null=True, verbose_name="Date de naissance" ), ), ( "mandates", agir.people.model_fields.MandatesField( blank=True, default=list, verbose_name="Mandats électoraux" ), ), ( "meta", models.JSONField( blank=True, default=dict, verbose_name="Autres données" ), ), ( "commentaires", models.TextField( blank=True, help_text="ATTENTION : en cas de demande d'accès à ses données par la personne concernée par cette fiche, le contenu de ce champ lui sera communiqué. N'indiquez ici que des éléments factuels.", verbose_name="Commentaires", ), ), ( "search", django.contrib.postgres.search.SearchVectorField( editable=False, null=True, verbose_name="Données de recherche" ), ), ( "referrer_id", models.CharField( default=agir.people.models.generate_referrer_id, max_length=13, unique=True, verbose_name="Identifiant d'invitation", ), ), ], options={ "verbose_name": "personne", "verbose_name_plural": "personnes", "ordering": ("-created",), "permissions": [ ( "select_person", "Peut lister pour sélectionner (dans un Select 2 par exemple)", ) ], "default_permissions": ("add", "change", "delete", "view"), }, ), migrations.CreateModel( name="PersonForm", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ("title", models.CharField(max_length=250, verbose_name="Titre")), ("slug", models.SlugField(unique=True, verbose_name="Slug")), ("published", models.BooleanField(default=True, verbose_name="Publié")), ( "result_url_uuid", models.UUIDField( editable=False, null=True, verbose_name="UUID pour l'affichage des résultats", ), ), ( "start_time", models.DateTimeField( blank=True, null=True, verbose_name="Date d'ouverture du formulaire", ), ), ( "end_time", models.DateTimeField( blank=True, null=True, verbose_name="Date de fermeture du formulaire", ), ), ( "editable", models.BooleanField( default=False, verbose_name="Les répondant⋅e⋅s peuvent modifier leurs réponses", ), ), ( "allow_anonymous", models.BooleanField( default=False, verbose_name="Les répondant⋅es n'ont pas besoin d'être connecté⋅es", ), ), ( "send_answers_to", models.EmailField( blank=True, max_length=254, verbose_name="Envoyer les réponses par email à une adresse email (facultatif)", ), ), ( "description", agir.lib.models.DescriptionField( help_text="Description visible en haut de la page de remplissage du formulaire", verbose_name="Description", ), ), ( "send_confirmation", models.BooleanField( default=False, verbose_name="Envoyer une confirmation par email" ), ), ( "confirmation_note", agir.lib.models.DescriptionField( help_text="Note montrée (et éventuellement envoyée par email) à l'utilisateur une fois le formulaire validé.", verbose_name="Note après complétion", ), ), ( "before_message", agir.lib.models.DescriptionField( blank=True, help_text="Note montrée à l'utilisateur qui essaye d'accéder au formulaire avant son ouverture.", verbose_name="Note avant ouverture", ), ), ( "after_message", agir.lib.models.DescriptionField( blank=True, help_text="Note montrée à l'utilisateur qui essaye d'accéder au formulaire après sa date de fermeture.", verbose_name="Note de fermeture", ), ), ( "unauthorized_message", agir.lib.models.DescriptionField( blank=True, help_text="Note montrée à tout utilisateur qui n'aurait pas le tag nécessaire pour afficher le formulaire.", verbose_name="Note pour les personnes non autorisées", ), ), ( "main_question", models.CharField( blank=True, help_text="Uniquement utilisée si des choix de tags sont demandés.", max_length=200, verbose_name="Intitulé de la question principale", ), ), ( "custom_fields", models.JSONField( default=agir.people.person_forms.models.default_custom_forms, verbose_name="Champs", ), ), ( "config", models.JSONField( blank=True, default=dict, verbose_name="Configuration" ), ), ], options={"verbose_name": "Formulaire",}, ), migrations.CreateModel( name="PersonTag", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "label", models.CharField(max_length=50, unique=True, verbose_name="nom"), ), ( "description", models.TextField(blank=True, verbose_name="description"), ), ( "exported", models.BooleanField( default=False, verbose_name="Exporté vers mailtrain" ), ), ], options={"verbose_name": "tag",}, ), migrations.CreateModel( name="PersonValidationSMS", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "phone_number", phonenumber_field.modelfields.PhoneNumberField( editable=False, max_length=128, region=None, verbose_name="Numéro de mobile", ), ), ( "code", models.CharField( default=agir.people.models.generate_code, editable=False, max_length=8, ), ), ( "person", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, to="people.person", ), ), ], options={ "verbose_name": "SMS de validation", "verbose_name_plural": "SMS de validation", }, ), migrations.CreateModel( name="PersonFormSubmission", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "created", models.DateTimeField( default=django.utils.timezone.now, editable=False, verbose_name="date de création", ), ), ( "modified", models.DateTimeField( auto_now=True, verbose_name="dernière modification" ), ), ( "data", models.JSONField( default=dict, encoder=agir.lib.form_fields.CustomJSONEncoder, verbose_name="Données", ), ), ( "form", models.ForeignKey( editable=False, on_delete=django.db.models.deletion.CASCADE, related_name="submissions", to="people.personform", ), ), ( "person", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name="form_submissions", to="people.person", ), ), ], options={"abstract": False,}, ), migrations.AddField( model_name="personform", name="required_tags", field=models.ManyToManyField( blank=True, related_name="authorized_forms", related_query_name="authorized_form", to="people.PersonTag", ), ), migrations.AddField( model_name="personform", name="tags", field=models.ManyToManyField( blank=True, related_name="forms", related_query_name="form", to="people.PersonTag", ), ), migrations.AddField( model_name="person", name="tags", field=models.ManyToManyField( blank=True, related_name="people", to="people.PersonTag" ), ), migrations.CreateModel( name="PersonEmail", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "address", models.EmailField( help_text="L'adresse email de la personne, utilisée comme identifiant", max_length=254, verbose_name="adresse email", ), ), ( "_bounced", models.BooleanField( db_column="bounced", default=False, help_text="Indique que des mails envoyés ont été rejetés par le serveur distant", verbose_name="email rejeté", ), ), ( "bounced_date", models.DateTimeField( blank=True, help_text="Si des mails ont été rejetés, indique la date du dernier rejet", null=True, verbose_name="date de rejet de l'email", ), ), ( "person", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="emails", to="people.person", ), ), ], options={"verbose_name": "Email", "order_with_respect_to": "person",}, ), migrations.AddIndex( model_name="person", index=django.contrib.postgres.indexes.GinIndex( fields=["search"], name="search_index" ), ), migrations.AddIndex( model_name="person", index=models.Index(fields=["contact_phone"], name="contact_phone_index"), ), UnaccentExtension(), migrations.RunSQL( sql=CREATE_TEXT_CONFIGURATIONS, reverse_sql=DROP_TEXT_CONFIGURATIONS, ), migrations.RunSQL( sql=CREATE_CASELESS_EMAIL_INDEX, reverse_sql=REMOVE_CASELESS_EMAIL_INDEX ), ]
class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.NUNTIUS_SEGMENT_MODEL), ("activity", "0002_auto_20201104_1128"), ] operations = [ migrations.CreateModel( name="Announcement", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "title", models.CharField( help_text= "Ce texte sera utilisé comme titre et texte du lien de l'annonce", max_length=200, verbose_name="Titre de l'annonce", ), ), ("link", models.URLField(verbose_name="Lien")), ("content", agir.lib.models.DescriptionField(verbose_name="Contenu")), ( "image", stdimage.models.StdImageField( blank=True, null=True, upload_to=dynamic_filenames.FilePattern( filename_pattern= "activity/announcements/{uuid:2base32}/{uuid:s}{ext}" ), validators=[ stdimage.validators.MinSizeValidator(255, 160) ], verbose_name="Bannière", ), ), ( "start_date", models.DateTimeField(default=django.utils.timezone.now, verbose_name="Date de début"), ), ( "end_date", models.DateTimeField(blank=True, null=True, verbose_name="Date de fin"), ), ( "priority", models.IntegerField( default=0, help_text= "Permet de modifier l'ordre d'affichage des annonces. Les valeurs plus élevées sont affichées avant. Deux annonces de même priorité sont affichées dans l'ordre anti-chronologique (par date de début)", verbose_name="Priorité", ), ), ( "segment", models.ForeignKey( blank=True, help_text= "Segment des personnes auquel ce message sera montré (laisser vide pour montrer à tout le monde)", null=True, on_delete=django.db.models.deletion.CASCADE, related_name="notifications", related_query_name="notification", to=settings.NUNTIUS_SEGMENT_MODEL, ), ), ], options={ "verbose_name": "Annonce", "ordering": ("start_date", "end_date"), }, ), migrations.AddIndex( model_name="announcement", index=models.Index(fields=["start_date", "end_date"], name="announcement_date_index"), ), ]
class Migration(migrations.Migration): initial = True dependencies = [ ("mailing", "0002_auto_20190308_1859"), ("people", "0056_auto_20190521_1702"), ] operations = [ migrations.CreateModel( name="Notification", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "icon", models.CharField( default="envelope", help_text='Indiquez le nom d\'une icône dans <a href="https://fontawesome.com/v4.7.0/icons/">cette liste</a>', max_length=200, verbose_name="icône", ), ), ( "content", agir.lib.models.DescriptionField( verbose_name="Contenu de la notification" ), ), ("link", models.URLField(blank=True, verbose_name="Lien")), ( "start_date", models.DateTimeField( default=django.utils.timezone.now, verbose_name="Date de début" ), ), ( "end_date", models.DateTimeField( blank=True, null=True, verbose_name="Date de fin" ), ), ( "segment", models.ForeignKey( blank=True, help_text="Segment des personnes auquel ce message sera montré (laisser vide pour montrer à tout le monde)", null=True, on_delete=django.db.models.deletion.CASCADE, related_name="notifications", related_query_name="notification", to="mailing.Segment", ), ), ], options={ "verbose_name": "Notification", "verbose_name_plural": "Notifications", "ordering": ("-start_date", "-end_date"), }, ), migrations.CreateModel( name="NotificationStatus", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "status", models.CharField( choices=[("S", "Vu"), ("C", "C")], max_length=1, verbose_name="Status", ), ), ( "notification", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="statuses", related_query_name="status", to="notifications.Notification", ), ), ( "person", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="notification_statuses", related_query_name="notification_status", to="people.Person", ), ), ], options={"unique_together": {("notification", "person")}}, ), migrations.AddIndex( model_name="notification", index=models.Index( fields=["start_date", "end_date"], name="notification_query_index" ), ), ]