def test_assets_render_from_style(): register_style( 'my_style', Style( test, assets__an_asset=Asset.css(attrs__href='http://foo.bar/baz'), )) class MyPage(Page): class Meta: iommi_style = 'my_style' expected = prettify(''' <!DOCTYPE html> <html> <head> <title/> <link href='http://foo.bar/baz' rel="stylesheet"/> </head> <body/> </html> ''') actual = prettify( MyPage().bind(request=req('get')).render_to_response().content) assert actual == expected unregister_style('my_style')
def test_deprecated_assets_style(settings, capsys): settings.DEBUG = True with register_style( 'my_style', Style( test, assets__an_asset=Asset.css(attrs__href='http://foo.bar/baz'), ), ): captured = capsys.readouterr() assert 'Warning: The preferred way to add top level assets config' in captured.out settings.DEBUG = False expected = prettify( ''' <!DOCTYPE html> <html> <head> <title/> <link href='http://foo.bar/baz' rel="stylesheet"/> </head> <body/> </html> ''' ) actual = prettify(Page(iommi_style='my_style').bind(request=req('get')).render_to_response().content) assert actual == expected
def test_assets_render_any_fragment_from_style(): register_style( 'my_style', Style( test, assets__an_asset=Fragment('This is a fragment!'), )) class MyPage(Page): class Meta: iommi_style = 'my_style' expected = prettify(''' <!DOCTYPE html> <html> <head> <title/> This is a fragment! </head> <body/> </html> ''') actual = prettify( MyPage().bind(request=req('get')).render_to_response().content) assert actual == expected unregister_style('my_style')
def test_error_message_for_invalid_style(): class Foo: pass style = Style( ClassThatDoesNotExist__foo='', ClassThatDoesNotExist2__foo='', Foo__shortcuts__does_not_exist__foo='', Foo__shortcuts__does_not_exist2__foo='', ) with pytest.raises(InvalidStyleConfigurationException) as e: validate_styles(additional_classes=[Foo], default_classes=[], styles=dict(foo=style)) assert str(e.value) == ''' Invalid class names: Style: foo - class: ClassThatDoesNotExist Style: foo - class: ClassThatDoesNotExist2 Invalid shortcut names: Style: foo - class: Foo - shortcut: does_not_exist Style: foo - class: Foo - shortcut: does_not_exist2 '''.strip()
def ready(self): register_style( 'forum', Style( base, base_template='iommi/base_forum.html', Form__attrs__class__form=True, Field__attrs__class__field=True, ) )
def test_style(): class A(RefinableObject): foo = Refinable() bar = Refinable() @classmethod @class_shortcut def shortcut1(cls, call_target, **kwargs): return call_target(**kwargs) def items(self): return dict(foo=self.foo, bar=self.bar) class B(A): @classmethod @class_shortcut(call_target__attribute='shortcut1') def shortcut2(cls, call_target, **kwargs): return call_target(**kwargs) base = Style(A=dict(foo=1, ), ) overrides = Style( base, A=dict( shortcuts=dict(shortcut1__foo=4, ), foo=5, bar=6, ), B=dict(bar=7, ), ) # First the unstyled case assert items(B()) == dict(foo=None, bar=None) assert items(B.shortcut1()) == dict(foo=None, bar=None) assert items(B.shortcut2()) == dict(foo=None, bar=None) # Now let's add the style b = B() apply_style_recursively(style_data=overrides.component(b), obj=b) assert items(b) == dict(foo=5, bar=7) b = B.shortcut1() assert overrides.component(b) == dict(foo=4, bar=7) assert b.__tri_declarative_shortcut_stack == ['shortcut1'] apply_style_recursively(style_data=overrides.component(b), obj=b) assert items(b) == dict(foo=4, bar=7) b = B.shortcut2() assert b.__tri_declarative_shortcut_stack == ['shortcut2', 'shortcut1'] assert overrides.component(b) == dict(foo=4, bar=7) apply_style_recursively(style_data=overrides.component(b), obj=b) assert items(b) == dict(foo=4, bar=7)
def test_context_processor_is_called_on_render_root(): style_name = 'test_context_processor_is_called_on_render_root' style = Style( base, base_template='test_context_processor_is_called_on_render_root.html', ) register_style(style_name, style) part = Page( context__root_part_context_variable='root_part_context_variable', iommi_style=style_name, ) t = render_root( part=part.bind(request=req('get')), context=dict(my_context_variable='my_context_variable'), ) assert t == 'context_processor_is_called\nroot_part_context_variable\nmy_context_variable\n'
def test_style_bulk_form_broken_on_no_form(): from iommi import Table from tests.models import Foo with register_style( 'my_style', Style( base, Table__bulk__attrs__class__foo=True, ), ): class MyTable(Table): class Meta: iommi_style = 'my_style' model = Foo table = MyTable() table = table.bind(request=None) assert table.bulk is None
def test_style_bulk_form(): from iommi import Column, Table from tests.models import Foo with register_style( 'my_style', Style( base, Table__bulk__attrs__class__foo=True, ), ): class MyTable(Table): class Meta: iommi_style = 'my_style' model = Foo bar = Column(bulk__include=True) table = MyTable() table = table.bind(request=None) assert 'foo' in render_attrs(table.bulk.attrs)
def ready(self): from django.contrib.auth.models import ( User, Permission, ) register_search_fields(model=User, search_fields=['username']) register_search_fields(model=Permission, search_fields=['codename']) from iommi import register_style from iommi.style_test_base import test from iommi.style_base import base from iommi.style_bootstrap import ( bootstrap, bootstrap_horizontal, ) from iommi.style_semantic_ui import semantic_ui from iommi.style_foundation import foundation register_style('base', base) register_style('test', test) register_style('bootstrap', bootstrap) register_style('bootstrap_horizontal', bootstrap_horizontal) register_style('semantic_ui', semantic_ui) register_style('water', Style(base)) register_style('foundation', foundation)
foundation_base = Style( base, font_awesome_4, sub_styles__horizontal=dict( Form__attrs__class={}, Field=dict( shortcuts=dict( boolean__attrs__class={ 'medium-2': True, 'medium-4': False }, boolean_tristate__attrs__class={ 'medium-2': True, 'medium-4': False }, ), attrs__class={ 'medium-4': True, 'cell': True, }, ), ), root__assets=dict( css=Asset.css(attrs=dict( href= 'https://cdn.jsdelivr.net/npm/[email protected]/dist/css/foundation.min.css', integrity='sha256-ogmFxjqiTMnZhxCqVmcqTvjfe1Y/ec4WaRj/aQPvn+I=', crossorigin='anonymous', ), ), js=Asset. js(attrs__src= 'https://cdn.jsdelivr.net/npm/[email protected]/dist/js/foundation.min.js' ), ), Container=dict( tag='div', attrs__class={ 'grid-container': True, }, ), Action=dict(shortcuts=dict( button__attrs__class__button=True, button__attrs__class__secondary=True, primary__attrs__class__primary=True, primary__attrs__class__secondary=False, delete__attrs__class__alert=True, delete__attrs__class__secondary=False, ), ), Menu=dict( tag='nav', items_container__attrs__class={'menu': True}, items_container__tag='ul', attrs__class={'top-bar': True}, ), MenuItem=dict(tag='li', ), Column=dict(shortcuts=dict(delete__cell__link__attrs__class=dict( alert=True, button=True, )), ), Query=dict( form__iommi_style='horizontal', form_container=dict( tag='span', attrs__class={ 'grid-x': True, 'grid-padding-x': True, }, ), ), Paginator=dict( template='iommi/table/bootstrap/paginator.html', container__attrs__class__pagination=True, active_item__attrs__class={'current': True}, ), Errors=dict(attrs__class=dict(callout=True, alert=True), ), )
base = Style( internal=True, base_template='iommi/base.html', content_block='content', root=dict( endpoints__debug_tree=dict( include=lambda endpoint, **_: iommi_debug_on(), func=endpoint__debug_tree, ), assets=dict( jquery=Asset.js( attrs=dict( src='https://code.jquery.com/jquery-3.4.1.js', integrity= 'sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=', crossorigin='anonymous', ), after=-1, ), axios=Asset.js( attrs=dict( src= 'https://cdn.jsdelivr.net/npm/[email protected]/dist/axios.min.js', integrity= 'sha256-OPn1YfcEh9W2pwF1iSS+yDk099tYj+plSrCS6Esa9NA=', crossorigin='anonymous', ), after=-1, ), ), ), Form=dict( template='iommi/form/form.html', actions_template='iommi/form/actions.html', ), Field=dict( shortcuts=dict( boolean=dict( input__attrs__type='checkbox', template='iommi/form/row_checkbox.html', ), choice=dict( input__template='iommi/form/choice.html', input__attrs__value=None, input__attrs__type=None, ), multi_choice=dict( input__template='iommi/form/choice_select2.html', assets=select2_assets, ), choice_queryset=dict( input__template='iommi/form/choice_select2.html', assets=select2_assets, ), date__input__attrs__type='date', radio=dict(input__template='iommi/form/radio.html', ), heading=dict(template='iommi/form/heading.html', ), ), tag='div', input__attrs__type='text', input__tag='input', label__tag='label', non_editable_input__tag='span', help__attrs__class__helptext=True, help__tag='div', ), Column=dict( shortcuts=dict(select=dict(header__attrs__title='Select all', ), )), Paginator=dict( show_always=False, template='iommi/table/paginator.html', ), Query=dict( template='iommi/query/form.html', advanced__template='iommi/query/advanced.html', assets__ajax_enhance__template='iommi/query/ajax_enhance.html', form__attrs__class__iommi_filter=True, ), Actions=dict( tag='div', attrs__class__links=True, ), MenuItem=dict( a__tag='a', active_class='active', ), DebugMenu=dict( tag='nav', items_container__tag='ul', items_container__attrs__style={ 'list-style': 'none', }, attrs__style={ 'position': 'fixed', 'bottom': '-1px', 'right': '-1px', 'background': 'white', 'border': '1px solid black', 'z-index': '100', }, attrs__class={ 'flex-column': False, }, ), LiveEditPage__iommi_style='bootstrap', )
from iommi.style import Style from iommi.style_base import base from iommi.style_font_awesome_4 import font_awesome_4 test = Style( base, font_awesome_4, Field=dict(shortcuts=dict(), ), Table=dict(attrs__class__table=True, ), Column=dict(shortcuts__number__cell__attrs__class__rj=True, ), Paginator=dict(template='iommi/table/bootstrap/paginator.html', ), Menu=dict(tag='nav', items_container__tag='ul'), MenuItem=dict( tag='li', a__attrs__class={'link': True}, ), )
bootstrap_base = Style( base, assets=dict( css=Asset.css( attrs=dict( href='https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css', integrity='sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh', crossorigin='anonymous', ), ), popper_js=Asset.js( attrs=dict( src='https://cdn.jsdelivr.net/npm/[email protected]/dist/umd/popper.min.js', integrity='sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo', crossorigin='anonymous', ) ), js=Asset.js( attrs=dict( src='https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js', integrity='sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6', crossorigin='anonymous', ) ), ), Container=dict( tag='div', attrs__class={ 'container': True, 'mt-5': True, 'pt-5': True, }, ), Field=dict( shortcuts=dict( boolean=dict( input__attrs__class={'form-check-input': True, 'form-control': False}, attrs__class={'form-check': True}, label__attrs__class={'form-check-label': True}, template='iommi/form/bootstrap/row_checkbox.html', ), radio=dict( attrs__class={ 'form-group': False, 'form-check': True, }, input__attrs__class={ 'form-check-input': True, 'form-control': False, }, ), ), attrs__class={ 'form-group': True, }, input__attrs__class={ 'form-control': True, 'is-invalid': lambda field, **_: bool(field.errors), }, errors__attrs__class={'invalid-feedback': True}, help__attrs__class={ 'form-text': True, 'text-muted': True, }, ), Action=dict( shortcuts=dict( # In bootstrap one must choose a button style (secondary, success, ...) # otherwise the styling is roughly identical to text. button__attrs__class={ 'btn': True, 'btn-secondary': True, }, primary__attrs__class={ 'btn-primary': True, 'btn-secondary': False, }, delete__attrs__class={ 'btn-danger': True, 'btn-secondary': False, }, ), ), Table=dict( attrs__class__table=True, attrs__class={'table-sm': True}, ), Column=dict( header__attrs__class={'text-nowrap': True}, shortcuts=dict( select=dict( header__attrs__title='Select all', header__attrs__class={'text-center': True}, cell__attrs__class={'text-center': True}, ), number=dict( cell__attrs__class={'text-right': True}, header__attrs__class={'text-right': True}, ), boolean__cell__attrs__class={'text-center': True}, delete=dict( cell__link__attrs__class={'text-danger': True}, ), ) ), Query=dict( form__iommi_style='bootstrap_horizontal', form_container=dict( tag='span', attrs__class={ 'form-row': True, 'align-items-center': True, }, ), ), Menu=dict( tag='nav', attrs__class={ 'navbar': True, 'navbar-expand-lg': True, 'navbar-dark': True, 'bg-primary': True, }, items_container__attrs__class={'navbar-nav': True}, items_container__tag='ul' ), MenuItem=dict( tag='li', a__attrs__class={'nav-link': True}, attrs__class={'nav-item': True}, ), Paginator=dict( template='iommi/table/bootstrap/paginator.html', container__attrs__class__pagination=True, active_item__attrs__class={'page-item': True, 'active': True}, link__attrs__class={'page-link': True}, item__attrs__class={'page-item': True}, ), Errors=dict( attrs__class={'text-danger': True}, ), DebugMenu=dict( attrs__class={ 'bg-primary': False, 'navbar': False, 'navbar-dark': False, } ), Admin=dict( parts__menu=dict( # tag='foo', # TODO: This styling is ignored. We should be able to do this. attrs__class={ 'fixed-top': True, }, ), ), Errors__attrs__class={'with-errors': True}, )
bootstrap_base = Style( base, base_template='iommi/base_bootstrap.html', Container=dict( tag='div', attrs__class={ 'container': True, 'mt-5': True, 'pt-5': True, }, ), Field=dict( shortcuts=dict( boolean=dict( input__attrs__class={ 'form-check-input': True, 'form-control': False }, attrs__class={'form-check': True}, label__attrs__class={'form-check-label': True}, template='iommi/form/bootstrap/row_checkbox.html', ), radio=dict( attrs__class={ 'form-group': False, 'form-check': True, }, input__attrs__class={ 'form-check-input': True, 'form-control': False, }, ), ), attrs__class={ 'form-group': True, }, input__attrs__class={ 'form-control': True, }, errors__attrs__class={'invalid-feedback': True}, template='iommi/form/bootstrap/row.html', errors__template='iommi/form/bootstrap/errors.html', help__attrs__class={ 'form-text': True, 'text-muted': True, }, ), Action=dict(shortcuts=dict( button__attrs__class={ 'btn': True, 'btn-primary': True, }, delete__attrs__class={ 'btn-primary': False, 'btn-danger': True, }, ), ), Table=dict( attrs__class__table=True, attrs__class={'table-sm': True}, ), Column=dict(header__attrs__class={'text-nowrap': True}, shortcuts=dict( select=dict( header__attrs__title='Select all', header__attrs__class={'text-center': True}, cell__attrs__class={'text-center': True}, ), number=dict( cell__attrs__class={'text-right': True}, header__attrs__class={'text-right': True}, ), boolean__cell__attrs__class={'text-center': True}, delete=dict(cell__link__attrs__class={'text-danger': True}, ), )), Query=dict( form__iommi_style='bootstrap_horizontal', form_container=dict( tag='span', attrs__class={ 'form-row': True, 'align-items-center': True, }, ), ), Menu=dict(tag='nav', attrs__class={ 'navbar': True, 'navbar-expand-lg': True, 'navbar-dark': True, 'bg-primary': True, }, items_container__attrs__class={'navbar-nav': True}, items_container__tag='ul'), MenuItem=dict( tag='li', a__attrs__class={'nav-link': True}, attrs__class={'nav-item': True}, ), Paginator=dict( template='iommi/table/bootstrap/paginator.html', container__attrs__class__pagination=True, active_item__attrs__class={ 'page-item': True, 'active': True }, link__attrs__class={'page-link': True}, item__attrs__class={'page-item': True}, ), Errors=dict(attrs__class={'text-danger': True}, ), DebugMenu=dict(attrs__class={ 'bg-primary': False, 'navbar': False, 'navbar-dark': False, }), Admin=dict( parts__menu=dict( # tag='foo', # TODO: This styling is ignored. We should be able to do this. attrs__class={ 'fixed-top': True, }, ), ), )
test = Style( base, font_awesome_4, internal=True, root__assets=dict( jquery=None, select2_js=None, select2_css=None, icons=None, axios=None, ), Field=dict( shortcuts=dict( ), ), Table=dict( attrs__class__table=True, ), Column=dict( shortcuts__number__cell__attrs__class__rj=True, ), Paginator=dict( template='iommi/table/bootstrap/paginator.html', ), Menu=dict( tag='nav', items_container__tag='ul' ), MenuItem=dict( tag='li', a__attrs__class={'link': True}, ), )
base = Style( content_block='content', Form=dict( template='iommi/form/form.html', actions_template='iommi/form/actions.html', ), Field=dict( shortcuts=dict( boolean=dict( input__attrs__type='checkbox', template='iommi/form/row_checkbox.html', ), choice=dict( input__template='iommi/form/choice.html', input__attrs__value=None, input__attrs__type=None, ), multi_choice=dict( input__template='iommi/form/choice_select2.html', ), choice_queryset=dict( input__template='iommi/form/choice_select2.html', ), radio=dict( input__template='iommi/form/radio.html', ), heading=dict( template='iommi/form/heading.html', ), ), input__attrs__type='text', input__tag='input', label__tag='label', non_editable_input__tag='span', help__attrs__class__helptext=True, help__tag='div', template='iommi/form/row.html', errors__template='iommi/form/errors.html', ), Column=dict( shortcuts=dict( select=dict( header__attrs__title='Select all', ), ) ), Paginator=dict( show_always=False, template='iommi/table/paginator.html', ), Query=dict( template='iommi/query/form.html', ), Actions=dict( tag='div', attrs__class__links=True, ), MenuItem=dict( a__tag='a', active_class='active', ), DebugMenu=dict( tag='nav', items_container__tag='ul', items_container__attrs__style={ 'list-style': 'none', }, attrs__style={ 'position': 'fixed', 'bottom': '-1px', 'right': '-1px', 'background': 'white', 'border': '1px solid black', 'z-index': '100', }, attrs__class={ 'flex-column': False, }, ), )
from iommi.style import Style font_awesome_4 = Style(Column__shortcuts=dict( icon__extra=dict( icon_attrs__class={ 'fa': True, 'fa-lg': True }, icon_prefix='fa-', ), edit__extra__icon='pencil-square-o', delete__extra__icon='trash-o', download__extra__icon='download', ), )
semantic_ui_base = Style( base, base_template='iommi/base_semantic_ui.html', Container=dict( tag='div', attrs__class={ 'ui': True, 'main': True, 'container': True, }, ), Form=dict( attrs__class=dict( ui=True, form=True, error=True, # semantic ui hides error messages otherwise ), ), Field=dict(shortcuts=dict( boolean=dict(template='iommi/form/semantic_ui/row_checkbox.html', ), radio=dict( input__template='iommi/form/semantic_ui/radio.html', attrs__class={'grouped fields': True}, ), ), attrs__class__field=True, template='iommi/form/semantic_ui/row.html', errors__template='iommi/form/semantic_ui/errors.html', help__attrs__class=dict( ui=True, pointing=True, label=True, )), Action=dict(shortcuts=dict( button__attrs__class={ 'ui': True, 'button': True, }, delete__attrs__class__negative=True, ), ), Table=dict( attrs__class__table=True, attrs__class__ui=True, attrs__class__celled=True, attrs__class__sortable=True, ), Column=dict(shortcuts=dict( select=dict(header__attrs__title='Select all', ), number=dict( cell__attrs__class={ 'ui': True, 'container': True, 'fluid': True, 'right aligned': True, }, header__attrs__class={ 'ui': True, 'container': True, 'fluid': True, 'right aligned': True, }, ), )), Query=dict( form__attrs__class__fields=True, form_container=dict( tag='span', attrs__class={ 'ui form': True, 'fields': True, }, ), ), Menu=dict( attrs__class=dict( ui=True, menu=True, ), tag='div', ), MenuItem__a__attrs__class__item=True, Paginator=dict(template='iommi/table/semantic_ui/paginator.html', item__attrs__class__item=True, attrs__class=dict( ui=True, pagination=True, menu=True, ), active_item__attrs__class=dict( item=True, active=True, )), )
semantic_ui_base = Style( base, root__assets=dict( css=html.link(attrs=dict( rel='stylesheet', href= 'https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css', integrity='sha256-9mbkOfVho3ZPXfM7W8sV2SndrGDuh7wuyLjtsWeTI1Q=', crossorigin='anonymous', ), ), js=html.script(attrs=dict( src= 'https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js', integrity='sha256-t8GepnyPmw9t+foMh3mKNvcorqNHamSKtKRxxpUEgFI=', crossorigin='anonymous', ), ), ), Container=dict( tag='div', attrs__class={ 'ui': True, 'main': True, 'container': True, }, ), Form=dict( attrs__class=dict( ui=True, form=True, error=True, # semantic ui hides error messages otherwise ), ), Field=dict(shortcuts=dict( boolean=dict(template='iommi/form/semantic_ui/row_checkbox.html', ), radio=dict( input__template='iommi/form/semantic_ui/radio.html', attrs__class={'grouped fields': True}, ), ), attrs__class__field=True, help__attrs__class=dict( ui=True, pointing=True, label=True, )), Action=dict(shortcuts=dict( button__attrs__class={ 'ui': True, 'button': True, }, primary__attrs__class__primary=True, delete__attrs__class__negative=True, ), ), Table=dict( attrs__class__table=True, attrs__class__ui=True, attrs__class__celled=True, attrs__class__sortable=True, ), Column=dict(shortcuts=dict( select=dict(header__attrs__title='Select all', ), number=dict( cell__attrs__class={ 'ui': True, 'container': True, 'fluid': True, 'right aligned': True, }, header__attrs__class={ 'ui': True, 'container': True, 'fluid': True, 'right aligned': True, }, ), )), Query=dict( form__attrs__class__fields=True, form_container=dict( tag='span', attrs__class={ 'ui form': True, 'fields': True, }, ), ), Menu=dict( attrs__class=dict( ui=True, menu=True, ), tag='div', ), MenuItem__a__attrs__class__item=True, Paginator=dict(template='iommi/table/semantic_ui/paginator.html', item__attrs__class__item=True, attrs__class=dict( ui=True, pagination=True, menu=True, ), active_item__attrs__class=dict( item=True, active=True, )), Errors__attrs__class=dict( ui=True, error=True, message=True, ), )
from iommi.style import Style from iommi.style_base import base from iommi.asset import Asset water = Style( base, assets__css=Asset.css( attrs=dict( href='https://cdn.jsdelivr.net/gh/kognise/water.css@latest/dist/dark.min.css', ), ), )
bulma_base = Style( base, root__assets=dict( css=Asset.css( attrs__href= 'https://cdn.jsdelivr.net/npm/[email protected]/css/bulma.min.css', ), navbar_burger_click_js=navbar_burger_click_js, ), sub_styles__horizontal=dict(Field=dict( attrs__class={ 'mr-4': True, }, label__attrs__class={ 'mt-2': True, 'mr-1': True, }, ), ), Header__attrs__class={ 'title': True, 'is-1': lambda fragment, **_: fragment.tag == 'h1', 'is-2': lambda fragment, **_: fragment.tag == 'h2', 'is-3': lambda fragment, **_: fragment.tag == 'h3', 'is-4': lambda fragment, **_: fragment.tag == 'h4', 'is-5': lambda fragment, **_: fragment.tag == 'h5', 'is-6': lambda fragment, **_: fragment.tag == 'h6', }, Container=dict( tag='div', attrs__class={ 'main': True, 'container': True, }, ), Field=dict( shortcuts=dict( boolean=dict( input__attrs__class__input=False, label__attrs__class__checkbox=True, label__attrs__class__label=False, ), textarea=dict( input__attrs__class__input=False, input__attrs__class__textarea=True, ), radio=dict(input__attrs__class__input=False, ), ), attrs__class__field=True, template='iommi/form/bulma/field.html', label__attrs__class__label=True, input__attrs__class__input=True, input__attrs__class={ 'is-danger': lambda field, **_: bool(field.errors), }, errors__attrs__class={ 'is-danger': True, 'help': True, }, help__attrs__class=dict(help=True, ), ), Actions=dict( tag="div", attrs__class=dict(links=False, buttons=True), ), Action=dict( shortcuts=dict( # In bulma the most neutral button styling is button, which # gets you a button that's just an outline. button__attrs__class={ 'button': True, }, delete__attrs__class={ 'is-danger': True, }, primary__attrs__class={ 'is-primary': True, }, ), ), Table={ 'attrs__class__table': True, 'attrs__class__is-fullwidth': True, 'attrs__class__is-hoverable': True, }, Column=dict(shortcuts=dict( select=dict(header__attrs__title='Select all', ), number=dict( cell__attrs__class={ 'has-text-right': True, }, header__attrs__class={ 'has-text-right': True, }, ), ), ), Query__form_container=dict( tag='span', attrs__class={ 'is-horizontal': True, 'field': True, }, ), Menu=dict( attrs__class__navbar=True, tag='nav', ), MenuItem__a__attrs__class={'navbar-item': True}, MenuItem__active_class='is-active', DebugMenu=dict( tag='aside', attrs__class={ 'navbar': False, 'menu': True, }, ), Paginator=dict(template='iommi/table/bulma/paginator.html', ), Errors__attrs__class={ 'help': True, 'is-danger': True, }, )
from iommi.style import ( Style, ) from iommi.style_font_awesome_4 import font_awesome_4 from iommi.style_base import base foundation = Style( base, font_awesome_4, Action=dict(shortcuts=dict( button__attrs__class__button=True, delete__attrs__class__alert=True, ), ), Menu=dict(tag='nav', items_container__attrs__class={'menu': True}, items_container__tag='ul'), MenuItem=dict(tag='li', ), )
from iommi.style import ( Style, ) from iommi.style_font_awesome_4 import font_awesome_4 from iommi.style_base import base django_admin_base = Style( base, font_awesome_4, Container=dict( tag='div', attrs__class={ 'container': True, }, ), base_template='iommi/base_django_admin.html', Table__attrs__id='changelist', Query__form__iommi_style='django_admin_horizontal', ) django_admin = Style( django_admin_base, Field__attrs__class={'form-row': True}, Form__attrs__class=dict(aligned=True, ), Form__attrs__id='content', Table__actions__attrs__class={'object-tools': True}, Table__outer__tag='div', Table__outer__attrs__id='content', Table__bulk__attrs__id=None, Admin__parts__header__attrs__id='header', )
base = Style( base_template='iommi/base.html', content_block='content', assets=dict( jquery=Asset.js( attrs=dict( src='https://code.jquery.com/jquery-3.4.1.js', integrity='sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=', crossorigin='anonymous', ), after=-1, ), ), Form=dict( template='iommi/form/form.html', actions_template='iommi/form/actions.html', ), Field=dict( shortcuts=dict( boolean=dict( input__attrs__type='checkbox', template='iommi/form/row_checkbox.html', ), choice=dict( input__template='iommi/form/choice.html', input__attrs__value=None, input__attrs__type=None, ), multi_choice=dict( input__template='iommi/form/choice_select2.html', assets=select2_assets, ), choice_queryset=dict( input__template='iommi/form/choice_select2.html', assets=select2_assets, ), date__input__attrs__type='date', radio=dict( input__template='iommi/form/radio.html', ), heading=dict( template='iommi/form/heading.html', ), ), tag='div', input__attrs__type='text', input__tag='input', label__tag='label', non_editable_input__tag='span', help__attrs__class__helptext=True, help__tag='div', ), Column=dict( shortcuts=dict( select=dict( header__attrs__title='Select all', ), ) ), Paginator=dict( show_always=False, template='iommi/table/paginator.html', ), Query=dict( template='iommi/query/form.html', ), Actions=dict( tag='div', attrs__class__links=True, ), MenuItem=dict( a__tag='a', active_class='active', ), DebugMenu=dict( tag='nav', items_container__tag='ul', items_container__attrs__style={ 'list-style': 'none', }, attrs__style={ 'position': 'fixed', 'bottom': '-1px', 'right': '-1px', 'background': 'white', 'border': '1px solid black', 'z-index': '100', }, attrs__class={ 'flex-column': False, }, ), )
bulma_base = Style( base, base_template='iommi/base_bulma.html', Header__attrs__class={ 'title': True, 'is-1': lambda fragment, **_: fragment.tag == 'h1', 'is-2': lambda fragment, **_: fragment.tag == 'h2', 'is-3': lambda fragment, **_: fragment.tag == 'h3', 'is-4': lambda fragment, **_: fragment.tag == 'h4', 'is-5': lambda fragment, **_: fragment.tag == 'h5', 'is-6': lambda fragment, **_: fragment.tag == 'h6', }, Container=dict( tag='div', attrs__class={ 'main': True, 'container': True, }, ), Field=dict(shortcuts=dict( boolean=dict( input__attrs__class__input=False, label__attrs__class__checkbox=True, label__attrs__class__label=False, ), textarea=dict( input__attrs__class__input=False, input__attrs__class__textarea=True, ), radio=dict(input__attrs__class__input=False, ), ), attrs__class__field=True, template='iommi/form/bulma/row.html', label__attrs__class__label=True, input__attrs__class__input=True, errors__template='iommi/form/bulma/errors.html', help__attrs__class=dict(help=True, )), Action=dict(shortcuts=dict( button__attrs__class={ 'button': True, }, delete__attrs__class={ 'button': True, 'is-danger': True, }, ), ), Table={ 'attrs__class__table': True, 'attrs__class__is-fullwidth': True, 'attrs__class__is-hoverable': True, }, Column=dict(shortcuts=dict( select=dict(header__attrs__title='Select all', ), number=dict( cell__attrs__class={ 'has-text-right': True, }, header__attrs__class={ 'has-text-right': True, }, ), ), ), Query__form=dict( iommi_style='bulma_horizontal', attrs__class__content=True, ), Query__form_container=dict( tag='span', attrs__class={ 'is-horizontal': True, 'field': True, }, ), Menu=dict( attrs__class__navbar=True, tag='nav', ), MenuItem__a__attrs__class={'navbar-item': True}, MenuItem__active_class='is-active', DebugMenu=dict( tag='aside', attrs__class={ 'navbar': False, 'menu': True, }, ), Paginator=dict(template='iommi/table/bulma/paginator.html', ), )
django_admin_base = Style( base, font_awesome_4, root__assets=dict( css_base=html.link(attrs=dict(rel="stylesheet", type="text/css", href="/static/admin/css/base.css")), css_login=html.link(attrs=dict(rel="stylesheet", type="text/css", href="/static/admin/css/login.css")), css_forms=html.link(attrs=dict(rel="stylesheet", type="text/css", href="/static/admin/css/forms.css")), meta=html.meta( attrs=dict( name="viewport", content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0" ) ), css_responsive=html.link( attrs=dict(rel="stylesheet", type="text/css", href="/static/admin/css/responsive.css") ), css_extra=html.style( """ .compact-form-row { display: inline-block; } .compact-form-row .helptext { display: none; } """ ), ), Container=dict( tag='div', attrs__class={ 'container': True, }, ), Table__attrs__id='changelist', Query__form__iommi_style='django_admin_horizontal', )
from iommi.style import Style from iommi.fragment import html font_awesome_4 = Style( root__assets__icons=html.link( attrs__rel="stylesheet", attrs__href= "https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css", ), Column__shortcuts=dict( icon__extra=dict( icon_attrs__class={ 'fa': True, 'fa-lg': True }, icon_prefix='fa-', ), edit__extra__icon='pencil-square-o', delete__extra__icon='trash-o', download__extra__icon='download', ), )
from iommi.style import Style from iommi.style_base import base water = Style( base, base_template='iommi/base_water.html', )