from django import forms from django.utils.translation import ugettext as _ from django.contrib import admin from .models import ( AdditionalGroup, DeleteTaskResult, Group, GroupTaskResult, Shadow, User, UserTaskResult, ) PASSWORD_MISMATCH_ERROR = _("Passwords don't match") class AdditionalGroupInline(admin.TabularInline): model = AdditionalGroup class ShadowInline(admin.TabularInline): model = Shadow readonly_fields = ['passwd'] can_delete = False class TaskResultInline(admin.TabularInline): can_delete = False extra = 0 readonly_fields = ['task_uuid', 'task_name', 'is_finished', 'is_success', 'state', 'result_body'] def get_queryset(self, request): qs = super(TaskResultInline, self).get_queryset(request) for entry in qs: entry.update_taskstatus() return qs def has_add_permission(self, request, obj=None): return False class UserTaskResultInline(TaskResultInline): model = UserTaskResult class GroupTaskResultInline(TaskResultInline): model = GroupTaskResult class UserCreationForm(forms.ModelForm): """ A form for creating system users. """ password1 = forms.CharField(label=_('Password'), widget=forms.PasswordInput) password2 = forms.CharField(label=_('Password (again)'), widget=forms.PasswordInput) class Meta: model = User fields = [] def clean_password2(self): """ Check that the two password entries match. """ password1 = self.cleaned_data.get('password1') password2 = self.cleaned_data.get('password2') if password1 and password2 and password1 != password2: raise forms.ValidationError(PASSWORD_MISMATCH_ERROR) return password2 def save(self, commit=True): """ Save the provided password in hashed format. """ user = User.objects.create_user( password=self.cleaned_data['password1'], commit=commit) return user def save_m2m(self): """ No additional groups are created when this form is saved, so this method just does nothing. """ class UserAdmin(admin.ModelAdmin): inlines = [AdditionalGroupInline, ShadowInline, UserTaskResultInline] readonly_fields = ['uid'] add_form = UserCreationForm add_fieldsets = ( (None, { 'classes': ('wide',), 'fields': ('password1', 'password2')}), ) def get_form(self, request, obj=None, **kwargs): """ Use special form during user creation. """ defaults = {} if obj is None: defaults.update({ 'form': self.add_form, 'fields': admin.options.flatten_fieldsets(self.add_fieldsets), }) defaults.update(kwargs) return super(UserAdmin, self).get_form(request, obj, **defaults) def get_inline_instances(self, request, obj=None): if obj is None: return [] return super(UserAdmin, self).get_inline_instances(request, obj) class GroupAdmin(admin.ModelAdmin): inlines = [GroupTaskResultInline] def get_inline_instances(self, request, obj=None): if obj is None: return [] return super(GroupAdmin, self).get_inline_instances(request, obj) class DeleteTaskResultAdmin(admin.ModelAdmin): readonly_fields = ['task_uuid', 'task_name', 'modeltype', 'modelname', 'is_finished', 'is_success', 'state', 'result_body'] list_display = ('task_uuid', 'task_name', 'modeltype', 'modelname', 'is_finished', 'state') def has_add_permission(self, request, obj=None): return False def get_queryset(self, request): qs = super(DeleteTaskResultAdmin, self).get_queryset(request) for entry in qs: entry.update_taskstatus() return qs admin.site.register(Group, GroupAdmin) admin.site.register(User, UserAdmin) admin.site.register(DeleteTaskResult, DeleteTaskResultAdmin)