Loading django/forms/widgets.py +11 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ class Media(object): getattr(combined, 'add_' + name)(getattr(other, '_' + name, None)) return combined def media_property(cls): def _media(self): # Get the media property of the superclass, if it exists Loading Loading @@ -131,6 +132,7 @@ def media_property(cls): return base return property(_media) class MediaDefiningClass(type): """ Metaclass for classes that can have media definitions. Loading Loading @@ -162,6 +164,7 @@ class SubWidget(object): args.append(self.choices) return self.parent_widget.render(*args) class Widget(six.with_metaclass(MediaDefiningClass)): is_hidden = False # Determines whether this corresponds to an <input type="hidden">. needs_multipart_form = False # Determines does this widget need multipart form Loading Loading @@ -224,6 +227,7 @@ class Widget(six.with_metaclass(MediaDefiningClass)): """ return id_ class Input(Widget): """ Base class for all <input> widgets (except type='checkbox' and Loading Loading @@ -279,10 +283,12 @@ class PasswordInput(TextInput): value = None return super(PasswordInput, self).render(name, value, attrs) class HiddenInput(Input): input_type = 'hidden' is_hidden = True class MultipleHiddenInput(HiddenInput): """ A widget that handles <input type="hidden"> for fields that have a list Loading Loading @@ -313,6 +319,7 @@ class MultipleHiddenInput(HiddenInput): return data.getlist(name) return data.get(name, None) class FileInput(Input): input_type = 'file' needs_multipart_form = True Loading @@ -327,6 +334,7 @@ class FileInput(Input): FILE_INPUT_CONTRADICTION = object() class ClearableFileInput(FileInput): initial_text = ugettext_lazy('Currently') input_text = ugettext_lazy('Change') Loading Loading @@ -389,6 +397,7 @@ class ClearableFileInput(FileInput): return False return upload class Textarea(Widget): def __init__(self, attrs=None): # The 'rows' and 'cols' attributes are required for HTML correctness. Loading Loading @@ -515,6 +524,7 @@ class Select(Widget): output.append(self.render_option(selected_choices, option_value, option_label)) return '\n'.join(output) class NullBooleanSelect(Select): """ A Select Widget intended to be used with NullBooleanField. Loading Loading @@ -849,6 +859,7 @@ class SplitDateTimeWidget(MultiWidget): return [value.date(), value.time().replace(microsecond=0)] return [None, None] class SplitHiddenDateTimeWidget(SplitDateTimeWidget): """ A Widget that splits datetime input into two <input type="hidden"> inputs. Loading django/http/multipartparser.py +9 −0 Original line number Diff line number Diff line Loading @@ -269,6 +269,7 @@ class MultiPartParser(object): """Cleanup filename from Internet Explorer full paths.""" return filename and filename[filename.rfind("\\")+1:].strip() class LazyStream(six.Iterator): """ The LazyStream wrapper allows one to get and "unget" bytes from a stream. Loading Loading @@ -380,6 +381,7 @@ class LazyStream(six.Iterator): " if there is none, report this to the Django developers." ) class ChunkIter(six.Iterator): """ An iterable that will yield chunks of data. Given a file-like object as the Loading @@ -403,6 +405,7 @@ class ChunkIter(six.Iterator): def __iter__(self): return self class InterBoundaryIter(six.Iterator): """ A Producer that will iterate over boundaries. Loading @@ -420,6 +423,7 @@ class InterBoundaryIter(six.Iterator): except InputStreamExhausted: raise StopIteration() class BoundaryIter(six.Iterator): """ A Producer that is sensitive to boundaries. Loading Loading @@ -516,6 +520,7 @@ class BoundaryIter(six.Iterator): end -= 1 return end, next def exhaust(stream_or_iterable): """ Completely exhausts an iterator or stream. Loading @@ -534,6 +539,7 @@ def exhaust(stream_or_iterable): for __ in iterator: pass def parse_boundary_stream(stream, max_header_size): """ Parses one and exactly one stream that encapsulates a boundary. Loading Loading @@ -592,6 +598,7 @@ def parse_boundary_stream(stream, max_header_size): return (TYPE, outdict, stream) class Parser(object): def __init__(self, stream, boundary): self._stream = stream Loading @@ -603,6 +610,7 @@ class Parser(object): # Iterate over each part yield parse_boundary_stream(sub_stream, 1024) def parse_header(line): """ Parse the header into a key-value. Input (line): bytes, output: unicode for key/name, bytes for value which Loading @@ -622,6 +630,7 @@ def parse_header(line): pdict[name] = value return key, pdict def _parse_header_params(s): plist = [] while s[:1] == b';': Loading django/template/base.py +26 −0 Original line number Diff line number Diff line Loading @@ -95,9 +95,11 @@ class VariableDoesNotExist(Exception): return self.msg % tuple(force_text(p, errors='replace') for p in self.params) class InvalidTemplateLibrary(Exception): pass class Origin(object): def __init__(self, name): self.name = name Loading @@ -108,6 +110,7 @@ class Origin(object): def __str__(self): return self.name class StringOrigin(Origin): def __init__(self, source): super(StringOrigin, self).__init__(UNKNOWN_SOURCE) Loading @@ -116,6 +119,7 @@ class StringOrigin(Origin): def reload(self): return self.source class Template(object): def __init__(self, template_string, origin=None, name='<Unknown Template>'): Loading Loading @@ -146,6 +150,7 @@ class Template(object): finally: context.render_context.pop() def compile_string(template_string, origin): "Compiles template_string into NodeList ready for rendering" if settings.TEMPLATE_DEBUG: Loading @@ -157,6 +162,7 @@ def compile_string(template_string, origin): parser = parser_class(lexer.tokenize()) return parser.parse() class Token(object): def __init__(self, token_type, contents): # token_type must be TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK or Loading Loading @@ -184,6 +190,7 @@ class Token(object): split.append(bit) return split class Lexer(object): def __init__(self, template_string, origin): self.template_string = template_string Loading Loading @@ -235,6 +242,7 @@ class Lexer(object): self.lineno += token_string.count('\n') return token class Parser(object): def __init__(self, tokens): self.tokens = tokens Loading Loading @@ -370,6 +378,7 @@ class Parser(object): else: raise TemplateSyntaxError("Invalid filter: '%s'" % filter_name) class TokenParser(object): """ Subclass this and implement the top() method to parse a template line. Loading Loading @@ -523,6 +532,7 @@ filter_raw_string = r""" filter_re = re.compile(filter_raw_string, re.UNICODE | re.VERBOSE) class FilterExpression(object): """ Parses a variable token and its optional filters (all as a single string), Loading Loading @@ -644,6 +654,7 @@ class FilterExpression(object): def __str__(self): return self.token def resolve_variable(path, context): """ Returns the resolved variable, which may contain attribute syntax, within Loading @@ -653,6 +664,7 @@ def resolve_variable(path, context): """ return Variable(path).resolve(context) class Variable(object): """ A template variable, resolvable against a given context. The variable may Loading Loading @@ -793,6 +805,7 @@ class Variable(object): return current class Node(object): # Set this to True for nodes that must be first in the template (although # they can be preceded by text nodes. Loading Loading @@ -822,6 +835,7 @@ class Node(object): nodes.extend(nodelist.get_nodes_by_type(nodetype)) return nodes class NodeList(list): # Set to True the first time a non-TextNode is inserted by # extend_nodelist(). Loading @@ -847,6 +861,7 @@ class NodeList(list): def render_node(self, node, context): return node.render(context) class TextNode(Node): def __init__(self, s): self.s = s Loading @@ -858,6 +873,7 @@ class TextNode(Node): def render(self, context): return self.s def render_value_in_context(value, context): """ Converts any value to a string to become part of a rendered template. This Loading @@ -873,6 +889,7 @@ def render_value_in_context(value, context): else: return value class VariableNode(Node): def __init__(self, filter_expression): self.filter_expression = filter_expression Loading @@ -893,6 +910,7 @@ class VariableNode(Node): # Regex for token keyword arguments kwarg_re = re.compile(r"(?:(\w+)=)?(.+)") def token_kwargs(bits, parser, support_legacy=False): """ A utility method for parsing token keyword arguments. Loading Loading @@ -942,6 +960,7 @@ def token_kwargs(bits, parser, support_legacy=False): del bits[:1] return kwargs def parse_bits(parser, bits, params, varargs, varkw, defaults, takes_context, name): """ Loading Loading @@ -1009,6 +1028,7 @@ def parse_bits(parser, bits, params, varargs, varkw, defaults, (name, ", ".join("'%s'" % p for p in unhandled_params))) return args, kwargs def generic_tag_compiler(parser, token, params, varargs, varkw, defaults, name, takes_context, node_class): """ Loading @@ -1019,6 +1039,7 @@ def generic_tag_compiler(parser, token, params, varargs, varkw, defaults, defaults, takes_context, name) return node_class(takes_context, args, kwargs) class TagHelperNode(Node): """ Base class for tag helper nodes such as SimpleNode, InclusionNode and Loading @@ -1039,6 +1060,7 @@ class TagHelperNode(Node): for k, v in self.kwargs.items()) return resolved_args, resolved_kwargs class Library(object): def __init__(self): self.filters = {} Loading Loading @@ -1224,6 +1246,7 @@ class Library(object): return func return dec def is_library_missing(name): """Check if library that failed to load cannot be found under any templatetags directory or does exist but fails to import. Loading @@ -1240,6 +1263,7 @@ def is_library_missing(name): except ImportError: return is_library_missing(path) def import_library(taglib_module): """ Load a template tag library module. Loading Loading @@ -1268,6 +1292,7 @@ def import_library(taglib_module): templatetags_modules = [] def get_templatetags_modules(): """ Return the list of all available template tag modules. Loading @@ -1290,6 +1315,7 @@ def get_templatetags_modules(): templatetags_modules = _templatetags_modules return templatetags_modules def get_library(library_name): """ Load the template library module with the given name. Loading django/template/context.py +2 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,7 @@ class RenderContext(BaseContext): return d[key] return otherwise # This is a function rather than module-level procedural code because we only # want it to execute if somebody uses RequestContext. def get_standard_processors(): Loading @@ -166,6 +167,7 @@ def get_standard_processors(): _standard_context_processors = tuple(processors) return _standard_context_processors class RequestContext(Context): """ This subclass of template.Context automatically populates itself using Loading django/template/defaultfilters.py +56 −0 Original line number Diff line number Diff line Loading @@ -66,18 +66,21 @@ def addslashes(value): """ return value.replace('\\', '\\\\').replace('"', '\\"').replace("'", "\\'") @register.filter(is_safe=True) @stringfilter def capfirst(value): """Capitalizes the first character of the value.""" return value and value[0].upper() + value[1:] @register.filter("escapejs") @stringfilter def escapejs_filter(value): """Hex encodes characters for use in JavaScript strings.""" return escapejs(value) @register.filter("fix_ampersands", is_safe=True) @stringfilter def fix_ampersands_filter(value): Loading @@ -96,6 +99,7 @@ neg_inf = -1e200 * 1e200 nan = (1e200 * 1e200) // (1e200 * 1e200) special_floats = [str(pos_inf), str(neg_inf), str(nan)] @register.filter(is_safe=True) def floatformat(text, arg=-1): """ Loading Loading @@ -179,12 +183,14 @@ def floatformat(text, arg=-1): except InvalidOperation: return input_val @register.filter(is_safe=True) @stringfilter def iriencode(value): """Escapes an IRI value for use in a URL.""" return force_text(iri_to_uri(value)) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def linenumbers(value, autoescape=None): Loading @@ -201,12 +207,14 @@ def linenumbers(value, autoescape=None): lines[i] = ("%0" + width + "d. %s") % (i + 1, escape(line)) return mark_safe('\n'.join(lines)) @register.filter(is_safe=True) @stringfilter def lower(value): """Converts a string into all lowercase.""" return value.lower() @register.filter(is_safe=False) @stringfilter def make_list(value): Loading @@ -218,6 +226,7 @@ def make_list(value): """ return list(value) @register.filter(is_safe=True) @stringfilter def slugify(value): Loading @@ -229,6 +238,7 @@ def slugify(value): from django.utils.text import slugify return slugify(value) @register.filter(is_safe=True) def stringformat(value, arg): """ Loading @@ -245,6 +255,7 @@ def stringformat(value, arg): except (ValueError, TypeError): return "" @register.filter(is_safe=True) @stringfilter def title(value): Loading @@ -252,6 +263,7 @@ def title(value): t = re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title()) return re.sub("\d([A-Z])", lambda m: m.group(0).lower(), t) @register.filter(is_safe=True) @stringfilter def truncatechars(value, arg): Loading @@ -266,6 +278,7 @@ def truncatechars(value, arg): return value # Fail silently. return Truncator(value).chars(length) @register.filter(is_safe=True) @stringfilter def truncatewords(value, arg): Loading @@ -282,6 +295,7 @@ def truncatewords(value, arg): return value # Fail silently. return Truncator(value).words(length, truncate=' ...') @register.filter(is_safe=True) @stringfilter def truncatewords_html(value, arg): Loading @@ -298,12 +312,14 @@ def truncatewords_html(value, arg): return value # Fail silently. return Truncator(value).words(length, html=True, truncate=' ...') @register.filter(is_safe=False) @stringfilter def upper(value): """Converts a string into all uppercase.""" return value.upper() @register.filter(is_safe=False) @stringfilter def urlencode(value, safe=None): Loading @@ -320,12 +336,14 @@ def urlencode(value, safe=None): kwargs['safe'] = safe return urlquote(value, **kwargs) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def urlize(value, autoescape=None): """Converts URLs in plain text into clickable links.""" return mark_safe(urlize_impl(value, nofollow=True, autoescape=autoescape)) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def urlizetrunc(value, limit, autoescape=None): Loading @@ -338,12 +356,14 @@ def urlizetrunc(value, limit, autoescape=None): return mark_safe(urlize_impl(value, trim_url_limit=int(limit), nofollow=True, autoescape=autoescape)) @register.filter(is_safe=False) @stringfilter def wordcount(value): """Returns the number of words.""" return len(value.split()) @register.filter(is_safe=True) @stringfilter def wordwrap(value, arg): Loading @@ -354,6 +374,7 @@ def wordwrap(value, arg): """ return wrap(value, int(arg)) @register.filter(is_safe=True) @stringfilter def ljust(value, arg): Loading @@ -364,6 +385,7 @@ def ljust(value, arg): """ return value.ljust(int(arg)) @register.filter(is_safe=True) @stringfilter def rjust(value, arg): Loading @@ -374,12 +396,14 @@ def rjust(value, arg): """ return value.rjust(int(arg)) @register.filter(is_safe=True) @stringfilter def center(value, arg): """Centers the value in a field of a given width.""" return value.center(int(arg)) @register.filter @stringfilter def cut(value, arg): Loading @@ -392,6 +416,7 @@ def cut(value, arg): return mark_safe(value) return value ################### # HTML STRINGS # ################### Loading @@ -404,6 +429,7 @@ def escape_filter(value): """ return mark_for_escaping(value) @register.filter(is_safe=True) @stringfilter def force_escape(value): Loading @@ -414,6 +440,7 @@ def force_escape(value): """ return escape(value) @register.filter("linebreaks", is_safe=True, needs_autoescape=True) @stringfilter def linebreaks_filter(value, autoescape=None): Loading @@ -425,6 +452,7 @@ def linebreaks_filter(value, autoescape=None): autoescape = autoescape and not isinstance(value, SafeData) return mark_safe(linebreaks(value, autoescape)) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def linebreaksbr(value, autoescape=None): Loading @@ -438,6 +466,7 @@ def linebreaksbr(value, autoescape=None): value = escape(value) return mark_safe(value.replace('\n', '<br />')) @register.filter(is_safe=True) @stringfilter def safe(value): Loading @@ -446,6 +475,7 @@ def safe(value): """ return mark_safe(value) @register.filter(is_safe=True) def safeseq(value): """ Loading @@ -455,6 +485,7 @@ def safeseq(value): """ return [mark_safe(force_text(obj)) for obj in value] @register.filter(is_safe=True) @stringfilter def removetags(value, tags): Loading @@ -462,12 +493,14 @@ def removetags(value, tags): from django.utils.html import remove_tags return remove_tags(value, tags) @register.filter(is_safe=True) @stringfilter def striptags(value): """Strips all [X]HTML tags.""" return strip_tags(value) ################### # LISTS # ################### Loading @@ -483,6 +516,7 @@ def dictsort(value, arg): except (TypeError, VariableDoesNotExist): return '' @register.filter(is_safe=False) def dictsortreversed(value, arg): """ Loading @@ -494,6 +528,7 @@ def dictsortreversed(value, arg): except (TypeError, VariableDoesNotExist): return '' @register.filter(is_safe=False) def first(value): """Returns the first item in a list.""" Loading @@ -502,6 +537,7 @@ def first(value): except IndexError: return '' @register.filter(is_safe=True, needs_autoescape=True) def join(value, arg, autoescape=None): """ Loading @@ -516,6 +552,7 @@ def join(value, arg, autoescape=None): return value return mark_safe(data) @register.filter(is_safe=True) def last(value): "Returns the last item in a list" Loading @@ -524,6 +561,7 @@ def last(value): except IndexError: return '' @register.filter(is_safe=True) def length(value): """Returns the length of the value - useful for lists.""" Loading @@ -532,6 +570,7 @@ def length(value): except (ValueError, TypeError): return '' @register.filter(is_safe=False) def length_is(value, arg): """Returns a boolean of whether the value's length is the argument.""" Loading @@ -540,11 +579,13 @@ def length_is(value, arg): except (ValueError, TypeError): return '' @register.filter(is_safe=True) def random(value): """Returns a random item from the list.""" return random_module.choice(value) @register.filter("slice", is_safe=True) def slice_filter(value, arg): """ Loading @@ -566,6 +607,7 @@ def slice_filter(value, arg): except (ValueError, TypeError): return value # Fail silently. @register.filter(is_safe=True, needs_autoescape=True) def unordered_list(value, autoescape=None): """ Loading Loading @@ -655,6 +697,7 @@ def unordered_list(value, autoescape=None): value, converted = convert_old_style_list(value) return mark_safe(_helper(value)) ################### # INTEGERS # ################### Loading @@ -670,6 +713,7 @@ def add(value, arg): except Exception: return '' @register.filter(is_safe=False) def get_digit(value, arg): """ Loading @@ -690,6 +734,7 @@ def get_digit(value, arg): except IndexError: return 0 ################### # DATES # ################### Loading @@ -709,6 +754,7 @@ def date(value, arg=None): except AttributeError: return '' @register.filter(expects_localtime=True, is_safe=False) def time(value, arg=None): """Formats a time according to the given format.""" Loading @@ -724,6 +770,7 @@ def time(value, arg=None): except AttributeError: return '' @register.filter("timesince", is_safe=False) def timesince_filter(value, arg=None): """Formats a date as the time since that date (i.e. "4 days, 6 hours").""" Loading @@ -736,6 +783,7 @@ def timesince_filter(value, arg=None): except (ValueError, TypeError): return '' @register.filter("timeuntil", is_safe=False) def timeuntil_filter(value, arg=None): """Formats a date as the time until that date (i.e. "4 days, 6 hours").""" Loading @@ -746,6 +794,7 @@ def timeuntil_filter(value, arg=None): except (ValueError, TypeError): return '' ################### # LOGIC # ################### Loading @@ -755,6 +804,7 @@ def default(value, arg): """If value is unavailable, use given default.""" return value or arg @register.filter(is_safe=False) def default_if_none(value, arg): """If value is None, use given default.""" Loading @@ -762,11 +812,13 @@ def default_if_none(value, arg): return arg return value @register.filter(is_safe=False) def divisibleby(value, arg): """Returns True if the value is devisible by the argument.""" return int(value) % int(arg) == 0 @register.filter(is_safe=False) def yesno(value, arg=None): """ Loading Loading @@ -799,6 +851,7 @@ def yesno(value, arg=None): return yes return no ################### # MISC # ################### Loading Loading @@ -838,6 +891,7 @@ def filesizeformat(bytes): return avoid_wrapping(value) @register.filter(is_safe=False) def pluralize(value, arg='s'): """ Loading Loading @@ -882,11 +936,13 @@ def pluralize(value, arg='s'): pass return singular_suffix @register.filter("phone2numeric", is_safe=True) def phone2numeric_filter(value): """Takes a phone number and converts it in to its numerical equivalent.""" return phone2numeric(value) @register.filter(is_safe=True) def pprint(value): """A wrapper around pprint.pprint -- for debugging, really.""" Loading Loading
django/forms/widgets.py +11 −0 Original line number Diff line number Diff line Loading @@ -104,6 +104,7 @@ class Media(object): getattr(combined, 'add_' + name)(getattr(other, '_' + name, None)) return combined def media_property(cls): def _media(self): # Get the media property of the superclass, if it exists Loading Loading @@ -131,6 +132,7 @@ def media_property(cls): return base return property(_media) class MediaDefiningClass(type): """ Metaclass for classes that can have media definitions. Loading Loading @@ -162,6 +164,7 @@ class SubWidget(object): args.append(self.choices) return self.parent_widget.render(*args) class Widget(six.with_metaclass(MediaDefiningClass)): is_hidden = False # Determines whether this corresponds to an <input type="hidden">. needs_multipart_form = False # Determines does this widget need multipart form Loading Loading @@ -224,6 +227,7 @@ class Widget(six.with_metaclass(MediaDefiningClass)): """ return id_ class Input(Widget): """ Base class for all <input> widgets (except type='checkbox' and Loading Loading @@ -279,10 +283,12 @@ class PasswordInput(TextInput): value = None return super(PasswordInput, self).render(name, value, attrs) class HiddenInput(Input): input_type = 'hidden' is_hidden = True class MultipleHiddenInput(HiddenInput): """ A widget that handles <input type="hidden"> for fields that have a list Loading Loading @@ -313,6 +319,7 @@ class MultipleHiddenInput(HiddenInput): return data.getlist(name) return data.get(name, None) class FileInput(Input): input_type = 'file' needs_multipart_form = True Loading @@ -327,6 +334,7 @@ class FileInput(Input): FILE_INPUT_CONTRADICTION = object() class ClearableFileInput(FileInput): initial_text = ugettext_lazy('Currently') input_text = ugettext_lazy('Change') Loading Loading @@ -389,6 +397,7 @@ class ClearableFileInput(FileInput): return False return upload class Textarea(Widget): def __init__(self, attrs=None): # The 'rows' and 'cols' attributes are required for HTML correctness. Loading Loading @@ -515,6 +524,7 @@ class Select(Widget): output.append(self.render_option(selected_choices, option_value, option_label)) return '\n'.join(output) class NullBooleanSelect(Select): """ A Select Widget intended to be used with NullBooleanField. Loading Loading @@ -849,6 +859,7 @@ class SplitDateTimeWidget(MultiWidget): return [value.date(), value.time().replace(microsecond=0)] return [None, None] class SplitHiddenDateTimeWidget(SplitDateTimeWidget): """ A Widget that splits datetime input into two <input type="hidden"> inputs. Loading
django/http/multipartparser.py +9 −0 Original line number Diff line number Diff line Loading @@ -269,6 +269,7 @@ class MultiPartParser(object): """Cleanup filename from Internet Explorer full paths.""" return filename and filename[filename.rfind("\\")+1:].strip() class LazyStream(six.Iterator): """ The LazyStream wrapper allows one to get and "unget" bytes from a stream. Loading Loading @@ -380,6 +381,7 @@ class LazyStream(six.Iterator): " if there is none, report this to the Django developers." ) class ChunkIter(six.Iterator): """ An iterable that will yield chunks of data. Given a file-like object as the Loading @@ -403,6 +405,7 @@ class ChunkIter(six.Iterator): def __iter__(self): return self class InterBoundaryIter(six.Iterator): """ A Producer that will iterate over boundaries. Loading @@ -420,6 +423,7 @@ class InterBoundaryIter(six.Iterator): except InputStreamExhausted: raise StopIteration() class BoundaryIter(six.Iterator): """ A Producer that is sensitive to boundaries. Loading Loading @@ -516,6 +520,7 @@ class BoundaryIter(six.Iterator): end -= 1 return end, next def exhaust(stream_or_iterable): """ Completely exhausts an iterator or stream. Loading @@ -534,6 +539,7 @@ def exhaust(stream_or_iterable): for __ in iterator: pass def parse_boundary_stream(stream, max_header_size): """ Parses one and exactly one stream that encapsulates a boundary. Loading Loading @@ -592,6 +598,7 @@ def parse_boundary_stream(stream, max_header_size): return (TYPE, outdict, stream) class Parser(object): def __init__(self, stream, boundary): self._stream = stream Loading @@ -603,6 +610,7 @@ class Parser(object): # Iterate over each part yield parse_boundary_stream(sub_stream, 1024) def parse_header(line): """ Parse the header into a key-value. Input (line): bytes, output: unicode for key/name, bytes for value which Loading @@ -622,6 +630,7 @@ def parse_header(line): pdict[name] = value return key, pdict def _parse_header_params(s): plist = [] while s[:1] == b';': Loading
django/template/base.py +26 −0 Original line number Diff line number Diff line Loading @@ -95,9 +95,11 @@ class VariableDoesNotExist(Exception): return self.msg % tuple(force_text(p, errors='replace') for p in self.params) class InvalidTemplateLibrary(Exception): pass class Origin(object): def __init__(self, name): self.name = name Loading @@ -108,6 +110,7 @@ class Origin(object): def __str__(self): return self.name class StringOrigin(Origin): def __init__(self, source): super(StringOrigin, self).__init__(UNKNOWN_SOURCE) Loading @@ -116,6 +119,7 @@ class StringOrigin(Origin): def reload(self): return self.source class Template(object): def __init__(self, template_string, origin=None, name='<Unknown Template>'): Loading Loading @@ -146,6 +150,7 @@ class Template(object): finally: context.render_context.pop() def compile_string(template_string, origin): "Compiles template_string into NodeList ready for rendering" if settings.TEMPLATE_DEBUG: Loading @@ -157,6 +162,7 @@ def compile_string(template_string, origin): parser = parser_class(lexer.tokenize()) return parser.parse() class Token(object): def __init__(self, token_type, contents): # token_type must be TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK or Loading Loading @@ -184,6 +190,7 @@ class Token(object): split.append(bit) return split class Lexer(object): def __init__(self, template_string, origin): self.template_string = template_string Loading Loading @@ -235,6 +242,7 @@ class Lexer(object): self.lineno += token_string.count('\n') return token class Parser(object): def __init__(self, tokens): self.tokens = tokens Loading Loading @@ -370,6 +378,7 @@ class Parser(object): else: raise TemplateSyntaxError("Invalid filter: '%s'" % filter_name) class TokenParser(object): """ Subclass this and implement the top() method to parse a template line. Loading Loading @@ -523,6 +532,7 @@ filter_raw_string = r""" filter_re = re.compile(filter_raw_string, re.UNICODE | re.VERBOSE) class FilterExpression(object): """ Parses a variable token and its optional filters (all as a single string), Loading Loading @@ -644,6 +654,7 @@ class FilterExpression(object): def __str__(self): return self.token def resolve_variable(path, context): """ Returns the resolved variable, which may contain attribute syntax, within Loading @@ -653,6 +664,7 @@ def resolve_variable(path, context): """ return Variable(path).resolve(context) class Variable(object): """ A template variable, resolvable against a given context. The variable may Loading Loading @@ -793,6 +805,7 @@ class Variable(object): return current class Node(object): # Set this to True for nodes that must be first in the template (although # they can be preceded by text nodes. Loading Loading @@ -822,6 +835,7 @@ class Node(object): nodes.extend(nodelist.get_nodes_by_type(nodetype)) return nodes class NodeList(list): # Set to True the first time a non-TextNode is inserted by # extend_nodelist(). Loading @@ -847,6 +861,7 @@ class NodeList(list): def render_node(self, node, context): return node.render(context) class TextNode(Node): def __init__(self, s): self.s = s Loading @@ -858,6 +873,7 @@ class TextNode(Node): def render(self, context): return self.s def render_value_in_context(value, context): """ Converts any value to a string to become part of a rendered template. This Loading @@ -873,6 +889,7 @@ def render_value_in_context(value, context): else: return value class VariableNode(Node): def __init__(self, filter_expression): self.filter_expression = filter_expression Loading @@ -893,6 +910,7 @@ class VariableNode(Node): # Regex for token keyword arguments kwarg_re = re.compile(r"(?:(\w+)=)?(.+)") def token_kwargs(bits, parser, support_legacy=False): """ A utility method for parsing token keyword arguments. Loading Loading @@ -942,6 +960,7 @@ def token_kwargs(bits, parser, support_legacy=False): del bits[:1] return kwargs def parse_bits(parser, bits, params, varargs, varkw, defaults, takes_context, name): """ Loading Loading @@ -1009,6 +1028,7 @@ def parse_bits(parser, bits, params, varargs, varkw, defaults, (name, ", ".join("'%s'" % p for p in unhandled_params))) return args, kwargs def generic_tag_compiler(parser, token, params, varargs, varkw, defaults, name, takes_context, node_class): """ Loading @@ -1019,6 +1039,7 @@ def generic_tag_compiler(parser, token, params, varargs, varkw, defaults, defaults, takes_context, name) return node_class(takes_context, args, kwargs) class TagHelperNode(Node): """ Base class for tag helper nodes such as SimpleNode, InclusionNode and Loading @@ -1039,6 +1060,7 @@ class TagHelperNode(Node): for k, v in self.kwargs.items()) return resolved_args, resolved_kwargs class Library(object): def __init__(self): self.filters = {} Loading Loading @@ -1224,6 +1246,7 @@ class Library(object): return func return dec def is_library_missing(name): """Check if library that failed to load cannot be found under any templatetags directory or does exist but fails to import. Loading @@ -1240,6 +1263,7 @@ def is_library_missing(name): except ImportError: return is_library_missing(path) def import_library(taglib_module): """ Load a template tag library module. Loading Loading @@ -1268,6 +1292,7 @@ def import_library(taglib_module): templatetags_modules = [] def get_templatetags_modules(): """ Return the list of all available template tag modules. Loading @@ -1290,6 +1315,7 @@ def get_templatetags_modules(): templatetags_modules = _templatetags_modules return templatetags_modules def get_library(library_name): """ Load the template library module with the given name. Loading
django/template/context.py +2 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,7 @@ class RenderContext(BaseContext): return d[key] return otherwise # This is a function rather than module-level procedural code because we only # want it to execute if somebody uses RequestContext. def get_standard_processors(): Loading @@ -166,6 +167,7 @@ def get_standard_processors(): _standard_context_processors = tuple(processors) return _standard_context_processors class RequestContext(Context): """ This subclass of template.Context automatically populates itself using Loading
django/template/defaultfilters.py +56 −0 Original line number Diff line number Diff line Loading @@ -66,18 +66,21 @@ def addslashes(value): """ return value.replace('\\', '\\\\').replace('"', '\\"').replace("'", "\\'") @register.filter(is_safe=True) @stringfilter def capfirst(value): """Capitalizes the first character of the value.""" return value and value[0].upper() + value[1:] @register.filter("escapejs") @stringfilter def escapejs_filter(value): """Hex encodes characters for use in JavaScript strings.""" return escapejs(value) @register.filter("fix_ampersands", is_safe=True) @stringfilter def fix_ampersands_filter(value): Loading @@ -96,6 +99,7 @@ neg_inf = -1e200 * 1e200 nan = (1e200 * 1e200) // (1e200 * 1e200) special_floats = [str(pos_inf), str(neg_inf), str(nan)] @register.filter(is_safe=True) def floatformat(text, arg=-1): """ Loading Loading @@ -179,12 +183,14 @@ def floatformat(text, arg=-1): except InvalidOperation: return input_val @register.filter(is_safe=True) @stringfilter def iriencode(value): """Escapes an IRI value for use in a URL.""" return force_text(iri_to_uri(value)) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def linenumbers(value, autoescape=None): Loading @@ -201,12 +207,14 @@ def linenumbers(value, autoescape=None): lines[i] = ("%0" + width + "d. %s") % (i + 1, escape(line)) return mark_safe('\n'.join(lines)) @register.filter(is_safe=True) @stringfilter def lower(value): """Converts a string into all lowercase.""" return value.lower() @register.filter(is_safe=False) @stringfilter def make_list(value): Loading @@ -218,6 +226,7 @@ def make_list(value): """ return list(value) @register.filter(is_safe=True) @stringfilter def slugify(value): Loading @@ -229,6 +238,7 @@ def slugify(value): from django.utils.text import slugify return slugify(value) @register.filter(is_safe=True) def stringformat(value, arg): """ Loading @@ -245,6 +255,7 @@ def stringformat(value, arg): except (ValueError, TypeError): return "" @register.filter(is_safe=True) @stringfilter def title(value): Loading @@ -252,6 +263,7 @@ def title(value): t = re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title()) return re.sub("\d([A-Z])", lambda m: m.group(0).lower(), t) @register.filter(is_safe=True) @stringfilter def truncatechars(value, arg): Loading @@ -266,6 +278,7 @@ def truncatechars(value, arg): return value # Fail silently. return Truncator(value).chars(length) @register.filter(is_safe=True) @stringfilter def truncatewords(value, arg): Loading @@ -282,6 +295,7 @@ def truncatewords(value, arg): return value # Fail silently. return Truncator(value).words(length, truncate=' ...') @register.filter(is_safe=True) @stringfilter def truncatewords_html(value, arg): Loading @@ -298,12 +312,14 @@ def truncatewords_html(value, arg): return value # Fail silently. return Truncator(value).words(length, html=True, truncate=' ...') @register.filter(is_safe=False) @stringfilter def upper(value): """Converts a string into all uppercase.""" return value.upper() @register.filter(is_safe=False) @stringfilter def urlencode(value, safe=None): Loading @@ -320,12 +336,14 @@ def urlencode(value, safe=None): kwargs['safe'] = safe return urlquote(value, **kwargs) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def urlize(value, autoescape=None): """Converts URLs in plain text into clickable links.""" return mark_safe(urlize_impl(value, nofollow=True, autoescape=autoescape)) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def urlizetrunc(value, limit, autoescape=None): Loading @@ -338,12 +356,14 @@ def urlizetrunc(value, limit, autoescape=None): return mark_safe(urlize_impl(value, trim_url_limit=int(limit), nofollow=True, autoescape=autoescape)) @register.filter(is_safe=False) @stringfilter def wordcount(value): """Returns the number of words.""" return len(value.split()) @register.filter(is_safe=True) @stringfilter def wordwrap(value, arg): Loading @@ -354,6 +374,7 @@ def wordwrap(value, arg): """ return wrap(value, int(arg)) @register.filter(is_safe=True) @stringfilter def ljust(value, arg): Loading @@ -364,6 +385,7 @@ def ljust(value, arg): """ return value.ljust(int(arg)) @register.filter(is_safe=True) @stringfilter def rjust(value, arg): Loading @@ -374,12 +396,14 @@ def rjust(value, arg): """ return value.rjust(int(arg)) @register.filter(is_safe=True) @stringfilter def center(value, arg): """Centers the value in a field of a given width.""" return value.center(int(arg)) @register.filter @stringfilter def cut(value, arg): Loading @@ -392,6 +416,7 @@ def cut(value, arg): return mark_safe(value) return value ################### # HTML STRINGS # ################### Loading @@ -404,6 +429,7 @@ def escape_filter(value): """ return mark_for_escaping(value) @register.filter(is_safe=True) @stringfilter def force_escape(value): Loading @@ -414,6 +440,7 @@ def force_escape(value): """ return escape(value) @register.filter("linebreaks", is_safe=True, needs_autoescape=True) @stringfilter def linebreaks_filter(value, autoescape=None): Loading @@ -425,6 +452,7 @@ def linebreaks_filter(value, autoescape=None): autoescape = autoescape and not isinstance(value, SafeData) return mark_safe(linebreaks(value, autoescape)) @register.filter(is_safe=True, needs_autoescape=True) @stringfilter def linebreaksbr(value, autoescape=None): Loading @@ -438,6 +466,7 @@ def linebreaksbr(value, autoescape=None): value = escape(value) return mark_safe(value.replace('\n', '<br />')) @register.filter(is_safe=True) @stringfilter def safe(value): Loading @@ -446,6 +475,7 @@ def safe(value): """ return mark_safe(value) @register.filter(is_safe=True) def safeseq(value): """ Loading @@ -455,6 +485,7 @@ def safeseq(value): """ return [mark_safe(force_text(obj)) for obj in value] @register.filter(is_safe=True) @stringfilter def removetags(value, tags): Loading @@ -462,12 +493,14 @@ def removetags(value, tags): from django.utils.html import remove_tags return remove_tags(value, tags) @register.filter(is_safe=True) @stringfilter def striptags(value): """Strips all [X]HTML tags.""" return strip_tags(value) ################### # LISTS # ################### Loading @@ -483,6 +516,7 @@ def dictsort(value, arg): except (TypeError, VariableDoesNotExist): return '' @register.filter(is_safe=False) def dictsortreversed(value, arg): """ Loading @@ -494,6 +528,7 @@ def dictsortreversed(value, arg): except (TypeError, VariableDoesNotExist): return '' @register.filter(is_safe=False) def first(value): """Returns the first item in a list.""" Loading @@ -502,6 +537,7 @@ def first(value): except IndexError: return '' @register.filter(is_safe=True, needs_autoescape=True) def join(value, arg, autoescape=None): """ Loading @@ -516,6 +552,7 @@ def join(value, arg, autoescape=None): return value return mark_safe(data) @register.filter(is_safe=True) def last(value): "Returns the last item in a list" Loading @@ -524,6 +561,7 @@ def last(value): except IndexError: return '' @register.filter(is_safe=True) def length(value): """Returns the length of the value - useful for lists.""" Loading @@ -532,6 +570,7 @@ def length(value): except (ValueError, TypeError): return '' @register.filter(is_safe=False) def length_is(value, arg): """Returns a boolean of whether the value's length is the argument.""" Loading @@ -540,11 +579,13 @@ def length_is(value, arg): except (ValueError, TypeError): return '' @register.filter(is_safe=True) def random(value): """Returns a random item from the list.""" return random_module.choice(value) @register.filter("slice", is_safe=True) def slice_filter(value, arg): """ Loading @@ -566,6 +607,7 @@ def slice_filter(value, arg): except (ValueError, TypeError): return value # Fail silently. @register.filter(is_safe=True, needs_autoescape=True) def unordered_list(value, autoescape=None): """ Loading Loading @@ -655,6 +697,7 @@ def unordered_list(value, autoescape=None): value, converted = convert_old_style_list(value) return mark_safe(_helper(value)) ################### # INTEGERS # ################### Loading @@ -670,6 +713,7 @@ def add(value, arg): except Exception: return '' @register.filter(is_safe=False) def get_digit(value, arg): """ Loading @@ -690,6 +734,7 @@ def get_digit(value, arg): except IndexError: return 0 ################### # DATES # ################### Loading @@ -709,6 +754,7 @@ def date(value, arg=None): except AttributeError: return '' @register.filter(expects_localtime=True, is_safe=False) def time(value, arg=None): """Formats a time according to the given format.""" Loading @@ -724,6 +770,7 @@ def time(value, arg=None): except AttributeError: return '' @register.filter("timesince", is_safe=False) def timesince_filter(value, arg=None): """Formats a date as the time since that date (i.e. "4 days, 6 hours").""" Loading @@ -736,6 +783,7 @@ def timesince_filter(value, arg=None): except (ValueError, TypeError): return '' @register.filter("timeuntil", is_safe=False) def timeuntil_filter(value, arg=None): """Formats a date as the time until that date (i.e. "4 days, 6 hours").""" Loading @@ -746,6 +794,7 @@ def timeuntil_filter(value, arg=None): except (ValueError, TypeError): return '' ################### # LOGIC # ################### Loading @@ -755,6 +804,7 @@ def default(value, arg): """If value is unavailable, use given default.""" return value or arg @register.filter(is_safe=False) def default_if_none(value, arg): """If value is None, use given default.""" Loading @@ -762,11 +812,13 @@ def default_if_none(value, arg): return arg return value @register.filter(is_safe=False) def divisibleby(value, arg): """Returns True if the value is devisible by the argument.""" return int(value) % int(arg) == 0 @register.filter(is_safe=False) def yesno(value, arg=None): """ Loading Loading @@ -799,6 +851,7 @@ def yesno(value, arg=None): return yes return no ################### # MISC # ################### Loading Loading @@ -838,6 +891,7 @@ def filesizeformat(bytes): return avoid_wrapping(value) @register.filter(is_safe=False) def pluralize(value, arg='s'): """ Loading Loading @@ -882,11 +936,13 @@ def pluralize(value, arg='s'): pass return singular_suffix @register.filter("phone2numeric", is_safe=True) def phone2numeric_filter(value): """Takes a phone number and converts it in to its numerical equivalent.""" return phone2numeric(value) @register.filter(is_safe=True) def pprint(value): """A wrapper around pprint.pprint -- for debugging, really.""" Loading