def test_l10n_block_locales(self): """ Parsing an l10n block with locales info should put that info on the node. """ tree = env.parse("""{% l10n dude locales=ru,es-ES,fr 20121212 %} This stuff is totally translated. {% endl10n %}""") l10n_block = tree.find(Block) self.assertEqual(l10n_block.locales, ['ru', 'es-ES', 'fr']) self.assertEqual(l10n_block.version, 20121212)
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 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 compress(self, log=None, **options): """ Searches templates containing 'compress' nodes and compresses them "offline" -- outside of the request/response cycle. The result is cached with a cache-key derived from the content of the compress nodes (not the content of the possibly linked files!). """ extensions = options.get('extensions') extensions = self.handle_extensions(extensions or ['html']) verbosity = int(options.get("verbosity", 0)) if not log: log = StringIO() if not settings.TEMPLATE_LOADERS: raise OfflineGenerationError("No template loaders defined. You " "must set TEMPLATE_LOADERS in your " "settings.") paths = set() for loader in self.get_loaders(): try: module = import_module(loader.__module__) get_template_sources = getattr(module, 'get_template_sources', None) if get_template_sources is None: get_template_sources = loader.get_template_sources paths.update(list(get_template_sources(''))) except (ImportError, AttributeError): # Yeah, this didn't work out so well, let's move on pass if not paths: raise OfflineGenerationError("No template paths found. None of " "the configured template loaders " "provided template paths. See " "http://django.me/template-loaders " "for more information on template " "loaders.") if verbosity > 1: log.write("Considering paths:\n\t" + "\n\t".join(paths) + "\n") templates = set() for path in paths: for root, dirs, files in walk(path, followlinks=options.get('followlinks', False)): templates.update(os.path.join(root, name) for name in files if not name.startswith('.') and any(fnmatch(name, "*%s" % glob) for glob in extensions)) if not templates: raise OfflineGenerationError("No templates found. Make sure your " "TEMPLATE_LOADERS and TEMPLATE_DIRS " "settings are correct.") if verbosity > 1: log.write("Found templates:\n\t" + "\n\t".join(templates) + "\n") #from compressor.contrib.jinja2ext import CompressorExtension from jingo_offline_compressor.jinja2ext import CompressorExtension env.add_extension(CompressorExtension) template_encoding = options.get('encoding') compressor_nodes = SortedDict() for template_name in templates: try: #template_content = env.loader.get_source(env, template_name)[0] #template_content = open(template_name).read() template_content = codecs.open( template_name, 'r', template_encoding ).read() template = env.parse(template_content) except IOError: # unreadable file -> ignore if verbosity > 0: log.write("Unreadable template at: %s\n" % template_name) continue except TemplateSyntaxError, e: # broken template -> ignore if verbosity > 0: log.write("Invalid template %s: %s\n" % (template_name, e)) continue except TemplateDoesNotExist: # non existent template -> ignore if verbosity > 0: log.write("Non-existent template at: %s\n" % template_name) continue
def compress(self, log=None, **options): """ Searches templates containing 'compress' nodes and compresses them "offline" -- outside of the request/response cycle. The result is cached with a cache-key derived from the content of the compress nodes (not the content of the possibly linked files!). """ extensions = options.get('extensions') extensions = self.handle_extensions(extensions or ['html']) verbosity = int(options.get("verbosity", 0)) if not log: log = StringIO() if not settings.TEMPLATE_LOADERS: raise OfflineGenerationError("No template loaders defined. You " "must set TEMPLATE_LOADERS in your " "settings.") #from jingo import env paths = set() for loader in self.get_loaders(): try: module = import_module(loader.__module__) get_template_sources = getattr(module, 'get_template_sources', None) if get_template_sources is None: get_template_sources = loader.get_template_sources paths.update(list(get_template_sources(''))) except (ImportError, AttributeError): # Yeah, this didn't work out so well, let's move on pass if not paths: raise OfflineGenerationError("No template paths found. None of " "the configured template loaders " "provided template paths. See " "http://django.me/template-loaders " "for more information on template " "loaders.") if verbosity > 1: log.write("Considering paths:\n\t" + "\n\t".join(paths) + "\n") templates = set() for path in paths: for root, dirs, files in walk(path, followlinks=options.get( 'followlinks', False)): templates.update( os.path.join(root, name) for name in files if not name.startswith('.') and any( fnmatch(name, "*%s" % glob) for glob in extensions)) if not templates: raise OfflineGenerationError("No templates found. Make sure your " "TEMPLATE_LOADERS and TEMPLATE_DIRS " "settings are correct.") if verbosity > 1: log.write("Found templates:\n\t" + "\n\t".join(templates) + "\n") #from compressor.contrib.jinja2ext import CompressorExtension from jingo_offline_compressor.jinja2ext import CompressorExtension env.add_extension(CompressorExtension) compressor_nodes = SortedDict() for template_name in templates: try: #template_content = env.loader.get_source(env, template_name)[0] template_content = open(template_name).read() template = env.parse(template_content) except IOError: # unreadable file -> ignore if verbosity > 0: log.write("Unreadable template at: %s\n" % template_name) continue except TemplateSyntaxError, e: # broken template -> ignore if verbosity > 0: log.write("Invalid template %s: %s\n" % (template_name, e)) continue except TemplateDoesNotExist: # non existent template -> ignore if verbosity > 0: log.write("Non-existent template at: %s\n" % template_name) continue