from django import forms from django.core.validators import EmailValidator from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from pingcap_sso.models import TUGMemberApplication from pingcap_sso.validators.phone import PhoneNumberValidator from pingcap_sso.utils import crm from pingcap_sso.user_behavior_track.models import TrackEvent from pingcap_sso.utils.requests import get_client_ip, get_client_agent class MultiCharField(forms.Field): def __init__(self, *args, **kwargs): super(MultiCharField, self).__init__(*args, **kwargs) self.subfield = forms.CharField() def clean(self, value): if not value: if self.required: raise ValidationError(self.error_messages["required"]) else: return [] if not isinstance(value, list): raise ValidationError('this field should be a list of character') result = [] for i, v in enumerate(value): result.append(self.subfield.clean(value=v)) return result class ApplicationForm(forms.ModelForm): email = forms.CharField(max_length=255) job_title = forms.CharField(max_length=255) preferred_way_of_sharing = MultiCharField(required=True) roles_want_to_play = MultiCharField(required=True) channel = forms.CharField(max_length=64, required=False) def clean_phone(self): phone = self.cleaned_data.get('phone') if phone: if self.user.phone: return self.user.phone PhoneNumberValidator()(phone) return phone def clean_email(self): email = self.cleaned_data.get('email') if email: if self.user.email: return self.user.email EmailValidator()(email) return email def clean_job_title(self): job_title = self.cleaned_data.get('job_title') if job_title not in crm.JOB_TITLE_OPTIONS: raise ValidationError(_('invalid option')) return job_title def __init__(self, request, user, *args, **kwargs): self.request = request self.user = user super(ApplicationForm, self).__init__(*args, **kwargs) def save(self): data = self.cleaned_data instance = super(ApplicationForm, self).save(commit=False) instance.user = self.user instance.job_title_code = data['job_title'] instance.job_title_text = crm.JOB_TITLE_OPTIONS[data['job_title']] instance.save() TrackEvent.objects.create( openid=self.user.openid, event_type='sso.apply_join_tug', event_body={}, user_agent=get_client_agent(self.request), ip=get_client_ip(self.request), description='申请加入 TUG', source=TrackEvent.SOURCE_SERVER ) class Meta: model = TUGMemberApplication exclude = ['user', 'status', 'job_title_code', 'job_title_text']