import logging from django import forms from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from pingcap_sso.models import ( User, SecurityCode, CompanyVerifyApplication ) from pingcap_sso.user_behavior_track.models import TrackEvent from pingcap_sso.lib.upload import upload_file from pingcap_sso.utils.requests import get_client_ip, get_client_agent logger = logging.getLogger(__name__) class CompanyVerifyApplicationForm(forms.Form): verification_method = forms.IntegerField() email = forms.EmailField(required=False) email_code = forms.CharField(required=False) incumbency_cert = forms.ImageField(required=False) def __init__(self, request, user, *args, **kwargs): self.request = request self.user = user if user.is_authenticated else None return super(CompanyVerifyApplicationForm, self).__init__(*args, **kwargs) def clean_incumbency_cert(self): file = self.cleaned_data.get('incumbency_cert') if file: try: file.size except Exception: import traceback logger.error(traceback.format_exc()) else: if file.size > 5 * 1 << 20: raise ValidationError(_('file size exceeds limit ({}M)').format(5)) return file def clean(self): if self._errors: return verification_method = self.cleaned_data['verification_method'] email = self.cleaned_data.get('email') email_code = self.cleaned_data.get('email_code') incumbency_cert = self.cleaned_data.get('incumbency_cert') if self.user.company_verified_status != User.COMPANY_UNVERIFIED: raise ValidationError(_('only unverified user can submit application')) if not (self.user.company_name and self.user.job_title_code): raise ValidationError(_('please fill in company name and job title')) if verification_method == CompanyVerifyApplication.VERIFICATION_METHOD_EMAIL: if not email: self.add_error('email', _('this field is required')) return if not email_code: self.add_error('email_code', _('this field is required')) return if not SecurityCode.check_code(email, email_code, SecurityCode.DELIVER_BY_EMAIL): self.add_error('email_code', _('invalid security code')) return else: if not incumbency_cert: self.add_error('incumbency_cert', _('this field is required')) return return self.cleaned_data def save(self): verification_method = self.cleaned_data['verification_method'] application = CompanyVerifyApplication( user=self.user, company_name=self.user.company_name, job_title_code=self.user.job_title_code, job_title_text=self.user.job_title_text, verification_method=self.cleaned_data['verification_method'], ) if verification_method == CompanyVerifyApplication.VERIFICATION_METHOD_EMAIL: application.email = self.cleaned_data['email'] else: file = upload_file(self.cleaned_data.get('incumbency_cert'), self.user) application.incumbency_cert = file application.save() self.user.company_verified_status = User.COMPANY_VERIFIED_PENDING self.user.save(update_fields=['company_verified_status']) TrackEvent.objects.create( openid=self.user.openid, event_type='sso.apply_verify_company', event_body={ 'application_id': application.id }, user_agent=get_client_agent(self.request), ip=get_client_ip(self.request), description='申请公司认证', source=TrackEvent.SOURCE_SERVER ) return application