# coding: utf-8 from django import forms from django.utils.translation import ugettext_lazy as _ from django.contrib.auth.models import User from django.forms.widgets import RadioSelect, CheckboxSelectMultiple from django.db.models import Max from gestioncof.models import CofProfile, EventCommentValue from gestioncof.widgets import TriStateCheckbox from gestioncof.shared import lock_table, unlock_table class EventForm(forms.Form): def __init__(self, *args, **kwargs): event = kwargs.pop("event") self.event = event current_choices = kwargs.pop("current_choices", None) super(EventForm, self).__init__(*args, **kwargs) choices = {} if current_choices: for choice in current_choices.all(): if choice.event_option.id not in choices: choices[choice.event_option.id] = [choice.id] else: choices[choice.event_option.id].append(choice.id) all_choices = choices for option in event.options.all(): choices = [(choice.id, choice.value) for choice in option.choices.all()] if option.multi_choices: initial = [] if option.id not in all_choices \ else all_choices[option.id] field = forms.MultipleChoiceField( label=option.name, choices=choices, widget=CheckboxSelectMultiple, required=False, initial=initial) else: initial = None if option.id not in all_choices \ else all_choices[option.id][0] field = forms.ChoiceField(label=option.name, choices=choices, widget=RadioSelect, required=False, initial=initial) field.option_id = option.id self.fields["option_%d" % option.id] = field def choices(self): for name, value in self.cleaned_data.items(): if name.startswith('option_'): yield (self.fields[name].option_id, value) class SurveyForm(forms.Form): def __init__(self, *args, **kwargs): survey = kwargs.pop("survey") current_answers = kwargs.pop("current_answers", None) super(SurveyForm, self).__init__(*args, **kwargs) answers = {} if current_answers: for answer in current_answers.all(): if answer.survey_question.id not in answers: answers[answer.survey_question.id] = [answer.id] else: answers[answer.survey_question.id].append(answer.id) for question in survey.questions.all(): choices = [(answer.id, answer.answer) for answer in question.answers.all()] if question.multi_answers: initial = [] if question.id not in answers\ else answers[question.id] field = forms.MultipleChoiceField( label=question.question, choices=choices, widget=CheckboxSelectMultiple, required=False, initial=initial) else: initial = None if question.id not in answers\ else answers[question.id][0] field = forms.ChoiceField(label=question.question, choices=choices, widget=RadioSelect, required=False, initial=initial) field.question_id = question.id self.fields["question_%d" % question.id] = field def answers(self): for name, value in self.cleaned_data.items(): if name.startswith('question_'): yield (self.fields[name].question_id, value) class SurveyStatusFilterForm(forms.Form): def __init__(self, *args, **kwargs): survey = kwargs.pop("survey") super(SurveyStatusFilterForm, self).__init__(*args, **kwargs) for question in survey.questions.all(): for answer in question.answers.all(): name = "question_%d_answer_%d" % (question.id, answer.id) if self.is_bound \ and self.data.get(self.add_prefix(name), None): initial = self.data.get(self.add_prefix(name), None) else: initial = "none" field = forms.ChoiceField( label="%s : %s" % (question.question, answer.answer), choices=[("yes", "yes"), ("no", "no"), ("none", "none")], widget=TriStateCheckbox, required=False, initial=initial) field.question_id = question.id field.answer_id = answer.id self.fields[name] = field def filters(self): for name, value in self.cleaned_data.items(): if name.startswith('question_'): yield (self.fields[name].question_id, self.fields[name].answer_id, value) class EventStatusFilterForm(forms.Form): def __init__(self, *args, **kwargs): event = kwargs.pop("event") super(EventStatusFilterForm, self).__init__(*args, **kwargs) for option in event.options.all(): for choice in option.choices.all(): name = "option_%d_choice_%d" % (option.id, choice.id) if self.is_bound \ and self.data.get(self.add_prefix(name), None): initial = self.data.get(self.add_prefix(name), None) else: initial = "none" field = forms.ChoiceField( label="%s : %s" % (option.name, choice.value), choices=[("yes", "yes"), ("no", "no"), ("none", "none")], widget=TriStateCheckbox, required=False, initial=initial) field.option_id = option.id field.choice_id = choice.id self.fields[name] = field # has_paid name = "event_has_paid" if self.is_bound and self.data.get(self.add_prefix(name), None): initial = self.data.get(self.add_prefix(name), None) else: initial = "none" field = forms.ChoiceField(label="Événement payé", choices=[("yes", "yes"), ("no", "no"), ("none", "none")], widget=TriStateCheckbox, required=False, initial=initial) self.fields[name] = field def filters(self): for name, value in self.cleaned_data.items(): if name.startswith('option_'): yield (self.fields[name].option_id, self.fields[name].choice_id, value) elif name == "event_has_paid": yield ("has_paid", None, value) class UserProfileForm(forms.ModelForm): first_name = forms.CharField(label=_(u'Prénom'), max_length=30) last_name = forms.CharField(label=_(u'Nom'), max_length=30) def __init__(self, *args, **kw): super(UserProfileForm, self).__init__(*args, **kw) self.fields['first_name'].initial = self.instance.user.first_name self.fields['last_name'].initial = self.instance.user.last_name self.fields.keyOrder = [ 'first_name', 'last_name', 'phone', 'mailing_cof', 'mailing_bda', 'mailing_bda_revente', ] def save(self, *args, **kw): super(UserProfileForm, self).save(*args, **kw) self.instance.user.first_name = self.cleaned_data.get('first_name') self.instance.user.last_name = self.cleaned_data.get('last_name') self.instance.user.save() class Meta: model = CofProfile fields = ("phone", "mailing_cof", "mailing_bda", "mailing_bda_revente", ) class RegistrationUserForm(forms.ModelForm): def __init__(self, *args, **kw): super(RegistrationUserForm, self).__init__(*args, **kw) self.fields['username'].help_text = "" class Meta: model = User fields = ("username", "first_name", "last_name", "email") class RegistrationProfileForm(forms.ModelForm): def __init__(self, *args, **kw): super(RegistrationProfileForm, self).__init__(*args, **kw) self.fields['mailing_cof'].initial = True self.fields['mailing_bda'].initial = True self.fields['mailing_bda_revente'].initial = True self.fields['num'].widget.attrs['readonly'] = True self.fields.keyOrder = [ 'login_clipper', 'phone', 'occupation', 'departement', 'is_cof', 'num', 'type_cotiz', 'mailing_cof', 'mailing_bda', 'mailing_bda_revente', 'comments' ] def save(self, *args, **kw): instance = super(RegistrationProfileForm, self).save(*args, **kw) if instance.is_cof and not instance.num: # Generate new number try: lock_table(CofProfile) aggregate = CofProfile.objects.aggregate(Max('num')) instance.num = aggregate['num__max'] + 1 instance.save() self.cleaned_data['num'] = instance.num self.data['num'] = instance.num finally: unlock_table(CofProfile) return instance class Meta: model = CofProfile fields = ("login_clipper", "num", "phone", "occupation", "departement", "is_cof", "type_cotiz", "mailing_cof", "mailing_bda", "mailing_bda_revente", "comments") STATUS_CHOICES = (('no', 'Non'), ('wait', 'Oui mais attente paiement'), ('paid', 'Oui payé'),) class AdminEventForm(forms.Form): status = forms.ChoiceField(label="Inscription", choices=STATUS_CHOICES, widget=RadioSelect) def __init__(self, *args, **kwargs): event = kwargs.pop("event") self.event = event registration = kwargs.pop("current_registration", None) current_choices = \ registration.options.all() if registration is not None\ else [] paid = kwargs.pop("paid", None) if paid is True: kwargs["initial"] = {"status": "paid"} elif paid is False: kwargs["initial"] = {"status": "wait"} else: kwargs["initial"] = {"status": "no"} super(AdminEventForm, self).__init__(*args, **kwargs) choices = {} for choice in current_choices: if choice.event_option.id not in choices: choices[choice.event_option.id] = [choice.id] else: choices[choice.event_option.id].append(choice.id) all_choices = choices for option in event.options.all(): choices = [(choice.id, choice.value) for choice in option.choices.all()] if option.multi_choices: initial = [] if option.id not in all_choices\ else all_choices[option.id] field = forms.MultipleChoiceField( label=option.name, choices=choices, widget=CheckboxSelectMultiple, required=False, initial=initial) else: initial = None if option.id not in all_choices\ else all_choices[option.id][0] field = forms.ChoiceField(label=option.name, choices=choices, widget=RadioSelect, required=False, initial=initial) field.option_id = option.id self.fields["option_%d" % option.id] = field for commentfield in event.commentfields.all(): initial = commentfield.default if registration is not None: try: initial = registration.comments \ .get(commentfield=commentfield).content except EventCommentValue.DoesNotExist: pass widget = forms.Textarea if commentfield.fieldtype == "text" \ else forms.TextInput field = forms.CharField(label=commentfield.name, widget=widget, required=False, initial=initial) field.comment_id = commentfield.id self.fields["comment_%d" % commentfield.id] = field def choices(self): for name, value in self.cleaned_data.items(): if name.startswith('option_'): yield (self.fields[name].option_id, value) def comments(self): for name, value in self.cleaned_data.items(): if name.startswith('comment_'): yield (self.fields[name].comment_id, value)