| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- 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)
|