Пример #1
0
    def cb_merge(self, obj):
        """
        Perform the merge of the media objects when the merge button is clicked.
        """
        use_handle1 = self.get_widget("handle_btn1").get_active()
        if use_handle1:
            phoenix = self.mo1
            titanic = self.mo2
        else:
            phoenix = self.mo2
            titanic = self.mo1
            # Add second handle to history so that when merge is complete,
            # phoenix is the selected row.
            self.uistate.set_active(phoenix.get_handle(), 'Media')

        if self.get_widget("path_btn1").get_active() ^ use_handle1:
            phoenix.set_path(titanic.get_path())
            phoenix.set_mime_type(titanic.get_mime_type())
        if self.get_widget("desc_btn1").get_active() ^ use_handle1:
            phoenix.set_description(titanic.get_description())
        if self.get_widget("date_btn1").get_active() ^ use_handle1:
            phoenix.set_date_object(titanic.get_date_object())
        if self.get_widget("gramps_btn1").get_active() ^ use_handle1:
            phoenix.set_gramps_id(titanic.get_gramps_id())

        query = MergeMediaQuery(self.dbstate, phoenix, titanic)
        query.execute()
        self.close()
Пример #2
0
    def cb_merge(self, obj):
        """
        Perform the merge of the media objects when the merge button is clicked.
        """
        use_handle1 = self.get_widget("handle_btn1").get_active()
        if use_handle1:
            phoenix = self.mo1
            titanic = self.mo2
        else:
            phoenix = self.mo2
            titanic = self.mo1
            # Add second handle to history so that when merge is complete,
            # phoenix is the selected row.
            self.uistate.set_active(phoenix.get_handle(), 'Media')

        if self.get_widget("path_btn1").get_active() ^ use_handle1:
            phoenix.set_path(titanic.get_path())
            phoenix.set_mime_type(titanic.get_mime_type())
        if self.get_widget("desc_btn1").get_active() ^ use_handle1:
            phoenix.set_description(titanic.get_description())
        if self.get_widget("date_btn1").get_active() ^ use_handle1:
            phoenix.set_date_object(titanic.get_date_object())
        if self.get_widget("gramps_btn1").get_active() ^ use_handle1:
            phoenix.set_gramps_id(titanic.get_gramps_id())

        query = MergeMediaQuery(self.dbstate, phoenix, titanic)
        query.execute()
        self.close()
Пример #3
0
    def run(self):
        """
        Perform the actual extraction of information.
        """
        # finds prefix, number, suffix of a Gramps ID ignoring a leading or
        # trailing space.  The number must be at least three digits.
        _prob_id = re.compile(r'^ *([^\d]*)(\d{3,9})([^\d]*) *$')

        self.db.disable_signals()
        self.change = False
        num_merges = 0

        with self.user.progress(_("Media Merge"), '',
                                self.db.get_number_of_media()) as step:
            path_dict = {}
            for media in self.db.iter_media():
                # this should collapse '../' constructs, deal with Windows '\'
                # and deal with Windows case insensitivity as well as deal
                # with relative paths and paths with environment variables.
                # it won't properly compare a Windows UNC path with an assigned
                # drive letter to that UNC path
                path = os.path.normcase(
                    os.path.normpath(media_path_full(self.db,
                                                     media.get_path())))
                if path in path_dict:
                    try:
                        media1 = path_dict[path]
                        # lets keep the shorter path, or if same
                        # try to select the lower gramps_id
                        # or lower handle  as phoenix
                        match = _prob_id.match(media.gramps_id)
                        match1 = _prob_id.match(media1.gramps_id)
                        mqo = media, media1
                        if len(media1.get_path()) < len(media.get_path()):
                            mqo = media1, media
                        elif len(media1.get_path()) == len(media.get_path()):
                            if match and match1:
                                if match1.groups()[1] < match.groups()[1]:
                                    mqo = media1, media
                                else:  # not (match and match1)
                                    if media1.handle < media.handle:
                                        mqo = media1, media
                        query = MergeMediaQuery(self.dbstate, *mqo)
                        # update to one we are keeping
                        path_dict[path] = mqo[0]
                        query.execute()
                    except AssertionError:
                        print("Tool/Family Tree processing/MediaMerge",
                              "media1 gramps_id", path_dict[path].gramps_id,
                              "media2 gramps_id", media.gramps_id)
                    num_merges += 1
                else:
                    path_dict[path] = media
                step()
        self.db.enable_signals()
        self.db.request_rebuild()
        # translators: leave all/any {...} untranslated
        message = ngettext("{number_of} media merged",
                           "{number_of} media merged",
                           num_merges).format(number_of=num_merges)
        if num_merges:
            OkDialog(_("Number of merges done"),
                     message,
                     parent=self.user.uistate.window)
        else:
            OkDialog(_('No modifications made'),
                     _("No media items merged."),
                     parent=self.user.uistate.window)
Пример #4
0
    def run_tool(self):
        try:
            obj_type = self.options.handler.options_dict['type']
            primary_id = self.options.handler.options_dict['primary']
            secondary_id = self.options.handler.options_dict['secondary']
            if not primary_id or not secondary_id:
                raise MergeError(
                    "Both primary and secondary object IDs need to "
                    "be specified.")

            if not obj_type:
                id2type = {
                    'I': 'Person',
                    'F': 'Family',
                    'E': 'Event',
                    'P': 'Place',
                    'C': 'Citation',
                    'S': 'Source',
                    'R': 'Repository',
                    'O': 'Media',
                    'N': 'Note'
                }
                obj_type = id2type[primary_id[0]]

            database = self.dbstate.db
            primary = database.get_from_name_and_gramps_id(
                obj_type, primary_id)
            secondary = database.get_from_name_and_gramps_id(
                obj_type, secondary_id)
            if not primary or not secondary:
                raise MergeError("Can't get object from ID.")

            if type(primary) != type(secondary):
                raise MergeError("Primary and secondary object need to be of "
                                 "the same type.")

            if obj_type == 'Person':
                from gramps.gen.merge import MergePersonQuery
                query = MergePersonQuery(database, primary, secondary)
            elif obj_type == 'Family':
                # TODO make sure father_handle is in phoenix or titanic
                father_handle = self.options.handler.options_dict['father_h']
                mother_handle = self.options.handler.options_dict['mother_h']
                from gramps.gen.merge import MergeFamilyQuery
                query = MergeFamilyQuery(database, primary, secondary,
                                         father_handle, mother_handle)
            elif obj_type == 'Event':
                from gramps.gen.merge import MergeEventQuery
                query = MergeEventQuery(self.dbstate, primary, secondary)
            elif obj_type == 'Place':
                from gramps.gen.merge import MergePlaceQuery
                query = MergePlaceQuery(self.dbstate, primary, secondary)
            elif obj_type == 'Citation':
                from gramps.gen.merge import MergeCitationQuery
                query = MergeCitationQuery(self.dbstate, primary, secondary)
            elif obj_type == 'Source':
                from gramps.gen.merge import MergeSourceQuery
                query = MergeSourceQuery(self.dbstate, primary, secondary)
            elif obj_type == 'Repository':
                from gramps.gen.merge import MergeRepositoryQuery
                query = MergeRepositoryQuery(self.dbstate, primary, secondary)
            elif obj_type == 'Media':
                from gramps.gen.merge import MergeMediaQuery
                query = MergeMediaQuery(self.dbstate, primary, secondary)
            elif obj_type == 'Note':
                from gramps.gen.merge import MergeNoteQuery
                query = MergeNoteQuery(self.dbstate, primary, secondary)
            else:
                raise MergeError(("Merge for %s not implemented.") % \
                        str(type(primary)))

            query.execute()
        except MergeError as err:
            print(err, file=sys.stderr)
Пример #5
0
    def run(self):
        """
        Perform the actual extraction of information.
        """
        # finds prefix, number, suffix of a Gramps ID ignoring a leading or
        # trailing space.  The number must be at least three digits.
        _prob_id = re.compile(r'^ *([^\d]*)(\d{3,9})([^\d]*) *$')

        self.db.disable_signals()
        self.change = False
        num_merges = 0

        with self.user.progress(_("Media Merge"), '',
                                self.db.get_number_of_media()) as step:
            path_dict = {}
            for media in self.db.iter_media():
                # this should collapse '../' constructs, deal with Windows '\'
                # and deal with Windows case insensitivity as well as deal
                # with relative paths and paths with environment variables.
                # it won't properly compare a Windows UNC path with an assigned
                # drive letter to that UNC path
                path = os.path.normcase(os.path.normpath(
                    media_path_full(self.db, media.get_path())))
                if path in path_dict:
                    try:
                        media1 = path_dict[path]
                        # lets keep the shorter path, or if same
                        # try to select the lower gramps_id
                        # or lower handle  as phoenix
                        match = _prob_id.match(media.gramps_id)
                        match1 = _prob_id.match(media1.gramps_id)
                        mqo = media, media1
                        if len(media1.get_path()) < len(media.get_path()):
                            mqo = media1, media
                        elif len(media1.get_path()) == len(media.get_path()):
                            if match and match1:
                                if match1.groups()[1] < match.groups()[1]:
                                    mqo = media1, media
                                else:  # not (match and match1)
                                    if media1.handle < media.handle:
                                        mqo = media1, media
                        query = MergeMediaQuery(self.dbstate, *mqo)
                        # update to one we are keeping
                        path_dict[path] = mqo[0]
                        query.execute()
                    except AssertionError:
                        print("Tool/Family Tree processing/MediaMerge",
                              "media1 gramps_id",
                              path_dict[path].gramps_id,
                              "media2 gramps_id", media.gramps_id)
                    num_merges += 1
                else:
                    path_dict[path] = media
                step()
        self.db.enable_signals()
        self.db.request_rebuild()
        # translators: leave all/any {...} untranslated
        message = ngettext("{number_of} media merged",
                           "{number_of} media merged", num_merges
                           ).format(number_of=num_merges)
        if num_merges:
            OkDialog(_("Number of merges done"), message,
                     parent=self.user.uistate.window)
        else:
            OkDialog(_('No modifications made'),
                     _("No media items merged."),
                     parent=self.user.uistate.window)