from django import forms from django.db.models import Count from taggit.forms import TagField from extras.forms import AddRemoveTagsForm, CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFilterForm from utilities.forms import ( APISelect, BootstrapMixin, ChainedFieldsMixin, ChainedModelChoiceField, CommentField, FilterChoiceField, SlugField, ) from .models import Tenant, TenantGroup # # Tenant groups # class TenantGroupForm(BootstrapMixin, forms.ModelForm): slug = SlugField() class Meta: model = TenantGroup fields = [ 'name', 'slug', ] class TenantGroupCSVForm(forms.ModelForm): slug = SlugField() class Meta: model = TenantGroup fields = TenantGroup.csv_headers help_texts = { 'name': 'Group name', } # # Tenants # class TenantForm(BootstrapMixin, CustomFieldForm): slug = SlugField() comments = CommentField() tags = TagField( required=False ) class Meta: model = Tenant fields = [ 'name', 'slug', 'group', 'description', 'comments', 'tags', ] class TenantCSVForm(forms.ModelForm): slug = SlugField() group = forms.ModelChoiceField( queryset=TenantGroup.objects.all(), required=False, to_field_name='name', help_text='Name of parent group', error_messages={ 'invalid_choice': 'Group not found.' } ) class Meta: model = Tenant fields = Tenant.csv_headers help_texts = { 'name': 'Tenant name', 'comments': 'Free-form comments' } class TenantBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldBulkEditForm): pk = forms.ModelMultipleChoiceField( queryset=Tenant.objects.all(), widget=forms.MultipleHiddenInput() ) group = forms.ModelChoiceField( queryset=TenantGroup.objects.all(), required=False ) class Meta: nullable_fields = [ 'group', ] class TenantFilterForm(BootstrapMixin, CustomFieldFilterForm): model = Tenant q = forms.CharField( required=False, label='Search' ) group = FilterChoiceField( queryset=TenantGroup.objects.annotate( filter_count=Count('tenants') ), to_field_name='slug', null_label='-- None --' ) # # Tenancy form extension # class TenancyForm(ChainedFieldsMixin, forms.Form): tenant_group = forms.ModelChoiceField( queryset=TenantGroup.objects.all(), required=False, widget=forms.Select( attrs={ 'filter-for': 'tenant', 'nullable': 'true', } ) ) tenant = ChainedModelChoiceField( queryset=Tenant.objects.all(), chains=( ('group', 'tenant_group'), ), required=False, widget=APISelect( api_url='/api/tenancy/tenants/?group_id={{tenant_group}}' ) ) def __init__(self, *args, **kwargs): # Initialize helper selector instance = kwargs.get('instance') if instance and instance.tenant is not None: initial = kwargs.get('initial', {}).copy() initial['tenant_group'] = instance.tenant.group kwargs['initial'] = initial super().__init__(*args, **kwargs)