Module glasswall.content_management.policies.word_search

Expand source code
import glasswall
from glasswall.content_management.config_elements.config_element import ConfigElement
from glasswall.content_management.policies.policy import Policy
from glasswall.content_management.switches.switch import Switch


class WordSearch(Policy):
    """ A content management policy for Word Search.

    WordSearch(default="allow", config={
        "textSearchConfig": {
            "@libVersion": "core2",
            "textList": [
                {"name": "textItem", "switches": [
                    {"name": "text", "value": "generic"},
                    {"name": "textSetting", "@replacementChar": "*", "value": "redact"},
                ]},
            ]
        }
    })
    """

    def __init__(self, default: str = "allow", config: dict = {}):
        self.default = default
        self.default_config_elements = [
            glasswall.content_management.config_elements.pdfConfig(default=default),
            glasswall.content_management.config_elements.pptConfig(default=default),
            glasswall.content_management.config_elements.sysConfig(interchange_type="xml"),
            glasswall.content_management.config_elements.tiffConfig(default=default),
            glasswall.content_management.config_elements.wordConfig(default=default),
            glasswall.content_management.config_elements.xlsConfig(default=default),
        ]
        self.config = config

        super().__init__(
            default=self.default,
            default_config_elements=self.default_config_elements,
            config=self.config,
        )

    def add_textItem(self, text: str, replacementChar: str, textSetting: str = "redact", **kwargs):
        """ Adds a textItem to the textSearchConfig textList subelements. """
        textSearchConfig = next(iter(c for c in self.config_elements if c.name == "textSearchConfig"), None)
        if not textSearchConfig:
            # Add textSearchConfig to ConfigElements
            textSearchConfig = ConfigElement(
                name="textSearchConfig",
                attributes={"libVersion": kwargs.get("libVersion", "core2")},
                subelements=[ConfigElement(name="textList")]
            )
            self.add_config_element(
                config_element=textSearchConfig,
            )

        # Select the ConfigElement named textList
        textList = next(iter(s for s in textSearchConfig.subelements if s.name == "textList"))

        # If textList has a subelement textItem that contains a switch named "text" with the same .value as arg "text", delete it to avoid duplicates.
        #   (cannot redact "generic" with "*" and also redact "generic" with "@")
        for textItem in textList.subelements.copy():
            for switch in textItem.switches:
                if switch.name == "text" and switch.value.lower() == text.lower():
                    # Remove textItem from tetList.subelements using the builtin list .remove method
                    textList.subelements.remove(textItem)
                    break

        # Add textItem to end of textList.subelements
        textList.subelements.append(
            ConfigElement(
                name="textItem",
                switches=[
                    Switch(name="text", value=text),
                    Switch(name="textSetting", attributes={"replacementChar": replacementChar}, value=textSetting)
                ],
            )
        )

        # Don't sort textList: this preserves top-down order for redaction settings.

    def remove_textItem(self, text: str):
        """ Removes a textItem from the textSearchConfig textList subelements. """
        textSearchConfig = next(iter(c for c in self.config_elements if c.name == "textSearchConfig"), None)
        if not textSearchConfig:
            raise glasswall.content_management.errors.config_elements.ConfigElementNotFound("textSearchConfig")

        # Select the ConfigElement named textList
        textList = next(iter(s for s in textSearchConfig.subelements if s.name == "textList"))

        all_textItem_texts = [
            switch.value.lower()
            for textItem in textList.subelements
            for switch in textItem.switches
            if switch.name == "text"
        ]
        if text not in all_textItem_texts:
            raise glasswall.content_management.errors.switches.SwitchNotFound(f"No switch found with name: 'text' and value: '{text}'")

        # If textList has a subelement textItem that contains a switch named "text" with the same .value as arg "text", delete it to avoid duplicates.
        #   (cannot redact "generic" with "*" and also redact "GeNeRiC" with "@")
        for textItem in textList.subelements.copy():
            for switch in textItem.switches:
                if switch.name == "text" and switch.value.lower() == text.lower():
                    textList.subelements.remove(textItem)
                    break

Classes

class WordSearch (default: str = 'allow', config: dict = {})

A content management policy for Word Search.

WordSearch(default="allow", config={ "textSearchConfig": { "@libVersion": "core2", "textList": [ {"name": "textItem", "switches": [ {"name": "text", "value": "generic"}, {"name": "textSetting", "@replacementChar": "*", "value": "redact"}, ]}, ] } })

Expand source code
class WordSearch(Policy):
    """ A content management policy for Word Search.

    WordSearch(default="allow", config={
        "textSearchConfig": {
            "@libVersion": "core2",
            "textList": [
                {"name": "textItem", "switches": [
                    {"name": "text", "value": "generic"},
                    {"name": "textSetting", "@replacementChar": "*", "value": "redact"},
                ]},
            ]
        }
    })
    """

    def __init__(self, default: str = "allow", config: dict = {}):
        self.default = default
        self.default_config_elements = [
            glasswall.content_management.config_elements.pdfConfig(default=default),
            glasswall.content_management.config_elements.pptConfig(default=default),
            glasswall.content_management.config_elements.sysConfig(interchange_type="xml"),
            glasswall.content_management.config_elements.tiffConfig(default=default),
            glasswall.content_management.config_elements.wordConfig(default=default),
            glasswall.content_management.config_elements.xlsConfig(default=default),
        ]
        self.config = config

        super().__init__(
            default=self.default,
            default_config_elements=self.default_config_elements,
            config=self.config,
        )

    def add_textItem(self, text: str, replacementChar: str, textSetting: str = "redact", **kwargs):
        """ Adds a textItem to the textSearchConfig textList subelements. """
        textSearchConfig = next(iter(c for c in self.config_elements if c.name == "textSearchConfig"), None)
        if not textSearchConfig:
            # Add textSearchConfig to ConfigElements
            textSearchConfig = ConfigElement(
                name="textSearchConfig",
                attributes={"libVersion": kwargs.get("libVersion", "core2")},
                subelements=[ConfigElement(name="textList")]
            )
            self.add_config_element(
                config_element=textSearchConfig,
            )

        # Select the ConfigElement named textList
        textList = next(iter(s for s in textSearchConfig.subelements if s.name == "textList"))

        # If textList has a subelement textItem that contains a switch named "text" with the same .value as arg "text", delete it to avoid duplicates.
        #   (cannot redact "generic" with "*" and also redact "generic" with "@")
        for textItem in textList.subelements.copy():
            for switch in textItem.switches:
                if switch.name == "text" and switch.value.lower() == text.lower():
                    # Remove textItem from tetList.subelements using the builtin list .remove method
                    textList.subelements.remove(textItem)
                    break

        # Add textItem to end of textList.subelements
        textList.subelements.append(
            ConfigElement(
                name="textItem",
                switches=[
                    Switch(name="text", value=text),
                    Switch(name="textSetting", attributes={"replacementChar": replacementChar}, value=textSetting)
                ],
            )
        )

        # Don't sort textList: this preserves top-down order for redaction settings.

    def remove_textItem(self, text: str):
        """ Removes a textItem from the textSearchConfig textList subelements. """
        textSearchConfig = next(iter(c for c in self.config_elements if c.name == "textSearchConfig"), None)
        if not textSearchConfig:
            raise glasswall.content_management.errors.config_elements.ConfigElementNotFound("textSearchConfig")

        # Select the ConfigElement named textList
        textList = next(iter(s for s in textSearchConfig.subelements if s.name == "textList"))

        all_textItem_texts = [
            switch.value.lower()
            for textItem in textList.subelements
            for switch in textItem.switches
            if switch.name == "text"
        ]
        if text not in all_textItem_texts:
            raise glasswall.content_management.errors.switches.SwitchNotFound(f"No switch found with name: 'text' and value: '{text}'")

        # If textList has a subelement textItem that contains a switch named "text" with the same .value as arg "text", delete it to avoid duplicates.
        #   (cannot redact "generic" with "*" and also redact "GeNeRiC" with "@")
        for textItem in textList.subelements.copy():
            for switch in textItem.switches:
                if switch.name == "text" and switch.value.lower() == text.lower():
                    textList.subelements.remove(textItem)
                    break

Ancestors

Methods

def add_textItem(self, text: str, replacementChar: str, textSetting: str = 'redact', **kwargs)

Adds a textItem to the textSearchConfig textList subelements.

Expand source code
def add_textItem(self, text: str, replacementChar: str, textSetting: str = "redact", **kwargs):
    """ Adds a textItem to the textSearchConfig textList subelements. """
    textSearchConfig = next(iter(c for c in self.config_elements if c.name == "textSearchConfig"), None)
    if not textSearchConfig:
        # Add textSearchConfig to ConfigElements
        textSearchConfig = ConfigElement(
            name="textSearchConfig",
            attributes={"libVersion": kwargs.get("libVersion", "core2")},
            subelements=[ConfigElement(name="textList")]
        )
        self.add_config_element(
            config_element=textSearchConfig,
        )

    # Select the ConfigElement named textList
    textList = next(iter(s for s in textSearchConfig.subelements if s.name == "textList"))

    # If textList has a subelement textItem that contains a switch named "text" with the same .value as arg "text", delete it to avoid duplicates.
    #   (cannot redact "generic" with "*" and also redact "generic" with "@")
    for textItem in textList.subelements.copy():
        for switch in textItem.switches:
            if switch.name == "text" and switch.value.lower() == text.lower():
                # Remove textItem from tetList.subelements using the builtin list .remove method
                textList.subelements.remove(textItem)
                break

    # Add textItem to end of textList.subelements
    textList.subelements.append(
        ConfigElement(
            name="textItem",
            switches=[
                Switch(name="text", value=text),
                Switch(name="textSetting", attributes={"replacementChar": replacementChar}, value=textSetting)
            ],
        )
    )

    # Don't sort textList: this preserves top-down order for redaction settings.
def remove_textItem(self, text: str)

Removes a textItem from the textSearchConfig textList subelements.

Expand source code
def remove_textItem(self, text: str):
    """ Removes a textItem from the textSearchConfig textList subelements. """
    textSearchConfig = next(iter(c for c in self.config_elements if c.name == "textSearchConfig"), None)
    if not textSearchConfig:
        raise glasswall.content_management.errors.config_elements.ConfigElementNotFound("textSearchConfig")

    # Select the ConfigElement named textList
    textList = next(iter(s for s in textSearchConfig.subelements if s.name == "textList"))

    all_textItem_texts = [
        switch.value.lower()
        for textItem in textList.subelements
        for switch in textItem.switches
        if switch.name == "text"
    ]
    if text not in all_textItem_texts:
        raise glasswall.content_management.errors.switches.SwitchNotFound(f"No switch found with name: 'text' and value: '{text}'")

    # If textList has a subelement textItem that contains a switch named "text" with the same .value as arg "text", delete it to avoid duplicates.
    #   (cannot redact "generic" with "*" and also redact "GeNeRiC" with "@")
    for textItem in textList.subelements.copy():
        for switch in textItem.switches:
            if switch.name == "text" and switch.value.lower() == text.lower():
                textList.subelements.remove(textItem)
                break

Inherited members