def _get_custom_fields_annotations(self): from shared_schema_tenants_custom_data.models import ( TenantSpecificFieldDefinition, TenantSpecificTable, TenantSpecificTableRow) if self.model == TenantSpecificTableRow: definitions = TenantSpecificFieldDefinition.objects.filter( table_content_type=ContentType.objects.get_for_model( TenantSpecificTable), table_id=self.table_id) else: definitions = TenantSpecificFieldDefinition.objects.filter( table_content_type=ContentType.objects.get_for_model( self.model)) definitions_by_name = {d.name: d for d in definitions} custom_fields_annotations = {} for key, definition in definitions_by_name.items(): if get_complete_version()[1] >= 11: from django.db.models import Subquery, OuterRef definitions_values = (_get_pivot_table_class_for_data_type( definition.data_type).objects.filter( definition__id=definition.id, row_id=OuterRef('pk')).values('value')) custom_fields_annotations[key] = Subquery( queryset=definitions_values, output_field=self.data_type_fields[definition.data_type]) else: from django.db.models.expressions import RawSQL model_content_type = ContentType.objects.get_for_model( self.model) model_table_name = (model_content_type.app_label + '_' + model_content_type.model) PivotTableClass = _get_pivot_table_class_for_data_type( definition.data_type) pivot_table_name = PivotTableClass._meta.db_table custom_fields_annotations[key] = RawSQL( """ select p.value from """ + pivot_table_name + """ p where definition_id = %s and p.row_id = """ + '"' + model_table_name + '"."' + self.model._meta.pk.name + '"', [definition.id], output_field=self.data_type_fields[definition.data_type]) return custom_fields_annotations
def setUp(self): super(CustomTablesListTests, self).setUp() self.tables = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTable', tenant=self.tenant, _quantity=10) for table in self.tables: self.fields = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificFieldDefinition', table_id=table.id, table_content_type=ContentType.objects.get_for_model( TenantSpecificTable), data_type=TenantSpecificFieldDefinition.DATA_TYPES.integer, default_value='1', tenant=self.tenant, _quantity=10) for table in self.tables: self.row = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTableRow', table=table, tenant=self.tenant) for i, field in enumerate(self.fields): PivotTableClass = _get_pivot_table_class_for_data_type( field.data_type) PivotTableClass.objects.filter( row_id=self.row.id, definition=field).update(value=i + 5) self.client.force_authenticate(self.user) self.view_url = reverse( 'shared_schema_tenants_custom_data:custom_tables_list') validator_gt_2 = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificFieldsValidator', module_path= 'shared_schema_tenants_custom_data.tests.validators.validator_gt_2' ) self.params = { 'name': '_custom_tables__test_table_1', 'fields_definitions': [{ 'name': 'test1', 'data_type': 'integer', 'is_required': False, 'default_value': 3, 'validators': [validator_gt_2.id] }, { 'name': 'test2', 'data_type': 'integer', 'is_required': False, 'default_value': 1, 'validators': [] }] }
def pivots(self): from shared_schema_tenants_custom_data.helpers.custom_tables_helpers import ( _get_pivot_table_class_for_data_type) definitions = self.table.fields_definitions row_content_type = ContentType.objects.get_for_model(self.__class__) values_list = { d.name: _get_pivot_table_class_for_data_type( d.data_type).objects.get(row_id=self.id, row_content_type=row_content_type) for d in definitions } return values_list
def setUp(self): super(TenantSpecificTableTests, self).setUp() self.table = mommy.make('shared_schema_tenants_custom_data.TenantSpecificTable', tenant=self.tenant) self.fields = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificFieldDefinition', table_id=self.table.id, table_content_type=ContentType.objects.get_for_model(TenantSpecificTable), data_type=TenantSpecificFieldDefinition.DATA_TYPES.integer, default_value='1', tenant=self.tenant, _quantity=10) self.row = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTableRow', table=self.table, tenant=self.tenant) for i, field in enumerate(self.fields): PivotTableClass = _get_pivot_table_class_for_data_type(field.data_type) PivotTableClass.objects.filter(row_id=self.row.id, definition=field).update(value=i + 5)
def create_tenant_specific_fields(self, tenant_specific_fields_data): definitions = self.get_definitions() definitions_by_name = {d.name: d for d in definitions} with transaction.atomic(): for field_name, definition in definitions_by_name.items(): field_value = tenant_specific_fields_data.get( field_name, getattr(self, field_name, None)) PivotTableClass = _get_pivot_table_class_for_data_type( definition.data_type) PivotTableClass.objects.create( definition=definition, row_id=self.id, row_content_type=ContentType.objects.get_for_model( self.__class__), value=field_value)
def update_tenant_specific_fields(self, tenant_specific_fields_data): old = self.__class__.objects.get(pk=self.pk) definitions = self.get_definitions() definitions_by_name = {d.name: d for d in definitions} with transaction.atomic(): for field_name, definition in definitions_by_name.items(): new_value = tenant_specific_fields_data.get(field_name, None) old_value = getattr(old, field_name, None) PivotTableClass = _get_pivot_table_class_for_data_type( definition.data_type) if new_value != old_value: PivotTableClass.objects.filter( definition__id=definition.id, row_id=self.id, row_content_type=ContentType.objects.get_for_model( self.__class__)).update(value=new_value)
def setUp(self): super(TenantSpecificTableRowViewsetTests, self).setUp() self.table = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTable', tenant=self.tenant) self.fields = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificFieldDefinition', table_id=self.table.id, table_content_type=ContentType.objects.get_for_model( TenantSpecificTable), data_type=TenantSpecificFieldDefinition.DATA_TYPES.integer, default_value='1', tenant=self.tenant, _quantity=10) self.row = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTableRow', table=self.table, tenant=self.tenant) for i, field in enumerate(self.fields): PivotTableClass = _get_pivot_table_class_for_data_type( field.data_type) PivotTableClass.objects.filter(row_id=self.row.id, definition=field).update(value=i + 5) self.client.force_authenticate(self.user) self.list_view_url = reverse( 'shared_schema_tenants_custom_data:custom_data_list', kwargs={ 'slug': '_custom_tables__' + self.table.name, }) self.details_view_url = reverse( 'shared_schema_tenants_custom_data:custom_data_details', kwargs={ 'slug': '_custom_tables__' + self.table.name, 'pk': self.row.id, })
def setUp(self): super(TenantSpecificTableRowFormTests, self).setUp() self.table = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTable', tenant=self.tenant) self.validator_gt_2 = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificFieldsValidator', module_path='shared_schema_tenants_custom_data.tests.validators.validator_gt_2') self.fields = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificFieldDefinition', table_id=self.table.id, table_content_type=ContentType.objects.get_for_model(TenantSpecificTable), data_type=TenantSpecificFieldDefinition.DATA_TYPES.integer, default_value='1', tenant=self.tenant, validators=[self.validator_gt_2], _quantity=10) self.row = mommy.make( 'shared_schema_tenants_custom_data.TenantSpecificTableRow', table=self.table, tenant=self.tenant) for i, field in enumerate(self.fields): PivotTableClass = _get_pivot_table_class_for_data_type(field.data_type) PivotTableClass.objects.filter( row_id=self.row.id, definition=field).update(value=i + 5) self.params = {field.name: i + 1000 for i, field in enumerate(self.fields)} set_current_tenant(self.tenant.slug)
def update(self, *args, **kwargs): from shared_schema_tenants_custom_data.helpers.custom_tables_helpers import ( _get_pivot_table_class_for_data_type) definitions = self.get_definitions() definitions_by_name = {d.name: d for d in definitions} custom_fields = { k: v for k, v in kwargs.items() if k in definitions_by_name.keys() } common_fields = { k: v for k, v in kwargs.items() if k not in definitions_by_name.keys() } super(TenantSpecificFieldsQueryset, self).update(**common_fields) for field_name, field_value in custom_fields.items(): PivotTableClass = _get_pivot_table_class_for_data_type( definitions_by_name[field_name].data_type) (PivotTableClass.objects.filter( definition__id=definitions_by_name[field_name].id).update( value=field_value))