def changelist_view(self, request, extra_context = None): if not self.has_change_permission(request, None): raise PermissionDenied if request.method == "GET": if "action" in request.GET: return grabar_ubicacion(request) opts = self.model._meta app_label = opts.app_label try: cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.change_list_template, self) cl.formset = None except IncorrectLookupParameters: if ERROR_FLAG in request.GET.keys(): return render_to_response('admin/invalid_setup.html', {'title': _('Database error')}) return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1') lugar = place.objects.all() context = { 'title': 'Administracion de Ubicacion Tiendas', 'is_popup': cl.is_popup, 'cl': cl, 'has_add_permission': self.has_add_permission(request), 'root_path': self.admin_site.root_path, 'app_label': app_label, 'lugar':lugar, } context.update(extra_context or {}) return render_to_response(self.change_list_template, context)
def test_distinct_for_through_m2m_at_second_level_in_list_filter(self): """ When using a ManyToMany in list_filter at the second level behind a ForeignKey, distinct() must be called and results shouldn't appear more than once. """ lead = Musician.objects.create(name="Vox") band = Group.objects.create(name="The Hype") Concert.objects.create(name="Woodstock", group=band) Membership.objects.create(group=band, music=lead, role="lead voice") Membership.objects.create(group=band, music=lead, role="bass player") m = ConcertAdmin(Concert, custom_site) request = self.factory.get("/concert/", data={"group__members": lead.pk}) cl = ChangeList( request, Concert, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m, ) cl.get_results(request) # There's only one Concert instance self.assertEqual(cl.result_count, 1)
def changelist_view(self, request, extra_context=None, **kwargs): """ Sobrescreve o metodo changelist_view responsavel por exibir os dados do objeto, adicionando o total de IPs liberados e negados. Cria o arquivo texto usado pelos scripts de firewall e controle de banda. """ from django.contrib.admin.views.main import ChangeList cl = ChangeList(request, self.model, list(self.list_display), self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self) cl.formset = None if extra_context is None: extra_context = {} novo_arquivo_pontosrede = self._novo_arquivo_pontosrede() extra_context['cl'] = cl extra_context['total_liberados'] = novo_arquivo_pontosrede['total_liberados'] extra_context['total_negados'] = novo_arquivo_pontosrede['total_negados'] return super(PontoRedeAdmin, self).changelist_view(request, extra_context=extra_context)
def test_pagination_page_range(self): """ Regression tests for ticket #15653: ensure the number of pages generated for changelist views are correct. """ # instantiating and setting up ChangeList object m = GroupAdmin(Group, custom_site) request = self.factory.get('/group/') cl = ChangeList(request, Group, *get_changelist_args(m)) per_page = cl.list_per_page = 10 for page_num, objects_count, expected_page_range in [ (0, per_page, []), (0, per_page * 2, list(range(2))), (5, per_page * 11, list(range(11))), (5, per_page * 12, [0, 1, 2, 3, 4, 5, 6, 7, 8, '.', 10, 11]), (6, per_page * 12, [0, 1, '.', 3, 4, 5, 6, 7, 8, 9, 10, 11]), (6, per_page * 13, [0, 1, '.', 3, 4, 5, 6, 7, 8, 9, '.', 11, 12]), ]: # assuming we have exactly `objects_count` objects Group.objects.all().delete() for i in range(objects_count): Group.objects.create(name='test band') # setting page number and calculating page range cl.page_num = page_num cl.get_results(request) real_page_range = pagination(cl)['page_range'] self.assertListEqual( expected_page_range, list(real_page_range), )
def test_result_list_set_empty_value_display_on_admin_site(self): """ Test that empty value display can be set on AdminSite """ new_child = Child.objects.create(name='name', parent=None) request = self.factory.get('/child/') # Set a new empty display value on AdminSite. admin.site.empty_value_display = '???' m = ChildAdmin(Child, admin.site) list_display = m.get_list_display(request) list_display_links = m.get_list_display_links(request, list_display) cl = ChangeList(request, Child, list_display, list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m) cl.formset = None template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') context = Context({'cl': cl}) table_output = template.render(context) link = reverse('admin:admin_changelist_child_change', args=(new_child.id,)) row_html = ( '<tbody><tr class="row1"><th class="field-name"><a href="%s">name</a></th>' '<td class="field-parent nowrap">???</td></tr></tbody>' % link ) self.assertNotEqual(table_output.find(row_html), -1, 'Failed to find expected row element: %s' % table_output)
def test_result_list_editable_html(self): """ Regression tests for #11791: Inclusion tag result_list generates a table and this checks that the items are nested within the table element tags. Also a regression test for #13599, verifies that hidden fields when list_editable is enabled are rendered in a div outside the table. """ new_parent = Parent.objects.create(name='parent') new_child = Child.objects.create(name='name', parent=new_parent) request = MockRequest() m = ChildAdmin(Child, admin.site) # Test with list_editable fields m.list_display = ['id', 'name', 'parent'] m.list_display_links = ['id'] m.list_editable = ['name'] cl = ChangeList(request, Child, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m) FormSet = m.get_changelist_formset(request) cl.formset = FormSet(queryset=cl.result_list) template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') context = Context({'cl': cl}) table_output = template.render(context) # make sure that hidden fields are in the correct place hiddenfields_div = '<div class="hiddenfields"><input type="hidden" name="form-0-id" value="%d" id="id_form-0-id" /></div>' % new_child.id self.assertFalse(table_output.find(hiddenfields_div) == -1, 'Failed to find hidden fields in: %s' % table_output) # make sure that list editable fields are rendered in divs correctly editable_name_field = '<input name="form-0-name" value="name" class="vTextField" maxlength="30" type="text" id="id_form-0-name" />' self.assertFalse('<td>%s</td>' % editable_name_field == -1, 'Failed to find "name" list_editable field in: %s' % table_output)
def changelist_view(self, request, extra_context=None): # Admin vs employee changelist view if request.user.is_superuser: if 'employee' not in self.list_display: self.list_display += ['employee'] if 'employee' not in self.list_filter: self.list_filter += ['employee'] if 'project__client' not in self.list_filter: self.list_filter += ['project__client'] else: pass # Get a query set with same filters as the current change list from django.contrib.admin.views.main import ChangeList from datetime import timedelta cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self) filtered_query_set = cl.get_query_set() hours = timedelta() for hour in [entry.hours for entry in filtered_query_set]: hours += timedelta(hours=hour.hour,minutes=hour.minute) seconds = hours.days * 86400 + hours.seconds hours, remainder = divmod(seconds, 3600) minutes, seconds = divmod(remainder, 60) total_hours = '%02d:%02d' % (hours, minutes) extra = { 'total_hours': total_hours, } if extra_context: extra = extra.update(extra_context) return super(EntryAdmin, self).changelist_view(request, extra_context=extra)
def test_BooleanFilterSpec(self): modeladmin = BoolTestAdmin(BoolTest, admin.site) request = self.request_factory.get('/') changelist = ChangeList(request, BoolTest, modeladmin.list_display, modeladmin.list_display_links, modeladmin.list_filter, modeladmin.date_hierarchy, modeladmin.search_fields, modeladmin.list_select_related, modeladmin.list_per_page, modeladmin.list_editable, modeladmin) # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters queryset = changelist.get_query_set() # Make sure the last choice is None and is selected filterspec = changelist.get_filters(request)[0][0] self.assertEqual(force_unicode(filterspec.title()), u'completed') choices = list(filterspec.choices(changelist)) self.assertEqual(choices[-1]['selected'], False) self.assertEqual(choices[-1]['query_string'], '?completed__exact=0') request = self.request_factory.get('/', {'completed__exact': 1}) changelist = self.get_changelist(request, BoolTest, modeladmin) # Make sure the correct choice is selected filterspec = changelist.get_filters(request)[0][0] self.assertEqual(force_unicode(filterspec.title()), u'completed') # order of choices depends on User model, which has no order choice = select_by(filterspec.choices(changelist), "display", "Yes") self.assertEqual(choice['selected'], True) self.assertEqual(choice['query_string'], '?completed__exact=1')
def get_tablib_queryset(self, request): if django.VERSION >= (1, 4): cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_max_show_all, self.list_editable, self, ) return cl.get_query_set(request) else: cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self, ) return cl.get_query_set()
def test_result_list_with_allow_tags(self): """ Test for deprecation of allow_tags attribute """ new_parent = Parent.objects.create(name='parent') for i in range(2): Child.objects.create(name='name %s' % i, parent=new_parent) request = self.factory.get('/child/') m = ChildAdmin(Child, custom_site) def custom_method(self, obj=None): return 'Unsafe html <br />' custom_method.allow_tags = True # Add custom method with allow_tags attribute m.custom_method = custom_method m.list_display = ['id', 'name', 'parent', 'custom_method'] cl = ChangeList(request, Child, *get_changelist_args(m)) FormSet = m.get_changelist_formset(request) cl.formset = FormSet(queryset=cl.result_list) template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') context = Context({'cl': cl}) table_output = template.render(context) custom_field_html = '<td class="field-custom_method">Unsafe html <br /></td>' self.assertInHTML(custom_field_html, table_output)
def test_result_list_html(self): """ Verifies that inclusion tag result_list generates a table when with default ModelAdmin settings. """ new_parent = Parent.objects.create(name="parent") new_child = Child.objects.create(name="name", parent=new_parent) request = MockRequest() m = ChildAdmin(Child, admin.site) cl = ChangeList( request, Child, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.formset = None template = Template("{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}") context = Context({"cl": cl}) table_output = template.render(context) row_html = '<tbody><tr class="row1"><td class="action-checkbox"><input type="checkbox" class="action-select" value="1" name="_selected_action" /></td><th><a href="1/">name</a></th><td class="nowrap">Parent object</td></tr></tbody>' self.assertFalse(table_output.find(row_html) == -1, "Failed to find expected row element: %s" % table_output)
def test_distinct_for_inherited_m2m_in_list_filter(self): """ Regression test for #13902: When using a ManyToMany in list_filter, results shouldn't apper more than once. Model managed in the admin inherits from the one that defins the relationship. """ lead = Musician.objects.create(name="John") four = Quartet.objects.create(name="The Beatles") Membership.objects.create(group=four, music=lead, role="lead voice") Membership.objects.create(group=four, music=lead, role="guitar player") m = QuartetAdmin(Quartet, admin.site) cl = ChangeList( MockFilteredRequestB(), Quartet, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.get_results(MockFilteredRequestB()) # There's only one Quartet instance self.assertEqual(cl.result_count, 1)
def test_distinct_for_m2m_in_list_filter(self): """ Regression test for #13902: When using a ManyToMany in list_filter, results shouldn't apper more than once. Basic ManyToMany. """ blues = Genre.objects.create(name="Blues") band = Band.objects.create(name="B.B. King Review", nr_of_members=11) band.genres.add(blues) band.genres.add(blues) m = BandAdmin(Band, admin.site) cl = ChangeList( MockFilteredRequestA(), Band, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.get_results(MockFilteredRequestA()) # There's only one Group instance self.assertEqual(cl.result_count, 1)
def test_distinct_for_through_m2m_in_list_filter(self): """ Regression test for #13902: When using a ManyToMany in list_filter, results shouldn't apper more than once. With an intermediate model. """ lead = Musician.objects.create(name="Vox") band = Group.objects.create(name="The Hype") Membership.objects.create(group=band, music=lead, role="lead voice") Membership.objects.create(group=band, music=lead, role="bass player") m = GroupAdmin(Group, admin.site) cl = ChangeList( MockFilteredRequestB(), Group, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.get_results(MockFilteredRequestB()) # There's only one Group instance self.assertEqual(cl.result_count, 1)
def test_RelatedFilterSpec_ForeignKey(self): modeladmin = BookAdmin(Book, admin.site) request = self.request_factory.get('/', {'author__isnull': 'True'}) changelist = ChangeList(request, Book, modeladmin.list_display, modeladmin.list_display_links, modeladmin.list_filter, modeladmin.date_hierarchy, modeladmin.search_fields, modeladmin.list_select_related, modeladmin.list_per_page, modeladmin.list_editable, modeladmin) # Make sure changelist.get_query_set() does not raise IncorrectLookupParameters queryset = changelist.get_query_set() # Make sure the last choice is None and is selected filterspec = changelist.get_filters(request)[0][1] self.assertEquals(force_unicode(filterspec.title()), u'author') choices = list(filterspec.choices(changelist)) self.assertEquals(choices[-1]['selected'], True) self.assertEquals(choices[-1]['query_string'], '?author__isnull=True') request = self.request_factory.get('/', {'author__id__exact': '1'}) changelist = self.get_changelist(request, Book, modeladmin) # Make sure the correct choice is selected filterspec = changelist.get_filters(request)[0][1] self.assertEquals(force_unicode(filterspec.title()), u'author') choices = list(filterspec.choices(changelist)) self.assertEquals(choices[1]['selected'], True) self.assertEquals(choices[1]['query_string'], '?author__id__exact=1')
def test_custom_paginator(self): new_parent = Parent.objects.create(name="parent") for i in range(200): new_child = Child.objects.create(name="name %s" % i, parent=new_parent) request = MockRequest() m = ChildAdmin(Child, admin.site) m.list_display = ["id", "name", "parent"] m.list_display_links = ["id"] m.list_editable = ["name"] m.paginator = CustomPaginator cl = ChangeList( request, Child, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.get_results(request) self.assertIsInstance(cl.paginator, CustomPaginator)
def test_result_list_html(self): """ Verifies that inclusion tag result_list generates a table when with default ModelAdmin settings. """ new_parent = Parent.objects.create(name="parent") new_child = Child.objects.create(name="name", parent=new_parent) request = self.factory.get("/child/") m = ChildAdmin(Child, admin.site) list_display = m.get_list_display(request) list_display_links = m.get_list_display_links(request, list_display) cl = ChangeList( request, Child, list_display, list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m, ) cl.formset = None template = Template("{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}") context = Context({"cl": cl}) table_output = template.render(context) row_html = ( '<tbody><tr class="row1"><th><a href="%d/">name</a></th><td class="nowrap">Parent object</td></tr></tbody>' % new_child.id ) self.assertFalse(table_output.find(row_html) == -1, "Failed to find expected row element: %s" % table_output)
def get_change_list_query_set(model_admin, model, request): from django.contrib import admin from django.contrib.admin.views.main import ChangeList a = model_admin(model, admin.site) cl = ChangeList(request, a.model, a.list_display, a.list_display_links, a.list_filter, a.date_hierarchy, a.search_fields, a.list_select_related, a.list_per_page, a.list_editable, a) return cl.get_query_set()
def test_filter_none(self): request = RequestFactory().get('/person/') request.user = AnonymousUser() cl = ChangeList(request, models.Person, *self.get_changelist_args()) cl.get_results(request) self.assertEqual( list(cl.result_list), list(models.Person.objects.all()))
def test_result_list_empty_changelist_value(self): """ Regression test for #14982: EMPTY_CHANGELIST_VALUE should be honored for relationship fields """ new_child = Child.objects.create(name="name", parent=None) request = MockRequest() m = ChildAdmin(Child, admin.site) cl = ChangeList( request, Child, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.formset = None template = Template("{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}") context = Context({"cl": cl}) table_output = template.render(context) row_html = '<tbody><tr class="row1"><td class="action-checkbox"><input type="checkbox" class="action-select" value="1" name="_selected_action" /></td><th><a href="1/">name</a></th><td class="nowrap">(None)</td></tr></tbody>' self.assertFalse(table_output.find(row_html) == -1, "Failed to find expected row element: %s" % table_output)
def test_custom_paginator(self): new_parent = Parent.objects.create(name="parent") for i in range(200): Child.objects.create(name="name %s" % i, parent=new_parent) request = self.factory.get("/child/") m = CustomPaginationAdmin(Child, custom_site) cl = ChangeList( request, Child, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m, ) cl.get_results(request) self.assertIsInstance(cl.paginator, CustomPaginator)
def test_distinct_for_m2m_in_list_filter(self): """ Regression test for #13902: When using a ManyToMany in list_filter, results shouldn't appear more than once. Basic ManyToMany. """ blues = Genre.objects.create(name="Blues") band = Band.objects.create(name="B.B. King Review", nr_of_members=11) band.genres.add(blues) band.genres.add(blues) m = BandAdmin(Band, custom_site) request = self.factory.get("/band/", data={"genres": blues.pk}) cl = ChangeList( request, Band, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m, ) cl.get_results(request) # There's only one Group instance self.assertEqual(cl.result_count, 1)
def test_result_list_set_empty_value_display_in_model_admin(self): """ Test that empty value display can be set in ModelAdmin or individual fields. """ new_child = Child.objects.create(name="name", parent=None) request = self.factory.get("/child/") m = EmptyValueChildAdmin(Child, admin.site) list_display = m.get_list_display(request) list_display_links = m.get_list_display_links(request, list_display) cl = ChangeList( request, Child, list_display, list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m, ) cl.formset = None template = Template("{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}") context = Context({"cl": cl}) table_output = template.render(context) link = reverse("admin:admin_changelist_child_change", args=(new_child.id,)) row_html = ( '<tbody><tr class="row1"><th class="field-name"><a href="%s">name</a></th>' '<td class="field-age_display">†</td><td class="field-age">-empty-</td></tr></tbody>' % link ) self.assertNotEqual(table_output.find(row_html), -1, "Failed to find expected row element: %s" % table_output)
def test_result_list_empty_changelist_value(self): """ Regression test for #14982: EMPTY_CHANGELIST_VALUE should be honored for relationship fields """ new_child = Child.objects.create(name="name", parent=None) request = self.factory.get("/child/") m = ChildAdmin(Child, custom_site) list_display = m.get_list_display(request) list_display_links = m.get_list_display_links(request, list_display) cl = ChangeList( request, Child, list_display, list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m, ) cl.formset = None template = Template("{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}") context = Context({"cl": cl}) table_output = template.render(context) link = reverse("admin:admin_changelist_child_change", args=(new_child.id,)) row_html = ( '<tbody><tr class="row1"><th class="field-name"><a href="%s">name</a></th>' '<td class="field-parent nowrap">-</td></tr></tbody>' % link ) self.assertNotEqual(table_output.find(row_html), -1, "Failed to find expected row element: %s" % table_output)
def test02_search(self): """ Test full text searching in administration """ request = REQ_FACTORY.get('/admin/admintests/', {'q': 'obsah'}) # Second argument is admin_site, but it is not used in this test model_admin = MultilingualModelAdmin(AdminTests, None) kwargs = {'request': request, 'model': AdminTests, 'list_display': ('__str__', ), 'list_display_links': (), 'list_filter': (), 'date_hierarchy': None, 'search_fields': ('translations__title', ), 'list_select_related': False, 'list_per_page': 100, 'list_editable': (), 'model_admin': model_admin} # This argument was added in Django 1.4 if get_version() >= '1.4': kwargs['list_max_show_all'] = 200 cl = ChangeList(**kwargs) # This argument was added in Django 1.4 if get_version() >= '1.4': queryset = cl.get_query_set(request) else: queryset = cl.get_query_set() self.assertEqual(len(queryset), 1) self.assertEqual(queryset[0].description, u'description ěščřžýáíé')
def test_distinct_for_m2m_to_inherited_in_list_filter(self): """ Regression test for #13902: When using a ManyToMany in list_filter, results shouldn't apper more than once. Target of the relationship inherits from another. """ lead = ChordsMusician.objects.create(name="Player A") three = ChordsBand.objects.create(name="The Chords Trio") Invitation.objects.create(band=three, player=lead, instrument="guitar") Invitation.objects.create(band=three, player=lead, instrument="bass") m = ChordsBandAdmin(ChordsBand, admin.site) cl = ChangeList( MockFilteredRequestB(), ChordsBand, m.list_display, m.list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_editable, m, ) cl.get_results(MockFilteredRequestB()) # There's only one ChordsBand instance self.assertEqual(cl.result_count, 1)
def test_result_list_html(self): """ Verifies that inclusion tag result_list generates a table when with default ModelAdmin settings. """ new_parent = Parent.objects.create(name='parent') new_child = Child.objects.create(name='name', parent=new_parent) request = self.factory.get('/child/') m = ChildAdmin(Child, custom_site) list_display = m.get_list_display(request) list_display_links = m.get_list_display_links(request, list_display) cl = ChangeList(request, Child, list_display, list_display_links, m.list_filter, m.date_hierarchy, m.search_fields, m.list_select_related, m.list_per_page, m.list_max_show_all, m.list_editable, m) cl.formset = None template = Template('{% load admin_list %}{% spaceless %}{% result_list cl %}{% endspaceless %}') context = Context({'cl': cl}) table_output = template.render(context) link = reverse('admin:admin_changelist_child_change', args=(new_child.id,)) row_html = ( '<tbody><tr class="row1"><th class="field-name"><a href="%s">name</a></th>' '<td class="field-parent nowrap">Parent object</td></tr></tbody>' % link ) self.assertNotEqual(table_output.find(row_html), -1, 'Failed to find expected row element: %s' % table_output)
def export(request, admin_site, model_name, app_label, format='csv'): if not request.user.is_staff: return HttpResponseForbidden() if not format in ALLOWED_EXPORT_TYPES: raise Http404('%s is not a supported format.' % format) model = get_model(app_label, model_name) model_admin = None for entry in admin_site._registry: if entry._meta.object_name == model._meta.object_name: model_admin = admin_site._registry[entry] if model_admin == None: raise Http404('ModelAdmin for model %s.%s not found' % (app_label, model_name)) cl = ChangeList(request, model, list(model_admin.list_display), model_admin.list_display_links, model_admin.list_filter, model_admin.date_hierarchy, model_admin.search_fields, model_admin.list_select_related, model_admin.list_per_page, model_admin.list_editable, model_admin) cl.formset = None c = RequestContext(request) if 'template' in ALLOWED_EXPORT_TYPES[format]: rows = [] headers = [] for field in model._meta.fields: headers.append(field.name) rows.append(headers) for record in cl.query_set: column = [] for field in headers: val = getattr(record, field) if callable(val): val = val() val = smart_str(val) column.append(val) rows.append(column) t = loader.get_template(ALLOWED_EXPORT_TYPES[format]['template']) c['rows'] = rows responseContents = t.render(c) elif 'serializer' in ALLOWED_EXPORT_TYPES[format]: responseContents = serialize(ALLOWED_EXPORT_TYPES[format]['serializer'], cl.query_set.all()) else: raise Http404('Export type for %s must have value for template or serializer' % format) response = HttpResponse(responseContents, mimetype=ALLOWED_EXPORT_TYPES[format]['mimetype']) response['Content-Disposition'] = 'attachment; filename=%s' % (ALLOWED_EXPORT_TYPES[format]['filename'] % slugify(model_name)) return response
def filtered_request_queryset(self, request): """Return queryset filtered by the admin list view""" cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self) return cl.get_query_set()
def test_filter_country(self): request = RequestFactory().get("/person/", data={"country": "NZ"}) request.user = AnonymousUser() cl = ChangeList(request, models.Person, *self.get_changelist_args()) cl.get_results(request) self.assertEqual( list(cl.result_list), list(models.Person.objects.exclude(country="AU")) )
def test_filter_country(self): request = RequestFactory().get('/person/', data={'country': 'NZ'}) cl = ChangeList(request, models.Person, *self.get_changelist_args()) cl.get_results(request) self.assertEqual(list(cl.result_list), list(models.Person.objects.exclude(country='AU')))
def get_changelist(self, request, model, modeladmin): return ChangeList(request, model, modeladmin.list_display, modeladmin.list_display_links, modeladmin.list_filter, modeladmin.date_hierarchy, modeladmin.search_fields, modeladmin.list_select_related, modeladmin.list_per_page, modeladmin.list_max_show_all, modeladmin.list_editable, modeladmin)
def get_change_list_query_set(self, request): cl = ChangeList(request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self) return cl.get_query_set()
def test_filter_none(self): request = RequestFactory().get('/person/') cl = ChangeList(request, models.Person, *self.get_changelist_args()) cl.get_results(request) self.assertEqual(list(cl.result_list), list(models.Person.objects.all()))
def changelist_view(self, request, extra_context=None): '''rewriting this to sometimes kill the "ID" filter when you click on another one.''' if request.GET.get('id'): #delete id parameter if there are other filters! yes! real_keys = [ k for k in request.GET.keys() if k not in getattr(self, 'not_count_filters', []) ] if len(real_keys) != 1: q = request.GET.copy() del q['id'] request.GET = q request.META['QUERY_STRING'] = request.GET.urlencode() if request.method == 'GET': '''re-create a changelist, get the filter specs, and put them into the request somewhere to be picked up by a future edit to the change list template, which would allow them to be displayed for all normal changelist_view pages''' #this is so that I can display filters on the top of the page for easy cancelling them. if request.GET.get('_changelist_filters'): qq = request.GET.copy() del qq['_changelist_filters'] log.info( 'killed extraneous weird filter thingie which would have caused a 500 error.' ) request.GET = qq ChangeList = self.get_changelist(request) list_display = self.get_list_display(request) list_display_links = self.get_list_display_links( request, list_display) from django.contrib.admin import options list_filter = self.get_list_filter(request) cl = ChangeList(request, self.model, list_display, list_display_links, list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_max_show_all, self.list_editable, self) used_filters = [xx for xx in cl.filter_specs if xx.used_parameters] filter_descriptions = [] from django.contrib.admin.filters import BooleanFieldListFilter if 'id' in request.GET: desc = ('id', request.GET['id'], make_untoggle_link(request, 'id')) filter_descriptions.append(desc) for key in request.GET.keys(): if key.endswith('__id'): desc = ('%s id' % key.split('__')[0], request.GET[key], make_untoggle_link(request, key)) filter_descriptions.append(desc) for uf in used_filters: if type(uf) == BooleanFieldListFilter: current_val = bool(int(uf.used_parameters.values()[0])) if current_val: desc = (uf.title, current_val, make_untoggle_link( request, uf.used_parameters.items()[0][0])) else: desc = (uf.title, current_val, make_untoggle_link( request, uf.used_parameters.items()[0][0])) filter_descriptions.append(desc) else: try: current_val = uf.used_parameters.values()[0] choice = None if getattr(uf, 'lookup_choices', False): got = False #looking up the "descriptive" way to describe the value. for choice in uf.lookup_choices: if choice[0] == current_val: choice = choice[1] break try: int(current_val) if choice[0] == int(current_val): choice = choice[1] break except ValueError: pass try: float(current_val) if choice[0] == float(current_val): choice = choice[1] break except ValueError: pass if not choice: pass else: choice = uf.used_parameters.keys()[0] choice = current_val desc = (uf.title, choice, make_untoggle_link( request, uf.used_parameters.items()[0][0])) filter_descriptions.append(desc) except Exception as e: pass if request.GET and 'q' in request.GET: desc = ('Searching for', "\"%s\"" % request.GET['q'], make_untoggle_link(request, 'q')) filter_descriptions.append(desc) request.filter_descriptions = filter_descriptions sup = super(OverriddenModelAdmin, self) return sup.changelist_view(request, extra_context=extra_context)
def changelist_view(self, request, extra_context=None): "The 'change list' admin view for this model." from django.contrib.admin.views.main import ERROR_FLAG opts = self.model._meta app_label = opts.app_label # Check actions to see if any are available on this changelist actions = self.get_actions(request) # Remove action checkboxes if there aren't any actions available. list_display = list(self.list_display) if not actions: try: list_display.remove('action_checkbox') except ValueError: pass ChangeList = self.get_changelist(request) try: cl = ChangeList(request, self.model, list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_editable, self) except adminoptions.IncorrectLookupParameters: # Wacky lookup parameters were given, so redirect to the main # changelist page, without parameters, and pass an 'invalid=1' # parameter via the query string. If wacky parameters were given # and the 'invalid=1' parameter was already in the query string, # something is screwed up with the database, so display an error # page. if ERROR_FLAG in request.GET.keys(): return render_to_response('admin/invalid_setup.html', {'title': ('Database error')}) return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1') #<<<< # if auto_redirect is true we should handle that before anything else if self.auto_redirect and cl.query_set.count() == 1: obj = cl.query_set[0] try: url = obj.get_absolute_url() except AttributeError: url = None if url: # if no url just go ahead and show the display set normally return HttpResponseRedirect(url) #<<<< # If the request was POSTed, this might be a bulk action or a bulk # edit. Try to look up an action or confirmation first, but if this # isn't an action the POST will fall through to the bulk edit check, # below. action_failed = False selected = request.POST.getlist(helpers.ACTION_CHECKBOX_NAME) # Actions with no confirmation if actions and request.method == 'POST': response = self.response_action(request, queryset=cl.get_query_set()) if response: return response # If we're allowing changelist editing, we need to construct a formset # for the changelist given all the fields to be edited. Then we'll # use the formset to validate/process POSTed data. formset = cl.formset = None # Handle POSTed bulk-edit data. if (request.method == "POST" and self.list_editable and '_save' in request.POST and not action_failed): FormSet = self.get_changelist_formset(request) formset = cl.formset = FormSet(request.POST, request.FILES, queryset=cl.result_list) if formset.is_valid(): changecount = 0 for form in formset.forms: if form.has_changed(): obj = self.save_form(request, form, change=True) self.save_model(request, obj, form, change=True) form.save_m2m() change_msg = self.construct_change_message( request, form, None) self.log_change(request, obj, change_msg) changecount += 1 if changecount: if changecount == 1: name = force_unicode(opts.verbose_name) else: name = force_unicode(opts.verbose_name_plural) msg = ungettext( "%(count)s %(name)s was changed successfully.", "%(count)s %(name)s were changed successfully.", changecount) % { 'count': changecount, 'name': name, 'obj': force_unicode(obj) } self.message_user(request, msg) return HttpResponseRedirect(request.get_full_path()) # Handle GET -- construct a formset for display. elif self.list_editable: FormSet = self.get_changelist_formset(request) formset = cl.formset = FormSet(queryset=cl.result_list) # Build the list of media to be used by the formset. if formset: media = self.media + formset.media else: media = self.media # Build the action form and populate it with available actions. if actions: action_form = self.action_form(auto_id=None) action_form.fields['action'].choices = self.get_action_choices( request) else: action_form = None context = { 'module_name': force_unicode(opts.verbose_name_plural), 'title': cl.title, 'is_popup': cl.is_popup, 'cl': cl, 'media': media, 'has_add_permission': self.has_add_permission(request), 'root_path': self.admin_site.root_path, 'app_label': app_label, 'action_form': action_form, 'actions_on_top': self.actions_on_top, 'actions_on_bottom': self.actions_on_bottom, 'actions_selection_counter': self.actions_selection_counter, } context.update(extra_context or {}) context_instance = template.RequestContext( request, current_app=self.admin_site.name) return render_to_response(self.change_list_template or [ 'admin/%s/%s/change_list.html' % (app_label, opts.object_name.lower()), 'admin/%s/change_list.html' % app_label, 'admin/change_list.html' ], context, context_instance=context_instance)