def test_tag_list(self): addon = Addon.objects.get(id=3615) request = Mock() request.user = addon.authors.all()[0].create_django_user() request.groups = () tags = addon.tags.not_blacklisted() ctx = { 'APP': amo.FIREFOX, 'LANG': 'en-us', 'request': request, 'addon': addon, 'tags': tags } # initialize jingo jingo.load_helpers() cake_csrf_token = lambda: '' cake_csrf_token.__name__ = 'cake_csrf_token' jingo.register.function(cake_csrf_token) # no tags, no list s = render('{{ tag_list(addon) }}', ctx) self.assertEqual(s.strip(), "") s = render('{{ tag_list(addon, tags=tags) }}', ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li').length, len(tags))
def test_addon_sharing(self): addon = Addon.objects.get(id=7172) jingo.load_helpers() # mock helpers locale_url = lambda url: url locale_url.__name__ = 'locale_url' jingo.register.function(locale_url) request = Mock() request.user = DjangoUser() request.APP = amo.FIREFOX ctx = {'request': request} # disable cake csrf token cake_csrf_token = lambda: '' cake_csrf_token.__name__ = 'cake_csrf_token' jingo.register.function(cake_csrf_token) doc = pq(addon_sharing(ctx, addon)) self.assert_(doc.html()) self.assertEquals(doc('li').length, len(sharing.SERVICES_LIST)) # Make sure services are in the right order. for i in range(len(sharing.SERVICES_LIST)): self.assertEquals(doc('li').eq(i).attr('class'), sharing.SERVICES_LIST[i].shortname)
def test_barometer(self): self.client.get('/') jingo.load_helpers() collection = Collection(upvotes=1, slug='mccrackin', author=UserProfile(username='******')) # Mock logged out. c = { 'request': Mock(path='yermom', GET=Mock(urlencode=lambda: ''), session={'fxa_state': 'foobar'}), 'user': Mock(), 'settings': Mock() } c['request'].user.is_authenticated.return_value = False doc = pq(barometer(c, collection)) assert doc('form')[0].action == 'https://login' # Mock logged in. c['request'].user.votes.filter.return_value = [Mock(vote=1)] c['request'].user.is_authenticated.return_value = True barometer(c, collection) doc = pq(barometer(c, collection)) assert doc('form')[0].action == (reverse( 'collections.vote', args=['clouserw', 'mccrackin', 'up']))
def test_tag_list(self): addon = Addon.objects.get(id=3615) request = Mock() request.user = addon.authors.all()[0].create_django_user() request.groups = () tags = addon.tags.not_blacklisted() ctx = { 'APP': amo.FIREFOX, 'LANG': 'en-us', 'request': request, 'addon': addon, 'tags': tags} # initialize jingo jingo.load_helpers() cake_csrf_token = lambda: '' cake_csrf_token.__name__ = 'cake_csrf_token' jingo.register.function(cake_csrf_token) # no tags, no list s = render('{{ tag_list(addon) }}', ctx) self.assertEqual(s.strip(), "") s = render('{{ tag_list(addon, tags=tags) }}', ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li').length, len(tags))
def test_addon_sharing(self): addon = Addon.objects.get(id=7172) jingo.load_helpers() request = Mock() request.user = DjangoUser() request.APP = amo.FIREFOX ctx = {'request': request, 'APP': request.APP, 'LANG': translation.get_language()} # disable cake csrf token cake_csrf_token = lambda: '' cake_csrf_token.__name__ = 'cake_csrf_token' jingo.register.function(cake_csrf_token) doc = pq(addon_sharing(ctx, addon)) self.assert_(doc.html()) self.assertEquals(doc('li').length, len(sharing.SERVICES_LIST)) # Make sure services are in the right order. for i in range(len(sharing.SERVICES_LIST)): self.assertEquals(doc('li').eq(i).attr('class'), sharing.SERVICES_LIST[i].shortname) assert doc('li a').eq(i).attr('target') in ('_blank', '_self'), ( 'Sharing link target must either be blank or self.')
def render_xml_to_string(request, template, context={}): if not jingo._helpers_loaded: jingo.load_helpers() for processor in get_standard_processors(): context.update(processor(request)) template = xml_env.get_template(template) return template.render(context)
def render_xml_to_string(request, template, context={}): if not jingo._helpers_loaded: jingo.load_helpers() for processor in get_standard_processors(): context.update(processor(request)) template = xml_env.get_template(template) return template.render(**context)
def ready(self): """ Bootstrapping stuff """ # Install gettext translations # Note: we'll remove these things with django-jinja import jingo from django.utils import translation jingo.get_env().install_gettext_translations(translation, newstyle=True) jingo.load_helpers()
def test_pagination_result_count(): jingo.load_helpers() pager = Mock() pager.start_index = lambda: 1 pager.end_index = lambda: 20 pager.paginator.count = 999 c = dict(pager=pager) assert (u'Results <strong>1</strong>-<strong>20</strong> of ' '<strong>999</strong>') == render( "{{ pagination_result_count(pager) }}", c)
def test_pagination_result_count(): jingo.load_helpers() pager = Mock() pager.start_index = lambda: 1 pager.end_index = lambda: 20 pager.paginator.count = 999 c = dict(pager=pager) eq_(u'Results <strong>1</strong>-<strong>20</strong> of ' '<strong>999</strong>', render("{{ pagination_result_count(pager) }}", c))
def render_xml(request, template, context={}, **kwargs): """Safely renders xml, stripping out nasty control characters.""" if not jingo._helpers_loaded: jingo.load_helpers() for processor in get_standard_processors(): context.update(processor(request)) template = xml_env.get_template(template) rendered = template.render(**context) return HttpResponse(rendered, **kwargs)
def test_tag_list(self): addon = Addon.objects.get(id=3615) request = Mock() request.user = addon.authors.all()[0].create_django_user() request.groups = () tags = addon.tags.filter(blacklisted=False) dev_tags = tags.filter(addon_tags__user__in=addon.authors.all()) user_tags = tags.exclude(addon_tags__user__in=addon.authors.all()) ctx = { 'APP': amo.FIREFOX, 'LANG': 'en-us', 'request': request, 'addon': addon, 'dev_tags': dev_tags, 'user_tags': user_tags, } # initialize jingo jingo.load_helpers() cake_csrf_token = lambda: '' cake_csrf_token.__name__ = 'cake_csrf_token' jingo.register.function(cake_csrf_token) # no tags, no list s = render('{{ tag_list(addon) }}', ctx) self.assertEqual(s.strip(), "") return # regular lists s = render('{{ tag_list(addon, dev_tags=dev_tags) }}', ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li.developertag').length, len(dev_tags)) eq_(doc('li').length, len(dev_tags)) s = render('{{ tag_list(addon, user_tags=user_tags) }}', ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li.usertag').length, len(user_tags)) eq_(doc('li').length, len(user_tags)) s = render("""{{ tag_list(addon, dev_tags=dev_tags, user_tags=user_tags) }}""", ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li.usertag').length, len(user_tags)) eq_(doc('li.developertag').length, len(dev_tags)) eq_(doc('li').length, len(user_tags)+len(dev_tags)) # delete buttons are shown assert doc('li input.removetag').length > 0
def test_inline_css(monkeypatch): jingo.load_helpers() env = jingo.env t = env.from_string("{{ inline_css('zamboni/mobile', debug=True) }}") # Monkeypatch settings.LESS_BIN to not call the less compiler. We don't # need nor want it in tests. monkeypatch.setattr(settings, 'LESS_BIN', 'ls') # Monkeypatch jingo_minify.helpers.is_external to counter-effect the # autouse fixture in conftest.py. monkeypatch.setattr(amo.helpers, 'is_external', lambda css: False) s = t.render() ok_('background-image: url(/static/img/icons/stars.png);' in s)
def test_inline_css(monkeypatch): jingo.load_helpers() env = jingo.get_env() t = env.from_string("{{ inline_css('zamboni/mobile', debug=True) }}") # Monkeypatch settings.LESS_BIN to not call the less compiler. We don't # need nor want it in tests. monkeypatch.setattr(settings, 'LESS_BIN', 'ls') # Monkeypatch jingo_minify.helpers.is_external to counter-effect the # autouse fixture in conftest.py. monkeypatch.setattr(amo.helpers, 'is_external', lambda css: False) s = t.render() assert 'background-image: url(/static/img/icons/stars.png);' in s
def render_xml(request, template, context={}, **kwargs): """Safely renders xml, stripping out nasty control characters.""" if not jingo._helpers_loaded: jingo.load_helpers() for processor in get_standard_processors(): context.update(processor(request)) template = xml_env.get_template(template) rendered = template.render(**context) if 'mimetype' not in kwargs: kwargs['mimetype'] = 'text/xml' return HttpResponse(rendered, **kwargs)
def test_tag_list(self): addon = Addon.objects.get(id=3615) request = Mock() request.user = addon.authors.all()[0].create_django_user() tags = addon.tags.filter(blacklisted=False) dev_tags = tags.filter(addon_tags__user__in=addon.authors.all()) user_tags = tags.exclude(addon_tags__user__in=addon.authors.all()) ctx = { 'request': request, 'addon': addon, 'dev_tags': dev_tags, 'user_tags': user_tags, } # initialize jingo jingo.load_helpers() cake_csrf_token = lambda: '' cake_csrf_token.__name__ = 'cake_csrf_token' jingo.register.function(cake_csrf_token) # no tags, no list s = render('{{ tag_list(addon) }}', ctx) assert not s, "Empty tags should not return tag list." # regular lists s = render('{{ tag_list(addon, dev_tags=dev_tags) }}', ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li.developertag').length, len(dev_tags)) eq_(doc('li').length, len(dev_tags)) s = render('{{ tag_list(addon, user_tags=user_tags) }}', ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li.usertag').length, len(user_tags)) eq_(doc('li').length, len(user_tags)) s = render("""{{ tag_list(addon, dev_tags=dev_tags, user_tags=user_tags) }}""", ctx) assert s, "Non-empty tags must return tag list." doc = pq(s) eq_(doc('li.usertag').length, len(user_tags)) eq_(doc('li.developertag').length, len(dev_tags)) eq_(doc('li').length, len(user_tags)+len(dev_tags))
def test_barometer(self): jingo.load_helpers() collection = Collection.objects.get(pk=57274) collection.up_votes = 1 # Mock logged out. c = dict(request=Mock()) c["request"].path = "yermom" c["request"].user.is_authenticated = lambda: False doc = pq(barometer(c, collection)) eq_(doc("form")[0].action, "/users/login?to=yermom") # Mock logged in. c["request"].amo_user.votes.filter = lambda collection: [1] c["request"].user.is_authenticated = lambda: True barometer(c, collection) doc = pq(barometer(c, collection)) eq_(doc("form")[0].action, remora_url("collections/vote/%s/up" % collection.uuid))
def save_related(self, request, form, formsets, change): """ After saving the related objects, remove and add SnippetTemplateVariables depending on how the template code changed. """ super(SnippetTemplateAdmin, self).save_related(request, form, formsets, change) load_helpers() # Ensure jingo helpers are loaded. ast = env.parse(form.instance.code) new_vars = find_undeclared_variables(ast) var_manager = form.instance.variable_set # Filter out reserved variable names. new_vars = filter(lambda x: not x in RESERVED_VARIABLES, new_vars) # Delete variables not in the new set. var_manager.filter(~Q(name__in=new_vars)).delete() # Create variables that don't exist. for variable in new_vars: var_manager.get_or_create(name=variable)
def test_barometer(self): jingo.load_helpers() collection = Collection.objects.get(pk=80) collection.upvotes = 1 # Mock logged out. c = dict(request=Mock(), user=Mock(), LANG='en-US', APP='firefox') c['request'].path = 'yermom' c['request'].GET.urlencode = lambda: '' c['request'].user.is_authenticated = lambda: False doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, '/en-US/firefox/users/login?to=yermom') # Mock logged in. vote = Mock() vote.vote = 1 c['request'].amo_user.votes.filter.return_value = [vote] c['request'].user.is_authenticated = lambda: True barometer(c, collection) doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, reverse('collections.vote', args=['clouserw', 'mccrackin', 'up']))
def test_barometer(self): jingo.load_helpers() collection = Collection.objects.get(pk=57274) collection.upvotes = 1 # Mock logged out. c = dict(request=Mock(), user=Mock(), LANG='en-US', APP='firefox') c['request'].path = 'yermom' c['request'].GET.urlencode = lambda: '' c['request'].user.is_authenticated = lambda: False doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, '/en-US/firefox/users/login?to=yermom') # Mock logged in. vote = Mock() vote.vote = 1 c['request'].amo_user.votes.filter.return_value = [vote] c['request'].user.is_authenticated = lambda: True barometer(c, collection) doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, reverse('collections.vote', args=['anonymous', None, 'up']))
def test_barometer(self): self.client.get('/') jingo.load_helpers() collection = Collection(upvotes=1, slug='mccrackin', author=UserProfile(username='******')) # Mock logged out. c = { 'request': Mock(path='yermom', GET=Mock(urlencode=lambda: '')), 'user': Mock(), 'settings': Mock() } c['request'].user.is_authenticated.return_value = False doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, '/en-US/firefox/users/login?to=yermom') # Mock logged in. c['request'].user.votes.filter.return_value = [Mock(vote=1)] c['request'].user.is_authenticated.return_value = True barometer(c, collection) doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, reverse('collections.vote', args=['clouserw', 'mccrackin', 'up']))
def monkeypatch(): """All the monkeypatching we have to do to get things running""" global _has_patched if _has_patched: return # Import for side-effect: configures logging handlers. from fjord.settings.log_settings import noop noop() # Monkey-patch admin site. from django.contrib import admin from django.contrib.auth.decorators import login_required from session_csrf import anonymous_csrf from adminplus.sites import AdminSitePlus # Patch the admin admin.site = AdminSitePlus() admin.site.login = login_required(anonymous_csrf(admin.site.login)) # Monkey-patch django forms to avoid having to use Jinja2's |safe # everywhere. import jingo.monkey jingo.monkey.patch() # Monkey-patch Django's csrf_protect decorator to use # session-based CSRF tokens. import session_csrf session_csrf.monkeypatch() from jingo import load_helpers load_helpers() logging.debug("Note: monkeypatches executed in %s" % __file__) # Prevent it from being run again later. _has_patched = True
def test_barometer(self): self.client.get('/') jingo.load_helpers() collection = Collection(upvotes=1, slug='mccrackin', author=UserProfile(username='******')) # Mock logged out. c = { 'request': Mock(path='yermom', GET=Mock(urlencode=lambda: '')), 'user': Mock(), 'settings': Mock() } c['request'].user.is_authenticated.return_value = False doc = pq(barometer(c, collection)) eq_(doc('form')[0].action, '/en-US/firefox/users/login?to=yermom') # Mock logged in. c['request'].amo_user.votes.filter.return_value = [Mock(vote=1)] c['request'].user.is_authenticated.return_value = True barometer(c, collection) doc = pq(barometer(c, collection)) eq_( doc('form')[0].action, reverse('collections.vote', args=['clouserw', 'mccrackin', 'up']))
def patch(): global _has_patched if _has_patched: return # Import for side-effect: configures logging handlers. from fjord.settings.log_settings import noop noop() # Monkey-patch admin site. from django.contrib import admin from django.contrib.auth.decorators import login_required from session_csrf import anonymous_csrf from adminplus.sites import AdminSitePlus # Patch the admin admin.site = AdminSitePlus() admin.site.login = login_required(anonymous_csrf(admin.site.login)) # Monkey-patch django forms to avoid having to use Jinja2's |safe # everywhere. import jingo.monkey jingo.monkey.patch() # Monkey-patch Django's csrf_protect decorator to use # session-based CSRF tokens. import session_csrf session_csrf.monkeypatch() from jingo import load_helpers load_helpers() logging.debug("Note: monkey patches executed in %s" % __file__) # Prevent it from being run again later. _has_patched = True
def save_related(self, request, form, formsets, change): """ After saving the related objects, remove and add SnippetTemplateVariables depending on how the template code changed. """ super(SnippetTemplateAdmin, self).save_related(request, form, formsets, change) load_helpers() # Ensure jingo helpers are loaded. # Parse the template code and find any undefined variables. ast = env.parse(form.instance.code) new_vars = find_undeclared_variables(ast) var_manager = form.instance.variable_set # Filter out reserved variable names. new_vars = filter(lambda x: not x in RESERVED_VARIABLES, new_vars) # Delete variables not in the new set. var_manager.filter(~Q(name__in=new_vars)).delete() # Create variables that don't exist. for variable in new_vars: models.SnippetTemplateVariable.objects.get_or_create( template=form.instance, name=variable)
def setup(): jingo.load_helpers()
def _collect(self, objs, source_attr=None, **kwargs): for obj in objs: if source_attr: # We just added a default of None below and that gets around # the problem. self.add_edge(getattr(obj, source_attr, None), obj) else: self.add_edge(None, obj) try: return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs) except models.ProtectedError as e: self.protected.update(e.protected_objects) util.NestedObjects.collect = _collect # Make |safe less necessary for form fields import jingo.monkey jingo.monkey.patch() # Monkey patch django's csrf import session_csrf session_csrf.monkeypatch() # Load jingo helpers from jingo import load_helpers load_helpers()
def patch(): global _has_been_patched, URLWidget if _has_been_patched: return # Monkey patch preserves the old values, so we can pick up any changes # in CharField.widget_attrs and Field.widget_attrs # paulc filed a Django ticket for it, #14884 field_widget_attrs = fields.Field.widget_attrs charfield_widget_attrs = fields.CharField.widget_attrs def required_field_attrs(self, widget): """This function is for use on the base Field class.""" attrs = field_widget_attrs(self, widget) # required="required" isn't supported for groups of checkboxes. if (self.required and 'required' not in attrs and not widget.is_hidden and not isinstance(widget, widgets.CheckboxSelectMultiple)): attrs['required'] = 'required' return attrs def required_char_field_attrs(self, widget, *args, **kwargs): """This function is for use on the CharField class.""" # We need to call super() here, since Django's CharField.widget_attrs # doesn't call its super and thus won't use the required_field_attrs # above. attrs = super(fields.CharField, self).widget_attrs(widget, *args, **kwargs) original_attrs = charfield_widget_attrs(self, widget) or {} attrs.update(original_attrs) return attrs fields.Field.widget_attrs = required_field_attrs fields.CharField.widget_attrs = required_char_field_attrs fields.DateField.widget = DateWidget fields.TimeField.widget = TimeWidget fields.URLField.widget = URLWidget fields.EmailField.widget = EmailWidget # Workaround until https://code.djangoproject.com/ticket/16920 gets fixed. from django.contrib.admin import util from django.contrib.admin.util import NestedObjects from django.db import models def _collect(self, objs, source_attr=None, **kwargs): for obj in objs: if source_attr: # We just added a default of None below and that gets around # the problem. self.add_edge(getattr(obj, source_attr, None), obj) else: self.add_edge(None, obj) try: return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs) except models.ProtectedError as e: self.protected.update(e.protected_objects) util.NestedObjects.collect = _collect # Make |safe less necessary for form fields import jingo.monkey jingo.monkey.patch() # Monkey patch django's csrf import session_csrf session_csrf.monkeypatch() # Load jingo helpers from jingo import load_helpers load_helpers() _has_been_patched = True
def patch(): global _has_been_patched, URLWidget if _has_been_patched: return # Monkey patch preserves the old values, so we can pick up any changes # in CharField.widget_attrs and Field.widget_attrs # paulc filed a Django ticket for it, #14884 field_widget_attrs = fields.Field.widget_attrs charfield_widget_attrs = fields.CharField.widget_attrs def required_field_attrs(self, widget): """This function is for use on the base Field class.""" attrs = field_widget_attrs(self, widget) # required="required" isn't supported for groups of checkboxes. if ( self.required and (not "required" in attrs) and not widget.is_hidden and not isinstance(widget, widgets.CheckboxSelectMultiple) ): attrs["required"] = "required" return attrs def required_char_field_attrs(self, widget, *args, **kwargs): """This function is for use on the CharField class.""" # We need to call super() here, since Django's CharField.widget_attrs # doesn't call its super and thus won't use the required_field_attrs # above. attrs = super(fields.CharField, self).widget_attrs(widget, *args, **kwargs) original_attrs = charfield_widget_attrs(self, widget) or {} attrs.update(original_attrs) return attrs fields.Field.widget_attrs = required_field_attrs fields.CharField.widget_attrs = required_char_field_attrs fields.DateField.widget = DateWidget fields.TimeField.widget = TimeWidget fields.URLField.widget = URLWidget fields.EmailField.widget = EmailWidget # Workaround until https://code.djangoproject.com/ticket/16920 gets fixed. from django.contrib.admin import util from django.contrib.admin.util import NestedObjects from django.db import models def _collect(self, objs, source_attr=None, **kwargs): for obj in objs: if source_attr: # We just added a default of None below and that gets around # the problem. self.add_edge(getattr(obj, source_attr, None), obj) else: self.add_edge(None, obj) try: return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs) except models.ProtectedError as e: self.protected.update(e.protected_objects) util.NestedObjects.collect = _collect # Make |safe less necessary for form fields import jingo.monkey jingo.monkey.patch() # Monkey patch django's csrf import session_csrf session_csrf.monkeypatch() # Load jingo helpers from jingo import load_helpers load_helpers() _has_been_patched = True
def super(): jingo.load_helpers()
def setUp(self): jingo.load_helpers()
def get_template(self, template_name, template_dirs=None): if not jingo._helpers_loaded: jingo.load_helpers() template = jingo.env.get_template(template_name) return JingoTemplateLoaderWrapper(template)
def _collect(self, objs, source_attr=None, **kwargs): for obj in objs: if source_attr: # We just added a default of None below and that gets around # the problem. self.add_edge(getattr(obj, source_attr, None), obj) else: self.add_edge(None, obj) try: return super(NestedObjects, self).collect( objs, source_attr=source_attr, **kwargs) except models.ProtectedError as e: self.protected.update(e.protected_objects) util.NestedObjects.collect = _collect # Make |safe less necessary for form fields import jingo.monkey jingo.monkey.patch() # Monkey patch django's csrf import session_csrf session_csrf.monkeypatch() # Load jingo helpers from jingo import load_helpers load_helpers()
def test_inline_css(): jingo.load_helpers() env = jingo.env t = env.from_string("{{ inline_css('zamboni/mobile', debug=True) }}") s = t.render() ok_('background-image: url(/static/img/icons/stars.png);' in s)
def test_inline_css(): jingo.load_helpers() env = jingo.env t = env.from_string("{{ inline_css('zamboni/mobile', debug=True) }}") s = t.render() ok_('background-image: url(/media/img/icons/stars.png);' in s)