import json from django import forms from django.utils.translation import gettext as _ from pingcap_sso.models import UserProfileCollections class AdminEditUserProfileForm(forms.ModelForm): phone = forms.RegexField( required=False, regex=r'^1\d{10}$', error_messages={ 'invalid': _('invalid phone number'), 'required': _('phone number is required') }) email = forms.EmailField(required=False) class Meta: model = UserProfileCollections fields = ['name', 'company', 'job_title', 'address', 'phone', 'email', 'wechat_id'] def __init__(self, user, staff, *args, **kwargs): self.user = user self.staff = staff super(AdminEditUserProfileForm, self).__init__(*args, **kwargs) def save(self): instance = super(AdminEditUserProfileForm, self).save(commit=False) instance.user = self.user instance.created_by_user = self.staff instance.source = UserProfileCollections.SOURCE_ADMIN_EDIT instance.save() class DictField(forms.Field): def to_python(self, value): if not value: return {} if isinstance(value, dict): return value try: return json.loads(value) except (ValueError, TypeError): raise forms.ValidationError(_('invalid dict format')) def validate(self, value): super().validate(value) if not isinstance(value, dict): raise forms.ValidationError(_('input value must be a dict')) class SSOUserUploadFormSubmitForm(forms.Form): form_id = forms.IntegerField(required=True) form_submit_id = forms.IntegerField(required=True) form_title = forms.CharField(required=True, max_length=128) submitted = DictField(required=True) created_at = forms.DateTimeField(required=True) github_id = forms.CharField(required=False) def __init__(self, user, *args, **kwargs): self.user = user super(SSOUserUploadFormSubmitForm, self).__init__(*args, **kwargs) def save(self): form_id = self.cleaned_data['form_id'] form_submit_id = self.cleaned_data['form_submit_id'] form_title = self.cleaned_data['form_title'] submitted = self.cleaned_data['submitted'] created_at = self.cleaned_data['created_at'] github_id = self.cleaned_data.get('github_id') external_id = f'form-{form_id}-{form_submit_id}' # Skip if the record already exists if UserProfileCollections.objects.filter(user=self.user, external_id=external_id).exists(): return fileds = {} for key, value in submitted.items(): if not value: continue if key in ('name', '姓名'): fileds['name'] = value elif key in ('company', 'company_name', '公司'): fileds['company'] = value elif key in ('job_title', '职位'): fileds['job_title'] = value elif key in ('address', '地址'): fileds['address'] = value elif key in ('phone', 'phone_number', '电话'): fileds['phone'] = value elif key in ('email', 'email_address', '邮箱'): fileds['email'] = value elif key in ('wechat_id', 'wechat', '微信号'): fileds['wechat_id'] = value if github_id: fileds['github_id'] = github_id if not fileds: return upc = UserProfileCollections.objects.create( user=self.user, source=UserProfileCollections.SOURCE_FORM, external_id=external_id, comment=form_title, **fileds ) UserProfileCollections.objects.filter(id=upc.id).update( created_at=created_at, updated_at=created_at, )