def __init__(self, *, _parts_dict: Dict[str, PartType] = None, parts: dict, **kwargs): super(Page, self).__init__(**kwargs) self.parts = { } # This is just so that the repr can survive if it gets triggered before parts is set properly # First we have to up sample parts that aren't Part into Fragment def as_fragment_if_needed(k, v): if v is None: return None if not isinstance(v, (dict, Traversable)): return Fragment(children__text=v, _name=k) else: return v _parts_dict = { k: as_fragment_if_needed(k, v) for k, v in items(_parts_dict) } parts = Namespace( {k: as_fragment_if_needed(k, v) for k, v in items(parts)}) collect_members(self, name='parts', items=parts, items_dict=_parts_dict, cls=self.get_meta().member_class)
def __init__(self, *, _fruits_dict, fruits, **kwargs): super(Basket, self).__init__(**kwargs) collect_members(self, name='fruits', items_dict=_fruits_dict, items=fruits, cls=Fruit)
def __init__(self, *, endpoints: Dict[str, Any] = None, include, **kwargs): super(Part, self).__init__(include=include, **kwargs) collect_members(self, name='endpoints', items=endpoints, cls=Endpoint) if iommi_debug_on(): import inspect self._instantiated_at_frame = inspect.currentframe().f_back
def __init__(self, text=None, *, children: Optional[Dict[str, PartType]] = None, **kwargs): super(Fragment, self).__init__(**kwargs) if text is not None: setdefaults_path( children, text=text, ) collect_members(self, name='children', items=children, cls=Fragment, unknown_types_fall_through=True)
def __init__(self, fruits=None, fruits_dict=None, unknown_types_fall_through=False): super(Basket, self).__init__() collect_members(container=self, name='fruits', items=fruits, items_dict=fruits_dict, cls=Fruit, unknown_types_fall_through=unknown_types_fall_through)
def __init__(self, sub_menu, _sub_menu_dict=None, **kwargs): super(MenuBase, self).__init__(**kwargs) self._active = False collect_members( self, name='sub_menu', items=sub_menu, # TODO: cls=self.get_meta().member_class, items_dict=_sub_menu_dict, cls=MenuItem, )
def __init__(self, *, instance=None, fields: Dict[str, Field] = None, _fields_dict: Dict[str, Field] = None, actions: Dict[str, Any] = None, model=None, auto=None, title=MISSING, **kwargs): if auto: auto = FormAutoConfig(**auto) assert not _fields_dict, "You can't have an auto generated Form AND a declarative Form at the same time" assert not model, "You can't use the auto feature and explicitly pass model. Either pass auto__model, or we will set the model for you from auto__instance" assert not instance, "You can't use the auto feature and explicitly pass instance. Pass auto__instance (None in the create case)" if auto.model is None: auto.model = auto.instance.__class__ model, fields = self._from_model( model=auto.model, fields=fields, include=auto.include, exclude=auto.exclude, ) instance = auto.instance if title is MISSING and auto.type is not None: title = f'{auto.type.title()} {model._meta.verbose_name}' setdefaults_path( actions, submit__display_name=title, ) super(Form, self).__init__(model=model, title=title, **kwargs) assert isinstance(fields, dict) self.fields = None self.errors: Set[str] = set() self._valid = None self.instance = instance self.mode = INITIALS_FROM_GET collect_members(self, name='actions', items=actions, cls=self.get_meta().action_class) collect_members(self, name='fields', items=fields, items_dict=_fields_dict, cls=self.get_meta().member_class)
def __init__(self, *, model=None, rows=None, filters=None, _filters_dict=None, auto, **kwargs): assert isinstance(filters, dict) if auto: auto = QueryAutoConfig(**auto) auto_model, auto_rows, filters = self._from_model( model=auto.model, rows=auto.rows, filters=filters, include=auto.include, exclude=auto.exclude, ) assert model is None, "You can't use the auto feature and explicitly pass model. " \ "Either pass auto__model, or we will set the model for you from auto__rows" model = auto_model if rows is None: rows = auto_rows model, rows = model_and_rows(model, rows) setdefaults_path( kwargs, form__call_target=self.get_meta().form_class, ) self._form = None self.query_advanced_value = None self.query_error = None super(Query, self).__init__(model=model, rows=rows, **kwargs) collect_members(self, name='filters', items=filters, items_dict=_filters_dict, cls=self.get_meta().member_class) field_class = self.get_meta().form_class.get_meta().member_class declared_fields = Struct() declared_fields[FREETEXT_SEARCH_NAME] = field_class( _name=FREETEXT_SEARCH_NAME, display_name='Search', required=False, include=False, ) for name, filter in items(declared_members(self).filters): if filter.attr is None and getattr(filter.value_to_q, 'iommi_needs_attr', False): continue field = setdefaults_path( Namespace(), filter.field, _name=name, model_field=filter.model_field, attr=name if filter.attr is MISSING else filter.attr, call_target__cls=field_class, ) declared_fields[name] = field() # noinspection PyCallingNonCallable self.form: Form = self.form( _name='form', _fields_dict=declared_fields, attrs__method='get', actions__submit__attrs__value='Filter', ) declared_members(self).form = self.form self.advanced_simple_toggle = Action( attrs__href='#', attrs__class__iommi_query_toggle_simple_mode=True, attrs={'data-advanced-mode': 'simple'}, display_name='Switch to advanced search', ) self.form_container = self.form_container() # Filters need to be at the end to not steal the short names set_declared_member(self, 'filters', declared_members(self).pop('filters'))
def __init__(self, *, model=None, rows=None, filters=None, _filters_dict=None, auto=None, **kwargs): assert isinstance(filters, dict) if auto: auto = QueryAutoConfig(**auto) auto_model, auto_rows, filters = self._from_model( model=auto.model, rows=auto.rows, filters=filters, include=auto.include, exclude=auto.exclude, ) assert model is None, "You can't use the auto feature and explicitly pass model. " \ "Either pass auto__model, or we will set the model for you from auto__rows" model = auto_model if rows is None: rows = auto_rows model, rows = model_and_rows(model, rows) setdefaults_path( kwargs, form__call_target=self.get_meta().form_class, ) self.query_advanced_value = None self.query_error = None # Here we need to remove the freetext config from kwargs because we want to # handle it differently from the other fields. # BUT It's not safe to modify kwargs deeply! Because reinvoke() is evil: # It will call init again with the same kwargs + whatever additional kwargs # might have come from a parent or styling info. freetext_config = kwargs.get('form', {}).get('fields', {}).get('freetext', {}) if 'form' in kwargs and 'fields' in kwargs[ 'form'] and 'freetext' in kwargs['form']['fields']: # copy (just) the namespace so we can safely remove freetext from it kwargs = Namespace(flatten(Namespace(kwargs))) freetext_config = kwargs.get('form', {}).get('fields', {}).pop('freetext', {}) super(Query, self).__init__(model=model, rows=rows, **kwargs) collect_members(self, name='filters', items=filters, items_dict=_filters_dict, cls=self.get_meta().member_class) field_class = self.get_meta().form_class.get_meta().member_class declared_fields = Struct() declared_fields[FREETEXT_SEARCH_NAME] = field_class( _name=FREETEXT_SEARCH_NAME, display_name=gettext('Search'), required=False, include=False, help__include=False, **freetext_config) for name, filter in items(declared_members(self).filters): field = setdefaults_path( Namespace(), filter.field, _name=name, model_field=filter.model_field, attr=name if filter.attr is MISSING else filter.attr, call_target__cls=field_class, help__include=False, ) declared_fields[name] = field() # noinspection PyCallingNonCallable self.form: Form = self.form( _name='form', _fields_dict=declared_fields, attrs__method='get', actions__submit=dict( attrs={'data-iommi-filter-button': ''}, display_name=gettext('Filter'), ), ) declared_members(self).form = self.form self.advanced = declared_members(self).advanced = self.advanced( _name='advanced') self.form_container = self.form_container(_name='form_container') # Filters need to be at the end to not steal the short names set_declared_member(self, 'filters', declared_members(self).pop('filters'))
def __init__(self, actions): super(ThingWithActions, self).__init__() collect_members(self, name='actions', items=actions, cls=MyFancyAction)