from django import forms from django.core.exceptions import ValidationError from pingcap_sso.models import award_points_by_value, bulk_award_points_by_value from pingcap_sso.models.user import User class AdminManualAwardPointForm(forms.Form): digest = forms.CharField(required=True, max_length=64) reason = forms.CharField(required=True, max_length=64) points = forms.IntegerField(required=True) exps = forms.IntegerField(required=True) def __init__(self, target_user, staff, *args, **kwargs): self.target_user = target_user self.staff = staff super(AdminManualAwardPointForm, self).__init__(*args, **kwargs) def save(self): award_points_by_value( target_user=self.target_user, points=self.cleaned_data['points'], exps=self.cleaned_data['exps'], reason=self.cleaned_data['reason'], digest=self.cleaned_data['digest'], acting_user=self.staff ) class AdminBulkAwardPointForm(forms.Form): usernames = forms.CharField(required=True) digest = forms.CharField(required=True, max_length=64) reason = forms.CharField(required=True, max_length=64) points = forms.IntegerField(required=True, min_value=0) exps = forms.IntegerField(required=True, min_value=0) def __init__(self, staff, *args, **kwargs): self.staff = staff self.users = User.objects.none() super(AdminBulkAwardPointForm, self).__init__(*args, **kwargs) def clean_usernames(self): usernames = self.cleaned_data.get('usernames') none_exists_usernames = list() if usernames: usernames = list(filter(lambda x: x.strip(), usernames.split('\n'))) self.users = User.objects.filter(username__in=usernames) exists_usernames = self.users.values_list('username', flat=True) none_exists_usernames = list(set(usernames) - set(exists_usernames)) if none_exists_usernames: raise ValidationError(f'{ ", ".join(none_exists_usernames[:10]) } 等 { len(none_exists_usernames) } 名用户未找到,请重新确认') return usernames def clean(self): if self.errors: return points = self.cleaned_data['points'] exps = self.cleaned_data['exps'] if points == 0 and exps == 0: self.add_error('points', '积分和经验不能同时为 0') return self.cleaned_data def save(self): bulk_award_points_by_value( target_users=self.users, points=self.cleaned_data['points'], exps=self.cleaned_data['exps'], reason=self.cleaned_data['reason'], digest=self.cleaned_data['digest'], acting_user=self.staff )