<commit_before>from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from crispy_forms.helper import FormHelper

from groups.models import SupportGroup
from ..form_components import *
from ..form_mixins import LocationFormMixin, ContactFormMixin, GeocodingBaseForm

from events.models import Event, OrganizerConfig, Calendar, RSVP, EventImage
from events.tasks import send_event_creation_notification, send_event_changed_notification
from lib.tasks import geocode_event
from lib.form_fields import AcceptCreativeCommonsLicenceField

__all__ = ['EventForm', 'AddOrganizerForm', 'EventGeocodingForm', 'EventReportForm', 'UploadEventImageForm']


class AgendaChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name


class EventForm(LocationFormMixin, ContactFormMixin, forms.ModelForm):
    CHANGES = {
        'name': "information",
        'start_time': "timing",
        'end_time': "timing",
        'contact_name': "contact",
        'contact_email': "contact",
        'contact_phone': "contact",
        'location_name': "location",
        'location_address1': "location",
        'location_address2': "location",
        'location_city': "location",
        'location_zip': "location",
        'location_country': "location",
        'description': "information"
    }

    image_accept_license = AcceptCreativeCommonsLicenceField()

    def __init__(self, *args, person, **kwargs):
        super(EventForm, self).__init__(*args, **kwargs)

        self.person = person

        calendar_field = []

        self.fields['image'].help_text = _("""
        Vous pouvez ajouter une image de bannière à votre événement : elle apparaîtra alors sur la page de votre
        événement, et comme illustration si vous le partagez sur les réseaux sociaux. Pour cela, choisissez une image
        à peu près deux fois plus large que haute, et de dimensions supérieures à 1200 par 630 pixels.
        """)

        self.fields['description'].help_text = _("""
        Cette description doit permettre de comprendre rapidement sur quoi porte et comment se passera votre événement.
        Incluez toutes les informations pratiques qui pourraient être utiles aux insoumis⋅es qui souhaiteraient
        participer (matériel à amener, précisions sur le lieu ou contraintes particulières, par exemple).
        """)

        if not hasattr(self.instance, 'calendar') or self.instance.calendar.user_contributed:
            self.fields['calendar'] = AgendaChoiceField(
                Calendar.objects.filter(user_contributed=True),
                empty_label=None,
                label=_("Type d'événement"),
                required=True,
                widget=forms.RadioSelect()
            )

            calendar_field = [Row(FullCol('calendar'))]

        self.fields['as_group'] = forms.ModelChoiceField(
            queryset=SupportGroup.objects.filter(memberships__person=person, memberships__is_manager=True),
            empty_label="Ne pas créer au nom d'un groupe",
            label=_("Créer l'événement au nom d'un groupe d'action"),
            required=False,
        )

        self.fields['name'].label = "Nom de l'événement"
        self.fields['name'].help_text = None

        self.is_creation = self.instance._state.adding

        if not self.is_creation:
            self.fields['notify'] = forms.BooleanField(
                required=False,
                initial=False,
                label=_("Signalez ces changements aux participants à l'événement"),
                help_text=_("Un email sera envoyé à la validation de ce formulaire. Merci de ne pas abuser de cette"
                            " fonctionnalité.")
            )
            notify_field = [Row(
                FullCol('notify')
            )]
            self.organizer_config = OrganizerConfig.objects.get(person=self.person, event=self.instance)
            self.fields['as_group'].initial = self.organizer_config.as_group
        else:
            notify_field = []

        self.helper = FormHelper()
        self.helper.form_method = 'POST'
        self.helper.add_input(Submit('submit', 'Sauvegarder et publier'))

        self.helper.layout = Layout(
            Row(
                FullCol('name'),
            ),
            Row(
                FullCol('image'),
            ),
            Row(
                FullCol('image_accept_license')
            ),
            *calendar_field,
            Row(
                HalfCol('start_time'),
                HalfCol('end_time'),
            ),
            Row(
                HalfCol('as_group')
            ),
            Section(
                _('Informations de contact'),
                Row(
                    FullCol('contact_name'),
                ),
                Row(
                    HalfCol('contact_email'),
                    HalfCol('contact_phone', 'contact_hide_phone'),
                ),
            ),
            Section(
                _('Lieu'),
                Row(
                    FullCol(
                        HTML(
                            "<p><b>Merci d'indiquer une adresse précise avec numéro de rue, sans quoi l'événement n'apparaîtra"
                            " pas sur la carte.</b>"
                            " Si les réunions se déroulent chez vous et que vous ne souhaitez pas rendre cette adresse"
                            " publique, vous pouvez indiquer un endroit à proximité, comme un café, ou votre mairie.",
                        ),
                    )
                ),
                Row(
                    FullCol('location_name', css_class='col-md-12'),
                ),
                Row(
                    FullCol(
                        Field('location_address1', placeholder=_('1ère ligne')),
                        Field('location_address2', placeholder=_('2ème ligne'))
                    )
                ),
                Row(
                    Div('location_zip', css_class='col-md-4'),
                    Div('location_city', css_class='col-md-8'),
                ),
                Row(
                    Div('location_country', css_class='col-md-12'),
                ),  
            ),
            Row(FullCol('description')),
            *notify_field,
        )

    def clean_start_time(self):
        start_time = self.cleaned_data['start_time']

        if start_time < timezone.now():
            raise forms.ValidationError(
                _("Vos événements feraient mieux de se passer dans le futur ! Ce serait plus efficace…")
            )

        return start_time

    def clean(self):
        cleaned_data = super().clean()

        image = cleaned_data['image']
        image_accept_license = cleaned_data['image_accept_license']

        if not image:
            cleaned_data['image_accept_license'] = False
        elif not image_accept_license:
            self.add_error('image_accept_license', self.fields['image_accept_license'].error_messages['required'])

        return cleaned_data

    def save(self, commit=True):
        res = super().save(commit)
<commit_msg>Fix for the condition where cleaned_data would not have these keys<commit_after>from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils import timezone
from crispy_forms.helper import FormHelper

from groups.models import SupportGroup
from ..form_components import *
from ..form_mixins import LocationFormMixin, ContactFormMixin, GeocodingBaseForm

from events.models import Event, OrganizerConfig, Calendar, RSVP, EventImage
from events.tasks import send_event_creation_notification, send_event_changed_notification
from lib.tasks import geocode_event
from lib.form_fields import AcceptCreativeCommonsLicenceField

__all__ = ['EventForm', 'AddOrganizerForm', 'EventGeocodingForm', 'EventReportForm', 'UploadEventImageForm']


class AgendaChoiceField(forms.ModelChoiceField):
    def label_from_instance(self, obj):
        return obj.name


class EventForm(LocationFormMixin, ContactFormMixin, forms.ModelForm):
    CHANGES = {
        'name': "information",
        'start_time': "timing",
        'end_time': "timing",
        'contact_name': "contact",
        'contact_email': "contact",
        'contact_phone': "contact",
        'location_name': "location",
        'location_address1': "location",
        'location_address2': "location",
        'location_city': "location",
        'location_zip': "location",
        'location_country': "location",
        'description': "information"
    }

    image_accept_license = AcceptCreativeCommonsLicenceField()

    def __init__(self, *args, person, **kwargs):
        super(EventForm, self).__init__(*args, **kwargs)

        self.person = person

        calendar_field = []

        self.fields['image'].help_text = _("""
        Vous pouvez ajouter une image de bannière à votre événement : elle apparaîtra alors sur la page de votre
        événement, et comme illustration si vous le partagez sur les réseaux sociaux. Pour cela, choisissez une image
        à peu près deux fois plus large que haute, et de dimensions supérieures à 1200 par 630 pixels.
        """)

        self.fields['description'].help_text = _("""
        Cette description doit permettre de comprendre rapidement sur quoi porte et comment se passera votre événement.
        Incluez toutes les informations pratiques qui pourraient être utiles aux insoumis⋅es qui souhaiteraient
        participer (matériel à amener, précisions sur le lieu ou contraintes particulières, par exemple).
        """)

        if not hasattr(self.instance, 'calendar') or self.instance.calendar.user_contributed:
            self.fields['calendar'] = AgendaChoiceField(
                Calendar.objects.filter(user_contributed=True),
                empty_label=None,
                label=_("Type d'événement"),
                required=True,
                widget=forms.RadioSelect()
            )

            calendar_field = [Row(FullCol('calendar'))]

        self.fields['as_group'] = forms.ModelChoiceField(
            queryset=SupportGroup.objects.filter(memberships__person=person, memberships__is_manager=True),
            empty_label="Ne pas créer au nom d'un groupe",
            label=_("Créer l'événement au nom d'un groupe d'action"),
            required=False,
        )

        self.fields['name'].label = "Nom de l'événement"
        self.fields['name'].help_text = None

        self.is_creation = self.instance._state.adding

        if not self.is_creation:
            self.fields['notify'] = forms.BooleanField(
                required=False,
                initial=False,
                label=_("Signalez ces changements aux participants à l'événement"),
                help_text=_("Un email sera envoyé à la validation de ce formulaire. Merci de ne pas abuser de cette"
                            " fonctionnalité.")
            )
            notify_field = [Row(
                FullCol('notify')
            )]
            self.organizer_config = OrganizerConfig.objects.get(person=self.person, event=self.instance)
            self.fields['as_group'].initial = self.organizer_config.as_group
        else:
            notify_field = []

        self.helper = FormHelper()
        self.helper.form_method = 'POST'
        self.helper.add_input(Submit('submit', 'Sauvegarder et publier'))

        self.helper.layout = Layout(
            Row(
                FullCol('name'),
            ),
            Row(
                FullCol('image'),
            ),
            Row(
                FullCol('image_accept_license')
            ),
            *calendar_field,
            Row(
                HalfCol('start_time'),
                HalfCol('end_time'),
            ),
            Row(
                HalfCol('as_group')
            ),
            Section(
                _('Informations de contact'),
                Row(
                    FullCol('contact_name'),
                ),
                Row(
                    HalfCol('contact_email'),
                    HalfCol('contact_phone', 'contact_hide_phone'),
                ),
            ),
            Section(
                _('Lieu'),
                Row(
                    FullCol(
                        HTML(
                            "<p><b>Merci d'indiquer une adresse précise avec numéro de rue, sans quoi l'événement n'apparaîtra"
                            " pas sur la carte.</b>"
                            " Si les réunions se déroulent chez vous et que vous ne souhaitez pas rendre cette adresse"
                            " publique, vous pouvez indiquer un endroit à proximité, comme un café, ou votre mairie.",
                        ),
                    )
                ),
                Row(
                    FullCol('location_name', css_class='col-md-12'),
                ),
                Row(
                    FullCol(
                        Field('location_address1', placeholder=_('1ère ligne')),
                        Field('location_address2', placeholder=_('2ème ligne'))
                    )
                ),
                Row(
                    Div('location_zip', css_class='col-md-4'),
                    Div('location_city', css_class='col-md-8'),
                ),
                Row(
                    Div('location_country', css_class='col-md-12'),
                ),  
            ),
            Row(FullCol('description')),
            *notify_field,
        )

    def clean_start_time(self):
        start_time = self.cleaned_data['start_time']

        if start_time < timezone.now():
            raise forms.ValidationError(
                _("Vos événements feraient mieux de se passer dans le futur ! Ce serait plus efficace…")
            )

        return start_time

    def clean(self):
        cleaned_data = super().clean()

        image = cleaned_data.get('image', None)
        image_accept_license = cleaned_data.get('image_accept_license', False)

        if not image:
            cleaned_data['image_accept_license'] = False
        elif not image_accept_license:
            self.add_error('image_accept_license', self.fields['image_accept_license'].error_messages['required'])

        return cleaned_data

    def save(self, commit=True):
        res = super().save(commit)

{'fraction_non_alphanumeric': 0.09479528105482304, 'fraction_numerical': 0.00263705759888966, 'mean_word_length': 1.9142568250758343, 'pattern_counts': {'":': 0, '<': 11, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '208717', 'n_tokens_mistral': 3905, 'n_tokens_neox': 3742, 'n_words': 902}