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
Beispiel #2
0
    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
Beispiel #4
0
    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)
Beispiel #7
0
    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,
            })
Beispiel #8
0
    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))