def test_namespace_flatten_loop_detection(): n1 = Namespace() n1.foo = n1 n1.bar = 'baz' n2 = Namespace() n2.buzz = n1 assert {'buzz__bar': 'baz'} == flatten(n2)
def prepare(self, request): if self._has_prepared: return self.request = request def bind_columns(): for index, column in enumerate(self.columns): values = evaluate_recursive(Struct(column), table=self, column=column) values = setdefaults_path( Struct(), self.column.get(column.name, {}), values, column=column, table=self, index=index ) yield BoundColumn(**values) self.bound_columns = list(bind_columns()) self.bound_column_by_name = OrderedDict( (bound_column.name, bound_column) for bound_column in self.bound_columns ) self._has_prepared = True self._prepare_evaluate_members() self._prepare_sorting() headers = self._prepare_headers() if self.model: def generate_variables(): for column in self.bound_columns: if column.query.show: query_kwargs = setdefaults_path( Struct(), column.query, dict( name=column.name, gui__label=column.display_name, attr=column.attr, model=column.table.model, ), {"class": Variable}, ) yield query_kwargs.pop("class")(**query_kwargs) variables = list(generate_variables()) self.query = Query( request=request, variables=variables, endpoint_dispatch_prefix="__".join( part for part in [self.endpoint_dispatch_prefix, "query"] if part is not None ), **flatten(self.query_args) ) self.query_form = self.query.form() if self.query.variables else None self.query_error = "" if self.query_form: try: self.data = self.data.filter(self.query.to_q()) except QueryException as e: self.query_error = str(e) def generate_bulk_fields(): for column in self.bound_columns: if column.bulk.show: bulk_kwargs = setdefaults_path( Struct(), column.bulk, dict( name=column.name, attr=column.attr, required=False, empty_choice_tuple=(None, "", "---", True), model=self.model, ), {"class": Field.from_model}, ) if bulk_kwargs["class"] == Field.from_model: bulk_kwargs["field_name"] = column.attr yield bulk_kwargs.pop("class")(**bulk_kwargs) bulk_fields = list(generate_bulk_fields()) self.bulk_form = ( Form( data=request.POST, fields=bulk_fields, endpoint_dispatch_prefix="__".join( part for part in [self.endpoint_dispatch_prefix, "bulk"] if part is not None ), **flatten(self.bulk) ) if bulk_fields else None ) self._prepare_auto_rowspan() return headers, self.header_levels
def test_flatten_identity_on_namespace_should_not_trigger_loop_detection(): foo = Namespace(show=True) assert dict(party1_labels__show=True, party2_labels__show=True) == flatten(Namespace(party1_labels=foo, party2_labels=foo))
def test_flatten_broken(): assert dict(party1_labels__show=True, party2_labels__show=True) == flatten(Namespace(party1_labels=Namespace(show=True), party2_labels=Namespace(show=True)))
def test_namespace_funcal(): def f(**kwargs): assert {'a': 1, 'b__c': 2, 'b__d': 3} == kwargs f(**flatten(Namespace(a=1, b=Namespace(c=2, d=3))))
def test_namespace_flatten(): actual = flatten(Namespace(a=1, b=2, c=Namespace(d=3, e=Namespace(f=4)))) expected = dict(a=1, b=2, c__d=3, c__e__f=4) assert actual == expected
def test_merge(a, b, expected, backward): if backward: a, b = b, a actual = Namespace(flatten(a), flatten(b)) assert expected == actual
def test_flatten_identity_on_namespace_should_not_trigger_loop_detection(): foo = Namespace(show=True) assert dict(party1_labels__show=True, party2_labels__show=True) == flatten( Namespace(party1_labels=foo, party2_labels=foo))
def test_flatten_broken(): assert dict(party1_labels__show=True, party2_labels__show=True) == flatten( Namespace(party1_labels=Namespace(show=True), party2_labels=Namespace(show=True)))