def test_logging(self): user = User(username='******') user.set_password('test') user.full_clean() user.save() ct = get_content_type(User) iframe = Iframe(position=2, region='test', content_type=ct, content_id=user.pk, url='https://news.bbc.co.uk/') iframe.full_clean() iframe.save() request = RequestFactory().get('/') request.user = user admin_instance = get_modeladmin(Iframe) admin_instance.log_addition(request, iframe) admin_instance.log_change(request, iframe, "we changed a thing!") admin_instance.log_deletion(request, iframe, "we deleted a thing!") # find them on the user logs = LogEntry.objects.get(content_type=ct, object_id=user.pk, user=user, action_flag=ADDITION) self.assertEqual(force_text(logs), 'Added "test".') logs = LogEntry.objects.get(content_type=ct, object_id=user.pk, user=user, action_flag=CHANGE) self.assertEqual(force_text(logs), 'Changed "test" - we changed a ' 'thing!') # can't check for deletions properly, see # https://code.djangoproject.com/ticket/21771#ticket # logs = LogEntry.objects.get(content_type=ct, object_id=user.pk, # user=user, action_flag=DELETION) # self.assertEqual(force_text(logs), 'Changed "test" - we changed a ' # 'thing!') # find them on the iframe ct = get_content_type(Iframe) logs = LogEntry.objects.get(content_type=ct, object_id=iframe.pk, user=user, action_flag=ADDITION) self.assertEqual(force_text(logs), 'Added "https://news.bbc.co.uk/".') logs = LogEntry.objects.get(content_type=ct, object_id=iframe.pk, user=user, action_flag=CHANGE) self.assertEqual(force_text(logs), 'Changed "https://news.bbc.co.uk/" ' '- we changed a thing!') # can't check for deletions properly, see # https://code.djangoproject.com/ticket/21771#ticket logs = LogEntry.objects.filter(content_type=ct, object_id=user.pk, user=user, action_flag=DELETION) self.assertEqual(force_text(logs[0]), 'Deleted "we deleted a thing!."')
def test_continue_editing_parent_object(self): """ if continue editing is hit, it should go back to the parent URL, I think? """ user = User(username='******', is_staff=True, is_superuser=True, is_active=True) user.set_password('test') user.full_clean() user.save() admin_instance = get_modeladmin(Iframe) self.assertIsInstance(admin_instance, RealishAdmin) request = RequestFactory().get('/', { '_continue': 1, }) request.user = user iframe_admin = reverse('admin:embeds_iframe_add') response_301 = HttpResponsePermanentRedirect(redirect_to=iframe_admin) ct = get_content_type(User) iframe = Iframe(position=2, region='test', content_type=ct, content_id=user.pk, url='https://news.bbc.co.uk/') iframe.full_clean() iframe.save() new_response = admin_instance.maybe_fix_redirection( request=request, response=response_301, obj=iframe) self.assertEqual(new_response['X-Chunkadmin-Response'], 'redirect-to-parent') self.assertEqual(301, new_response.status_code) self.assertEqual('/admin_mountpoint/auth/user/1/?_data_changed=1', new_response['Location'])
def _test_view(self, func='add_view', generate_chunks=1): user = User(username='******', is_staff=True, is_superuser=True, is_active=True) user.set_password('test') user.full_clean() user.save() ct = get_content_type(User) request = RequestFactory().get('/', { REQUEST_VAR_CT: ct.pk, REQUEST_VAR_ID: user.pk, REQUEST_VAR_REGION: 'test' }) request.user = user admin_instance = get_modeladmin(Iframe) for x in range(0, generate_chunks): iframe = Iframe(position=2, region='test', content_type=ct, content_id=user.pk, url='https://news.bbc.co.uk/') iframe.full_clean() iframe.save() kwargs = {'request': request} if func != 'add_view': kwargs.update({'object_id': force_text(iframe.pk)}) view = getattr(admin_instance, func) view(**kwargs) # now do the view again without the fields required by the decorator request = RequestFactory().get('/') request.user = user kwargs.update({'request': request}) with self.assertRaises(SuspiciousOperation): view(**kwargs)
def test_get_response_add_context(self): request = RequestFactory().get('/') user = User(username='******') user.set_password('test') user.full_clean() user.save() ct = get_content_type(User) iframe = Iframe(position=2, region='test', content_type=ct, content_id=user.pk, url='https://news.bbc.co.uk/') iframe.full_clean() iframe.save() results = self.chunk_admin.get_response_add_context(request=request, obj=iframe) html = results.pop('html') self.assertEqual(results, {'action': {'add': True, 'change': False, 'delete': False}, 'object': {'pk': 1, 'id': 1} }) # self.assertIn('Please wait, saving changes', html) # self.assertIn('Add new content', html) # self.assertIn('Iframe', html) self.assertIn('<h3>Embeds</h3>', html) self.assertIn('<b>whee!:</b>', html)
def setUp(self): fakefile = SimpleUploadedFile('x/y/z.gif', b'xyz') sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) self.file = File(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', title='x', data=fakefile)
def setUp(self): self.ct = get_content_type(User) try: admin.site.unregister(Iframe) except NotRegistered: pass admin.site.register(Iframe, IframeAdmin)
def test_available_chunks(self): expected = [ AdminChunkWrapper(opts=Iframe._meta, namespace='admin', content_id=self.user.pk, region='test', content_type=get_content_type(User)) ] self.assertEqual(expected, self.changelist.available_chunks)
def get_content_type(self, content_object): """ Try and get the ContentType for the given object, and in DEBUG showing an appropriate error message, while in production just logging it for subscribers and moving on. """ try: return get_content_type(content_object) except ContentType.DoesNotExist: # the model doesn't exist in the content types table. I don' # know why. if settings.DEBUG: raise logger.exception( 'content object does not exist for {cls!r}'.format( cls=content_object)) return None except AttributeError: # we didn't get a proper django model, but something has definitely # been passed in, because the earlier None sentinel didn't catch it. error = ttag_not_model % { 'tagname': self.name, 'type': type(content_object).__name__ } if settings.DEBUG: raise ImproperlyConfigured(error) logger.exception(error) return None except ValueError: error = "content_object was probably '', check the context provided" if settings.DEBUG: raise ValueError(error) logger.exception(error) return None
def get_link_context(self, context, obj, admin_site, querystring): """ ..todo:: document Always returns the existing context. """ site = get_admin_site(admin_site) if site is None: logger.debug('Invalid admin site') return {} content_type = get_content_type(obj) new_querystring = QueryDict(querystring, mutable=True) new_querystring.update({'content_type': content_type.pk, 'content_id': obj.pk}) link = _add_custom_link_to_context(admin_site, context['request'], opts=EditRegionChunk._meta, permname='change', viewname='changelist', url_params=None, query=new_querystring.urlencode()) if link['verbose_name']: logger.debug('link created successfully, swapping out the ' '`verbose_name` available to the context') link['verbose_name'] = EditRegionChunk._meta.verbose_name_plural link['obj_name'] = obj._meta.verbose_name return link
def test_move_view(self): ct = get_content_type(User) user = User(username='******', is_staff=True, is_superuser=True, is_active=True) user.set_password('test') user.full_clean() user.save() for x in range(1, 10): obj = Iframe(position=x, region='test', content_id=user.pk, content_type=ct, url='http://example.com/') obj.full_clean() obj.save() first_obj = EditRegionChunk.objects.all()[0] request = RequestFactory().get('/', {'position': 3, 'pk': first_obj.pk, 'region': 'test'}) request.user = user response = self.admin.move_view(request=request) self.assertEqual(response.status_code, 200) self.assertEqual(response['Content-type'], 'application/json') json_data = json.loads(force_text(response.content)) self.assertIn('action', json_data) self.assertIn('html', json_data) self.assertEqual('move', json_data['action']) self.assertIn('<div class="region-inline-wrapper"', json_data['html'])
def test_str(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) mlt = MoreLikeThis(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', connection='default') mlt.full_clean() self.assertEqual('3 from "default"', force_text(mlt))
def test_str_alt_branch(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) sr = SearchResults(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', connection='a', max_num=0, query="goose fat") sr.full_clean() self.assertEqual('', force_text(sr))
def test_get_boosts_blank(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) sr = SearchResults(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', connection='default', query="goose fat", boost='') sr.full_clean() self.assertEqual(sr.get_boosts(), ())
def test_repr(self): user_ct = get_content_type(self.model_dependencies["user"]) expected = ( "<editregions.models.EditRegionChunk pk=1, region=test, " "parent_type={USER.pk}, parent_id=1, " "position=0>".format(USER=user_ct) ) received = repr(self.chunks["base"]) self.assertEqual(expected, received)
def setUp(self): user, created = User.objects.get_or_create(username="******") user_ct = get_content_type(User) for x in range(0, 9): obj = EditRegionChunk(region="test", position=x, content_id=user.pk, content_type=user_ct) obj.full_clean() obj.save() self.user = user self.content_type = user_ct
def configure(self, obj): self.obj = obj self.ct = get_content_type(obj) modeladmin = get_modeladmin(self.obj) if hasattr(modeladmin, 'get_editregions_template_choices'): self.valid_templates = modeladmin.get_editregions_template_choices( obj=self.obj) possible_templates = modeladmin.get_editregions_templates( obj=self.obj) self.set_template(possible_templates)
def test_clean_healing(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) sr = SearchResults(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', connection='default', query=" goose fat ", boost='aaaaaa') sr.full_clean() self.assertEqual(sr.boost, 'aaaaaa,') self.assertEqual(sr.query, 'goose fat')
def test_usage(self): tmpl = Template(""" output: {% load editregion %} {% editregion "test" obj %}fallback{% endeditregion %} {% get_editregion "test" obj as exposed %} {% for chunk in exposed %} {% endfor %} """) user = User(username='******', is_staff=True, is_active=True, is_superuser=True) user.set_password('test') user.full_clean() user.save() user_content_type = get_content_type(User) # attach some chunks to the region in test for x in range(1, 11): iframe = Iframe(region='test', content_id=user.pk, content_type=user_content_type, url='https://news.bbc.co.uk/{0!s}'.format(x), position=x) iframe.full_clean() iframe.save() # fix the admin in test try: admin.site.unregister(User) except NotRegistered: pass admin.site.register(User, TestUserAdmin) request = RequestFactory().get('/') request.user = user ctx = RequestContext(request) ctx.update({'obj': user}) rendered = tmpl.render(ctx).strip() for x in range(1, 11): self.assertIn('name="chunk-iframe-{0}" data-pk="{0}" ' 'data-position="{0}" data-region="{1}"'.format( x, 'test'), rendered) tmpl = Template(""" output: {% load editregion %} {% get_editregion "test" obj as exposed %} {% for chunk in exposed %}xxx:{{ chunk.output }}{% endfor %} """) rendered = tmpl.render(ctx).strip() self.assertIn('output:', rendered) for x in range(1, 11): self.assertIn('xxx:<iframe '.format(x), rendered) self.assertIn('src="https://news.bbc.co.uk/{0}"'.format(x), rendered) self.assertIn('name="chunk-iframe-{0}"'.format(x), rendered)
def get_changelists_for_object(self, request, obj, **kwargs): changelists = [] if obj is not None: logger.debug('Editing `{obj!r}`, so do ' '`get_changelists_for_object`'.format(obj=obj)) attach_configuration(obj, EditRegionConfiguration) config = get_configuration(obj) # Dynamic template changes ... obj_admin = get_modeladmin(admin_namespace=self.admin_site.name, obj=obj) if hasattr(obj_admin, 'editregions_template_field'): fieldname = obj_admin.editregions_template_field template_name = request.GET.get(fieldname, None) kv = TemplateRequestKeyValue(key=fieldname, value=template_name) if config.is_valid_template(template_name): logger.debug("{kv!r} was valid for this {obj!r} " "and {modeladmin!r}".format( kv=kv, obj=obj, modeladmin=obj_admin)) config.set_template(template_name) # store the old get here, because it gets changed inside the region # loops, which is a lossy process. old_get = request.GET # mutate the querystring and set some data onto it, which will # be passed to the get_changelist_filters method, as well as # being used to filter the ChangeList correctly. # new_get = request.GET.copy() new_get = QueryDict('', mutable=True) new_get[REQUEST_VAR_CT] = get_content_type(obj).pk new_get[REQUEST_VAR_ID] = obj.pk for region in config.config: new_get[REQUEST_VAR_REGION] = region request.GET = new_get our_list_display = self.list_display[:] our_list_links = self.get_list_display_links( request=request, list_display=our_list_display) ChangeList = self.get_changelist(request, **kwargs) cl = ChangeList(request=request, model=self.model, list_display=our_list_display, list_display_links=our_list_links, list_filter=self.list_filter, date_hierarchy=None, search_fields=None, list_select_related=None, list_per_page=100, list_max_show_all=100, list_editable=None, model_admin=self, parent_obj=obj, parent_conf=config) changelists.append(cl) # as the internal request.GET may be lossy, we restore the original # data here. request.GET = old_get return changelists
def setUp(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) self.file = File(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', title='x', data='x/y/z.gif', modified=now()) try: admin.site.unregister(File) except NotRegistered: pass admin.site.register(File, FileAdmin)
def setUp(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) self.obj = MCE(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', content='<b><em> hi there! </em></b>') try: admin.site.unregister(MCE) except NotRegistered: pass admin.site.register(MCE, MCEAdmin)
def setUp(self): sample_user, created = User.objects.get_or_create(username="******") user_ct = get_content_type(sample_user) base = EditRegionChunk(region="test", position=0, content_id=sample_user.pk, content_type=user_ct) base.full_clean() base.save() other = EditRegionChunk(region="test", position=1, content_id=sample_user.pk, content_type=user_ct) other.full_clean() other.save() self.model_dependencies = {"user": sample_user} self.chunks = {"base": base, "other": other}
def test_get_subclass_summary(self): kwargs = { 'func': 'get_subclass_summary', 'expected': ('<a href="/admin_mountpoint/embeds/iframe/1/?', 'region=test', 'content_id=1', 'content_type={0}'.format(get_content_type(User).pk), 'data-adminlinks="autoclose"', '>https://news.bbc.co.uk/</a>'), 'extra': {} } self._test_changelist_display_methods(**kwargs)
def setUp(self): request = RequestFactory().get('/') our_list_display = EditRegionAdmin.list_display our_list_links = (EditRegionAdmin(User, admin.site) .get_list_display_links(request=request, list_display=our_list_display)) user = User(username='******') user.set_password('test') user.full_clean() user.save() self.user = user user_content_type = get_content_type(User) attach_configuration(user, EditRegionConfiguration) config = get_configuration(user) request.GET = QueryDict('', mutable=True) request.GET.update({REQUEST_VAR_ID: user.pk, REQUEST_VAR_CT: user_content_type.pk, REQUEST_VAR_REGION: 'test'}) try: admin.site.unregister(User) except NotRegistered: pass admin.site.register(User, TestUserAdmin) cl = EditRegionChangeList(request=request, model=EditRegionChunk, list_display=our_list_display, list_display_links=our_list_links, list_filter=EditRegionAdmin.list_filter, date_hierarchy=None, search_fields=None, list_select_related=None, list_per_page=100, list_max_show_all=100, list_editable=None, model_admin=admin.site._registry[EditRegionChunk], # noqa parent_obj=user, parent_conf=config) self.changelist = cl badconfig = EditRegionConfiguration() cl2 = EditRegionChangeList(request=request, model=EditRegionChunk, list_display=our_list_display, list_display_links=our_list_links, list_filter=EditRegionAdmin.list_filter, date_hierarchy=None, search_fields=None, list_select_related=None, list_per_page=100, list_max_show_all=100, list_editable=None, model_admin=admin.site._registry[EditRegionChunk], # noqa parent_obj=user, parent_conf=badconfig) self.changelist2 = cl2
def setUp(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) mlt = MoreLikeThis(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', connection='default') mlt.full_clean() try: admin.site.unregister(MoreLikeThis) except NotRegistered: pass admin.site.register(MoreLikeThis, MoreLikeThisAdmin) self.modeladmin = get_modeladmin(MoreLikeThis) self.obj = mlt
def setUp(self): sample_user, created = User.objects.get_or_create(username='******') user_ct = get_content_type(sample_user) sr = SearchResults(position=1, content_type=user_ct, content_id=sample_user.pk, region='test', connection='default', query="goose fat") sr.full_clean() try: admin.site.unregister(SearchResults) except NotRegistered: pass admin.site.register(SearchResults, SearchResultsAdmin) self.modeladmin = get_modeladmin(SearchResults) self.obj = sr
def _test_changelist_display_methods(self, func, expected, extra): ct = get_content_type(User) user = User(username='******', is_staff=True, is_superuser=True, is_active=True) user.set_password('test') user.full_clean() user.save() iframe = Iframe(position=2, region='test', content_type=ct, content_id=user.pk, url='https://news.bbc.co.uk/') iframe.full_clean() iframe.save() render_html = getattr(self.admin, func) received = render_html(obj=iframe, **extra) for x in expected: self.assertIn(x, received)
def test_get_object_tools(self): kwargs = { 'func': 'get_object_tools', 'expected': ('class="drag_handle" data-pk="1"', '/admin_mountpoint/editregions/editregionchunk/move/', 'href="/admin_mountpoint/embeds/iframe/1/delete/?', 'region=test', 'content_id=1', 'content_type={0}'.format(get_content_type(User).pk), 'class="delete_handle"', 'data-adminlinks="autoclose"', '>Delete</a>'), 'extra': {} } self._test_changelist_display_methods(**kwargs)
def test_changelist_view(self): request = RequestFactory().get('/') with self.assertRaises(MultiValueDictKeyError): self.admin.changelist_view(request=request) user = User(username='******', is_staff=True, is_superuser=True, is_active=True) user.set_password('test') user.full_clean() user.save() request = RequestFactory().get('/', { REQUEST_VAR_CT: get_content_type(User).pk, REQUEST_VAR_ID: user.pk, }) template_response = self.admin.changelist_view(request=request) self.assertIsInstance(template_response, TemplateResponse)
def test_get_changelist_link_html_directly(self): kwargs = { 'func': 'get_changelist_link_html', 'expected': ('<a href="/admin_mountpoint/embeds/iframe/1/?', 'region=test', 'content_id=1', 'content_type={0}'.format(get_content_type(User).pk), 'data-adminlinks="autoclose"', '>x</a>'), 'extra': { 'data': 'x', 'caller': 'test' } } self._test_changelist_display_methods(**kwargs)