def test_render_enhanced_options(self): name = 'stuffs' Choice = UnorderedMultipleChoiceWidget.Choice select = UnorderedMultipleChoiceWidget( choices=[ (Choice(value=1, disabled=True, help='is disabled'), 'Choice #1'), (Choice(value=2), 'Choice #2'), (Choice(value=3, readonly=True, help='is readonly'), 'Choice #3'), ], viewless=False, ) html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect" > <select multiple="multiple" class="ui-creme-input" name="{name}"> <option value="1" disabled help="is disabled">Choice #1</option> <option value="2" help="">Choice #2</option> <option value="3" readonly help="is readonly">Choice #3</option> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all">{check_all}</a> <a type="button" class="checklist-check-none">{check_none}</a> </div> <div class="checklist-body"><ul class="checklist-content"></ul></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), ) self.assertHTMLEqual(html, select.render(name, ()))
def test_render_empty_with_creation(self): name = 'field_1' url = '/add/stuff' select = UnorderedMultipleChoiceWidget( creation_url=url, creation_allowed=True, viewless=False, ) self.assertTrue(select.creation_allowed) html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect" > <select multiple="multiple" class="ui-creme-input" name="{name}"> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all hidden">{check_all}</a> <a type="button" class="checklist-check-none hidden">{check_none}</a> <a type="button" class="checklist-create" href="{create_url}">{create_lbl}</a> </div> <div class="checklist-body"><ul class="checklist-content"></ul></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), create_url=url, create_lbl=_('Create'), ) self.assertHTMLEqual(html, select.render(name, (), attrs={'checkall': True}))
def test_render_creation_not_allowed(self): name = 'field_1' select = UnorderedMultipleChoiceWidget( choices=[('a', '#1'), ('b', '#2')], creation_url='/add', creation_allowed=False, viewless=False, ) html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect" > <select multiple="multiple" class="ui-creme-input" name="{name}"> <option value="a">#1</option> <option value="b">#2</option> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all hidden">{check_all}</a> <a type="button" class="checklist-check-none hidden">{check_none}</a> <a type="button" class="checklist-create" disabled href="{create_url}">{create_lbl}</a> </div> <div class="checklist-body"><ul class="checklist-content"></ul></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), create_url='/add', create_lbl=_('Create'), ) self.assertHTMLEqual(html, select.render(name, ()))
def test_render_less01(self): name = 'my_choice_field' select = UnorderedMultipleChoiceWidget( choices=[(1, 'A'), (2, 'B'), (3, 'C')], viewless=True, ) self.assertEqual(10, select.MIN_SEARCH_COUNT) self.assertEqual(30, select.MIN_FILTER_COUNT) html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect" less> <select multiple="multiple" class="ui-creme-input" name="{name}"> <option value="1">A</option> <option value="2">B</option> <option value="3">C</option> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all">{check_all}</a> <a type="button" class="checklist-check-none">{check_none}</a> </div> <div class="checklist-body"><ul class="checklist-content"></ul></div> <div class="checklist-footer"><a class="checklist-toggle-less">{more_lbl}</a></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), more_lbl=_('More'), ) self.assertHTMLEqual(html, select.render(name, value=None))
def test_render_search01(self): "Automatic/default behaviour." name = 'my_choice_field' select = UnorderedMultipleChoiceWidget( choices=[(1, 'A'), (2, 'B'), (3, 'C')], viewless=False, ) self.assertEqual(10, select.MIN_SEARCH_COUNT) self.assertEqual(30, select.MIN_FILTER_COUNT) select.MIN_SEARCH_COUNT = 3 html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect"> <select multiple="multiple" class="ui-creme-input" name="{name}"> <option value="1">A</option> <option value="2">B</option> <option value="3">C</option> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all">{check_all}</a> <a type="button" class="checklist-check-none">{check_none}</a> <input type="search" class="checklist-filter" placeholder="{filter_lbl}"> </div> <div class="checklist-body"><ul class="checklist-content search"></ul></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), filter_lbl=pgettext('creme_core-noun', 'Search').upper(), ) self.assertHTMLEqual(html, select.render(name, value=None))
def test_render_filter02(self): "Fixed behaviour" name = 'my_choice_field' select = UnorderedMultipleChoiceWidget( choices=[(1, 'A'), (2, 'B')], viewless=False, filtertype='filter', ) html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect"> <select multiple="multiple" class="ui-creme-input" name="{name}"> <option value="1">A</option> <option value="2">B</option> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all hidden">{check_all}</a> <a type="button" class="checklist-check-none hidden">{check_none}</a> <input type="search" class="checklist-filter" placeholder="{filter_lbl}"> </div> <div class="checklist-body"><ul class="checklist-content filter"></ul></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), filter_lbl=pgettext('creme_core-noun', 'Filter').upper(), ) self.assertHTMLEqual(html, select.render(name, value=None))
def test_render_viewless03(self): "Custom integer value." name = 'my_field' select = UnorderedMultipleChoiceWidget(choices=[(1, 'A'), (2, 'B')], viewless=30) self.assertEqual(2, select._choice_count()) html = ''' <div class="ui-creme-widget widget-auto ui-creme-checklistselect" less="30" widget="ui-creme-checklistselect"> <select multiple="multiple" class="ui-creme-input" name="{name}"> <option value="1">A</option> <option value="2">B</option> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all hidden">{check_all}</a> <a type="button" class="checklist-check-none hidden">{check_none}</a> </div> <div class="checklist-body"><ul class="checklist-content"></ul></div> <div class="checklist-footer"><a class="checklist-toggle-less">{viewless_lbl}</a></div> </div>'''.format( name=name, check_all=_('Check all'), check_none=_('Check none'), viewless_lbl=_('More'), ) self.assertHTMLEqual(html, select.render(name, ()))
def test_render_option_groups(self): select = UnorderedMultipleChoiceWidget(choices=[('Group A', ((1, 'A'), (2, 'B'))), ('Group B', ((3, 'C'), (4, 'D'), (5, 'E'))), ], viewless=False, ) self.assertEqual(5, select._choice_count()) html = '''<div class="ui-creme-widget widget-auto ui-creme-checklistselect" widget="ui-creme-checklistselect" > <select multiple="multiple" class="ui-creme-input" name="A"> <optgroup label="Group A"> <option value="1">A</option> <option value="2">B</option> </optgroup> <optgroup label="Group B"> <option value="3" selected>C</option> <option value="4" selected>D</option> <option value="5">E</option> </optgroup> </select> <span class="checklist-counter"></span> <div class="checklist-header"> <a type="button" class="checklist-check-all">{check_all}</a> <a type="button" class="checklist-check-none">{check_none}</a> </div> <div class="checklist-body"><ul class="checklist-content"></ul></div> </div>'''.format( check_all=_(u'Check all'), check_none=_(u'Check none'), ) self.assertHTMLEqual(html, select.render('A', (3, 4,)))
def test_filtertype(self): select1 = UnorderedMultipleChoiceWidget() self.assertIsNone(select1.filtertype) select2 = UnorderedMultipleChoiceWidget(filtertype='search') self.assertEqual('search', select2.filtertype) select2.filtertype = 'filter' self.assertEqual('filter', select2.filtertype) with self.assertRaises(ValueError): select2.filtertype = 'invalid'
class AddRelationTypesForm(CremeForm): relation_types = ModelMultipleChoiceField( label=_('Types of the peripheral relations'), queryset=RelationType.objects.all(), widget=UnorderedMultipleChoiceWidget(columntype='wide'), ) def __init__(self, entity, *args, **kwargs): super().__init__(*args, **kwargs) self.graph = entity self.fields['relation_types'].queryset = \ RelationType.objects.exclude(pk__in=entity.orbital_relation_types.all()) def save(self): add_rtype = self.graph.orbital_relation_types.add for rtype in self.cleaned_data['relation_types']: add_rtype(rtype)
class HistoryConfigForm(CremeForm): relation_types = ModelMultipleChoiceField( label=_('Relation types'), queryset=RelationType.objects.all(), help_text=_HELP_TEXT, widget=UnorderedMultipleChoiceWidget(columntype='wide'), ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['relation_types'].queryset = \ RelationType.objects.exclude(pk__in=HistoryConfigItem.objects.values_list('relation_type', flat=True)) def save(self, *args, **kwargs): create_hci = HistoryConfigItem.objects.create for rtype in self.cleaned_data['relation_types']: create_hci(relation_type=rtype)
def _formfield(self, initial): return MultipleChoiceField( choices=self._args['choices'], initial=initial, widget=UnorderedMultipleChoiceWidget(columntype='wide'), )
def test_render_empty(self): select = UnorderedMultipleChoiceWidget(creation_url='/add') self.assertFalse(select.creation_allowed) self.assertHTMLEqual(_('No choice available.'), select.render('field', [], {'checkall': True}))
def test_build_filtertype(self): select = UnorderedMultipleChoiceWidget() self.assertIsNone(select._build_filtertype(0)) self.assertIsNone(select._build_filtertype(5)) self.assertEqual('search', select._build_filtertype(10)) self.assertEqual('search', select._build_filtertype(20)) self.assertEqual('filter', select._build_filtertype(30)) self.assertEqual('filter', select._build_filtertype(100)) select = UnorderedMultipleChoiceWidget(filtertype='search') self.assertEqual('search', select._build_filtertype(0)) self.assertEqual('search', select._build_filtertype(5)) self.assertEqual('search', select._build_filtertype(10)) self.assertEqual('search', select._build_filtertype(20)) self.assertEqual('search', select._build_filtertype(30)) self.assertEqual('search', select._build_filtertype(100))