コード例 #1
0
class RemoveTagOptions(MenuToolOptions):
    """Class for creating menu options."""
    def __init__(self, name, person_id=None, dbstate=None):
        self.db = dbstate.get_database()
        MenuToolOptions.__init__(self, name, person_id, dbstate)

    def add_menu_options(self, menu):
        """Add the menu options for the tool."""
        if self.__is_db_empty():
            txt = [_("The Tool requires at least one tag to execute.")]
            self.empty = TextOption(_("ERROR"), txt)
            self.empty.set_available(False)
            menu.add_option(_("ERROR"), "empty", self.empty)
            return  # stop other menu option creation
        else:
            self.__general_options(menu)
            self.__filter_options(menu)

    def __enum_tag_list(self):
        """Return an enumerated tag name list."""
        tag_list = list(self.db.iter_tags())
        if tag_list:
            L = list(map(lambda x: x.get_name(), tag_list))
            return list(enumerate(L))

    def __is_db_empty(self):
        """Check if database has at least one tag."""
        try:
            next(self.db.iter_tag_handles())
        except StopIteration:
            # StopIteration is raised when the category has no objects
            return True  # Empty
        return False  # Not empty

    def __general_options(self, menu):
        """Menu Options for general option tab."""
        # Add or remove tags menu option
        self.add_remove = FilterOption(_("Add/Remove"), 0)
        self.add_remove.set_help(_("Add or remove tags from objects."))
        self.add_remove.set_items([(0, _("Add Tags")), (1, _("Remove Tags"))])
        menu.add_option(_("General options"), "add_remove", self.add_remove)

        # category menu option
        lst = [
            _("People"),
            _("Families"),
            _("Events"),
            _("Places"),
            _("Sources"),
            _("Citations"),
            _("Repositories"),
            _("Media"),
            _("Notes")
        ]
        category_list = list(enumerate(lst))
        self.tag_category = FilterOption(_("Category"), 0)
        self.tag_category.set_help(_("Choose a category."))
        menu.add_option(_("General options"), "category", self.tag_category)
        self.tag_category.set_items(category_list)
        self.tag_category.connect('value-changed', self.__update_options)

        # tag name list menu option
        tag_list = self.__enum_tag_list()
        self.tag_name = FilterOption(_("Choose Tag"), 0)
        self.tag_name.set_help(_("Choose a tag to remove."))
        menu.add_option(_("General options"), "tag_name", self.tag_name)
        self.tag_name.set_items(tag_list)

    def __filter_options(self, menu):
        """Menu Options for filter option tab."""
        self.filter_dict = {}

        # get all filter rules, used for generic filters
        all_persons = rules.person.Everyone([])
        all_families = rules.family.AllFamilies([])
        all_events = rules.event.AllEvents([])
        all_places = rules.place.AllPlaces([])
        all_sources = rules.source.AllSources([])
        all_cits = rules.citation.AllCitations([])
        all_repos = rules.repository.AllRepos([])
        all_media = rules.media.AllMedia([])
        all_notes = rules.note.AllNotes([])

        # create a list used for menu filter option creation later
        lst = [(_("Person Filter"), 'Person', _("Persons"), all_persons),
               (_("Family Filter"), 'Family', _("Families"), all_families),
               (_("Event Filter"), 'Event', _("Events"), all_events),
               (_("Place Filter"), 'Place', _("Places"), all_places),
               (_("Source Filter"), 'Source', _("Sources"), all_sources),
               (_("Citation Filter"), 'Citation', _("Citations"), all_cits),
               (_("Repository Filter"), 'Repository',
                _("Repositories"), all_repos),
               (_("Media Filter"), 'Media', _("Media"), all_media),
               (_("Note Filter"), 'Note', _("Notes"), all_notes)]

        for entry in lst:
            # create a filter option for each category e.g. person, events
            # filter option is a combination of custom filters and
            # a generic filter for all objects of one category
            filter_name = FilterOption(entry[0], 0)
            menu.add_option(_("Filter options"), entry[1].lower(), filter_name)
            self.filter_dict[entry[1]] = filter_name

            # custom filter:
            filter_list = CustomFilters.get_filters(entry[1])

            # generic filter:
            GenericFilter = GenericFilterFactory(entry[1])
            all_filter = GenericFilter()
            all_filter.set_name(_("All %s") % (entry[2]))
            all_filter.add_rule(entry[3])

            # only add the generic filter if it isn't already in the menu
            all_filter_in_list = False
            for fltr in filter_list:
                if fltr.get_name() == all_filter.get_name():
                    all_filter_in_list = True
            if not all_filter_in_list:
                filter_list.insert(0, all_filter)

            # add the list of custom and generic filters
            # to the filter option
            self.filter_dict[entry[1]].set_filters(filter_list)

    def __update_options(self):
        """Turn availability on and off depending on user selection."""
        lst = [
            'Person', 'Family', 'Event', 'Place', 'Source', 'Citation',
            'Repository', 'Media', 'Note'
        ]
        for entry in lst:
            self.filter_dict[entry].set_available(False)
        value = self.tag_category.get_value()
        self.filter_dict[lst[value]].set_available(True)