def render(self, context):
        action_list = []
        imageurl = resolve(self.imageurl, context)

        if not imageurl:
            imageurl = settings.NO_IMAGE_URL

        if not imageurl:
            return ""

        for action in self.actions:
            action_code = ACTIONS[action[0]]
            arg_list = [str(resolve(template.Variable(arg), context)) for arg in action[1:]]
            args = "-".join(arg_list)
            if settings.PROCESSORS[action_code].param_pattern().match(args):
                action_list.append("_%s%s" % (action_code, args))
            else:
                raise template.TemplateSyntaxError("The action '%s' doesn't accept the arguments: %s" % (action[0], ",".join(action[1:])))

        # Make sure we've actually got some actions.
        if not action_list:
            return imageurl

        # Create the new URL
        action_string = "".join(action_list)
        prefix, ext = os.path.splitext(imageurl)
        imageurl = "%s%s%s" % (prefix, action_string, ext)

        # Create a security hash from the new URL
        base_file_name, action_tuples = utils.parse_action_tuples(imageurl)
        security_hash = utils.create_securityhash(action_tuples)

        return "%s?%s" % (imageurl, security_hash)
    def inner(imageurl, arg_string=""):
        action_list = []

        bits = arg_string.split()

        # parse one arg vs two args
        if len(bits) == 2:
            arg_list = [bits[0], bits[1].lstrip("#")]
        else:
            arg_list = bits

        # dispose of an existing security hash if it exists
        if "?" in imageurl:
            imageurl, _ = imageurl.split("?", 1)

        if not imageurl:
            imageurl = settings.NO_IMAGE_URL

        if not imageurl:
            return ""

        # build the action list
        action_code = ACTIONS[action]
        args = "-".join(arg_list)
        if settings.PROCESSORS[action_code].param_pattern().match(args):
            action_list.append("_%s%s" % (action_code, args))
        else:
            raise template.TemplateSyntaxError(
                "The action '%s' doesn't accept the arguments: %s" %
                (action[0], ",".join(action[1:])))

        if not action_list:
            return imageurl

        # Create the new URL
        action_string = "".join(action_list)
        prefix, ext = os.path.splitext(imageurl)
        imageurl = "%s%s%s" % (prefix, action_string, ext)

        # Create a security hash from the new URL
        base_file_name, action_tuples = utils.parse_action_tuples(imageurl)
        security_hash = utils.create_securityhash(action_tuples)

        return "%s?%s" % (imageurl, security_hash)
    def inner(imageurl, arg_string=""):
        action_list = []

        bits = arg_string.split()

        # parse one arg vs two args
        if len(bits) == 2:
            arg_list = [bits[0], bits[1].lstrip("#")]
        else:
            arg_list = bits

        # dispose of an existing security hash if it exists
        if "?" in imageurl:
            imageurl, _ = imageurl.split("?", 1)

        if not imageurl:
            imageurl = settings.NO_IMAGE_URL

        if not imageurl:
            return ""

        # build the action list
        action_code = ACTIONS[action]
        args = "-".join(arg_list)
        if settings.PROCESSORS[action_code].param_pattern().match(args):
            action_list.append("_%s%s" % (action_code, args))
        else:
            raise template.TemplateSyntaxError("The action '%s' doesn't accept the arguments: %s" % (action[0], ",".join(action[1:])))

        if not action_list:
            return imageurl

        # Create the new URL
        action_string = "".join(action_list)
        prefix, ext = os.path.splitext(imageurl)
        imageurl = "%s%s%s" % (prefix, action_string, ext)

        # Create a security hash from the new URL
        base_file_name, action_tuples = utils.parse_action_tuples(imageurl)
        security_hash = utils.create_securityhash(action_tuples)

        return "%s?%s" % (imageurl, security_hash)
    def render(self, context):
        action_list = []
        imageurl = resolve(self.imageurl, context)

        if not imageurl:
            imageurl = settings.NO_IMAGE_URL

        if not imageurl:
            return ""

        for action in self.actions:
            action_code = ACTIONS[action[0]]
            arg_list = [
                str(resolve(template.Variable(arg), context))
                for arg in action[1:]
            ]
            args = "-".join(arg_list)
            if settings.PROCESSORS[action_code].param_pattern().match(args):
                action_list.append("_%s%s" % (action_code, args))
            else:
                raise template.TemplateSyntaxError(
                    "The action '%s' doesn't accept the arguments: %s" %
                    (action[0], ",".join(action[1:])))

        # Make sure we've actually got some actions.
        if not action_list:
            return imageurl

        # Create the new URL
        action_string = "".join(action_list)
        prefix, ext = os.path.splitext(imageurl)
        imageurl = "%s%s%s" % (prefix, action_string, ext)

        # Create a security hash from the new URL
        base_file_name, action_tuples = utils.parse_action_tuples(imageurl)
        security_hash = utils.create_securityhash(action_tuples)

        return "%s?%s" % (imageurl, security_hash)