def write_report(self): """ Generate the contents of the report """ self.doc.start_paragraph('SBT-Title') self.doc.write_text(self.title_string) self.doc.end_paragraph() self.doc.start_paragraph('SBT-Subtitle') self.doc.write_text(self.subtitle_string) self.doc.end_paragraph() if self.object_id: the_object = self.database.get_object_from_gramps_id( self.object_id) filename = media_path_full(self.database, the_object.get_path()) if os.path.exists(filename): if self.image_size: image_size = self.image_size else: image_size = min(0.8 * self.doc.get_usable_width(), 0.7 * self.doc.get_usable_height()) self.doc.add_media_object(filename, 'center', image_size, image_size) else: self._user.warn(_('Could not add photo to page'), _('File %s does not exist') % filename) self.doc.start_paragraph('SBT-Footer') self.doc.write_text(self.footer_string) self.doc.end_paragraph()
def _row_change(self, obj): id_list = self.get_selected_ids() if not (id_list and id_list[0]): return handle = id_list[0] obj = self.get_from_handle_func()(handle) pix = ThumbNails.get_thumbnail_image( media_path_full(self.db, obj.get_path())) self.preview.set_from_pixbuf(pix) gc.collect()
def _run(self): if not self.prepared: self.prepare() self.set_total(len(self.handle_list)) for handle in self.handle_list: obj = self.db.get_object_from_handle(handle) new_path = media_path_full(self.db, obj.path) obj.set_path(new_path) self.db.commit_media_object(obj, self.trans) self.update() return True
def summarize_media(self): """ Write a summary of all the media in the database. """ total_media = 0 size_in_bytes = 0 notfound = [] self.doc.start_paragraph("SR-Heading") self.doc.write_text(_("Media Objects")) self.doc.end_paragraph() total_media = len(self.__db.get_media_object_handles()) mbytes = "0" for media_id in self.__db.get_media_object_handles(): media = self.__db.get_object_from_handle(media_id) try: size_in_bytes += posixpath.getsize( media_path_full(self.__db, media.get_path())) length = len(str(size_in_bytes)) if size_in_bytes <= 999999: mbytes = _("less than 1") else: mbytes = str(size_in_bytes)[:(length - 6)] except: notfound.append(media.get_path()) self.doc.start_paragraph("SR-Normal") self.doc.write_text( _("Number of unique media objects: %d") % total_media) self.doc.end_paragraph() self.doc.start_paragraph("SR-Normal") self.doc.write_text(_("Total size of media objects: %s MB") % mbytes) self.doc.end_paragraph() if len(notfound) > 0: self.doc.start_paragraph("SR-Heading") self.doc.write_text(_("Missing Media Objects")) self.doc.end_paragraph() for media_path in notfound: self.doc.start_paragraph("SR-Normal") self.doc.write_text(media_path) self.doc.end_paragraph()
def _prepare(self): """ Get all of the fullpaths, and the directories of media objects in the database. """ self.dir_list = set() self.set_total(self.db.get_number_of_media_objects()) with self.db.get_media_cursor() as cursor: for handle, data in cursor: obj = MediaObject() obj.unserialize(data) self.handle_list.append(handle) full_path = media_path_full(self.db, obj.path) self.path_list.append(full_path) directory, filename = os.path.split(full_path) if directory not in self.dir_list: self.dir_list.add(directory) self.update() self.reset()
def insert_image(database, doc, photo, user, w_cm=4.0, h_cm=4.0, alt=""): """ Insert pictures of a person into the document. """ object_handle = photo.get_reference_handle() media_object = database.get_object_from_handle(object_handle) mime_type = media_object.get_mime_type() if mime_type and mime_type.startswith("image"): filename = media_path_full(database, media_object.get_path()) if os.path.exists(filename): doc.add_media_object(filename, "right", w_cm, h_cm, alt=alt, style_name="DDR-Caption", crop=photo.get_rectangle()) else: user.warn(_("Could not add photo to page"), "%s: %s" % (filename, _('File does not exist')))
def run(database, document, filter_name, *args, **kwargs): """ Loops through the families that the person is a child in, and display the information about the other children. """ # setup the simple access functions sdb = SimpleAccess(database) sdoc = SimpleDoc(document) stab = SimpleTable(sdb) if (filter_name == 'all'): sdoc.title(_("Summary counts of current selection")) sdoc.paragraph("") sdoc.paragraph( _("Right-click row (or press ENTER) to see selected items.")) sdoc.paragraph("") stab.columns(_("Object"), _("Count/Total")) stab.row([_("People"), "Filter", "Person"], "%d/%d" % (len(database.get_person_handles()), len(database.basedb.get_person_handles()))) stab.row([_("Families"), "Filter", "Family"], "%d/%d" % (len(database.get_family_handles()), len(database.basedb.get_family_handles()))) stab.row([_("Events"), "Filter", "Event"], "%d/%d" % (len(database.get_event_handles()), len(database.basedb.get_event_handles()))) stab.row([_("Places"), "Filter", "Place"], "%d/%d" % (len(database.get_place_handles()), len(database.basedb.get_place_handles()))) stab.row([_("Sources"), "Filter", "Source"], "%d/%d" % (len(database.get_source_handles()), len(database.basedb.get_source_handles()))) stab.row([_("Repositories"), "Filter", "Repository"], "%d/%d" % (len(database.get_repository_handles()), len(database.basedb.get_repository_handles()))) stab.row([_("Media"), "Filter", "MediaObject"], "%d/%d" % (len(database.get_media_object_handles()), len(database.basedb.get_media_object_handles()))) stab.row([_("Notes"), "Filter", "Note"], "%d/%d" % (len(database.get_note_handles()), len(database.basedb.get_note_handles()))) sdoc.paragraph("") stab.write(sdoc) return # display the title if filter_name in fname_map: sdoc.title(_("Filtering on %s") % fname_map[filter_name]) # listed above else: sdoc.title(_("Filtering on %s") % _(filter_name)) sdoc.paragraph("") matches = 0 if (filter_name == 'Inverse Person'): sdb.dbase = database.db stab.columns(_("Person"), _("Gramps ID"), _("Birth Date")) proxy_handles = set(database.iter_person_handles()) for person in database.db.iter_people(): if person.handle not in proxy_handles: stab.row(person, person.gramps_id, sdb.birth_or_fallback(person)) matches += 1 elif (filter_name == 'Inverse Family'): sdb.dbase = database.db stab.columns(_("Family"), _("Gramps ID")) proxy_handles = set(database.iter_family_handles()) for family in database.db.iter_families(): if family.handle not in proxy_handles: stab.row(family, family.gramps_id) matches += 1 elif (filter_name == 'Inverse Event'): sdb.dbase = database.db stab.columns(_("Event"), _("Gramps ID")) proxy_handles = set(database.iter_event_handles()) for event in database.db.iter_events(): if event.handle not in proxy_handles: stab.row(event, event.gramps_id) matches += 1 elif (filter_name == 'Inverse Place'): sdb.dbase = database.db stab.columns(_("Place"), _("Gramps ID")) proxy_handles = set(database.iter_place_handles()) for place in database.db.iter_places(): if place.handle not in proxy_handles: stab.row(place, place.gramps_id) matches += 1 elif (filter_name == 'Inverse Source'): sdb.dbase = database.db stab.columns(_("Source"), _("Gramps ID")) proxy_handles = set(database.iter_source_handles()) for source in database.db.iter_sources(): if source.handle not in proxy_handles: stab.row(source, source.gramps_id) matches += 1 elif (filter_name == 'Inverse Repository'): sdb.dbase = database.db stab.columns(_("Repository"), _("Gramps ID")) proxy_handles = set(database.iter_repository_handles()) for repository in database.db.iter_repositories(): if repository.handle not in proxy_handles: stab.row(repository, repository.gramps_id) matches += 1 elif (filter_name == 'Inverse MediaObject'): sdb.dbase = database.db stab.columns(_("Media"), _("Gramps ID")) proxy_handles = set(database.iter_media_object_handles()) for media in database.db.iter_media_objects(): if media.handle not in proxy_handles: stab.row(media, media.gramps_id) matches += 1 elif (filter_name == 'Inverse Note'): sdb.dbase = database.db stab.columns(_("Note"), _("Gramps ID")) proxy_handles = set(database.iter_note_handles()) for note in database.db.iter_notes(): if note.handle not in proxy_handles: stab.row(note, note.gramps_id) matches += 1 elif (filter_name in ['all people', 'Person']): stab.columns(_("Person"), _("Gramps ID"), _("Birth Date")) for person in database.iter_people(): stab.row(person, person.gramps_id, sdb.birth_or_fallback(person)) matches += 1 elif (filter_name in ['all families', 'Family']): stab.columns(_("Family"), _("Gramps ID")) for family in database.iter_families(): stab.row(family, family.gramps_id) matches += 1 elif (filter_name in ['all events', 'Event']): stab.columns(_("Event"), _("Gramps ID")) for obj in database.iter_events(): stab.row(obj, obj.gramps_id) matches += 1 elif (filter_name in ['all places', 'Place']): stab.columns(_("Place"), _("Gramps ID")) for obj in database.iter_places(): stab.row(obj, obj.gramps_id) matches += 1 elif (filter_name in ['all sources', 'Source']): stab.columns(_("Source"), _("Gramps ID")) for obj in database.iter_sources(): stab.row(obj, obj.gramps_id) matches += 1 elif (filter_name in ['all repositories', 'Repository']): stab.columns(_("Repository"), _("Gramps ID")) for obj in database.iter_repositories(): stab.row(obj, obj.gramps_id) matches += 1 elif (filter_name in ['all media', 'MediaObject']): stab.columns(_("Media"), _("Gramps ID")) for obj in database.iter_media_objects(): stab.row(obj, obj.gramps_id) matches += 1 elif (filter_name in ['all notes', 'Note']): stab.columns(_("Note"), _("Gramps ID")) for obj in database.iter_notes(): stab.row(obj, obj.gramps_id) matches += 1 elif (filter_name == 'males'): stab.columns(_("Person"), _("Birth Date"), _("Name type")) for person in database.iter_people(): if person.gender == Person.MALE: stab.row(person, sdb.birth_or_fallback(person), str(person.get_primary_name().get_type())) matches += 1 elif (filter_name == 'females'): stab.columns(_("Person"), _("Birth Date"), _("Name type")) for person in database.iter_people(): if person.gender == Person.FEMALE: stab.row(person, sdb.birth_or_fallback(person), str(person.get_primary_name().get_type())) matches += 1 elif (filter_name == 'people with unknown gender'): stab.columns(_("Person"), _("Birth Date"), _("Name type")) for person in database.iter_people(): if person.gender not in [Person.FEMALE, Person.MALE]: stab.row(person, sdb.birth_or_fallback(person), str(person.get_primary_name().get_type())) matches += 1 elif (filter_name == 'people with incomplete names'): stab.columns(_("Person"), _("Birth Date"), _("Name type")) for person in database.iter_people(): for name in [person.get_primary_name() ] + person.get_alternate_names(): if name.get_group_name() == "" or name.get_first_name() == "": stab.row(person, sdb.birth_or_fallback(person), str(person.get_primary_name().get_type())) matches += 1 elif (filter_name == 'people with missing birth dates'): stab.columns(_("Person"), _("Type")) for person in database.iter_people(): birth_ref = person.get_birth_ref() if birth_ref: birth = database.get_event_from_handle(birth_ref.ref) if not DateHandler.get_date(birth): stab.row(person, _("birth event but no date")) matches += 1 else: stab.row(person, _("missing birth event")) matches += 1 elif (filter_name == 'disconnected people'): stab.columns(_("Person"), _("Birth Date"), _("Name type")) for person in database.iter_people(): if ((not person.get_main_parents_family_handle()) and (not len(person.get_family_handle_list()))): stab.row(person, sdb.birth_or_fallback(person), str(person.get_primary_name().get_type())) matches += 1 elif (filter_name == 'unique surnames'): namelist = defaultdict(int) for person in database.iter_people(): names = [person.get_primary_name()] + person.get_alternate_names() surnames = list(set([name.get_group_name() for name in names])) for surname in surnames: namelist[surname] += 1 stab.columns(_("Surname"), _("Count")) for name in sorted(namelist): stab.row(name, namelist[name]) matches += 1 stab.set_callback( "leftdouble", lambda name: run_quick_report_by_name_direct( "samesurnames", database, document, name)) elif (filter_name == 'people with media'): stab.columns(_("Person"), _("Media count")) for person in database.iter_people(): length = len(person.get_media_list()) if length > 0: stab.row(person, length) matches += 1 elif (filter_name == 'media references'): stab.columns(_("Person"), _("Reference")) for person in database.iter_people(): medialist = person.get_media_list() for item in medialist: stab.row(person, _("media")) matches += 1 elif (filter_name == 'unique media'): stab.columns(_("Unique Media")) for photo in database.iter_media_objects(): fullname = media_path_full(database, photo.get_path()) stab.row(fullname) matches += 1 elif (filter_name == 'missing media'): stab.columns(_("Missing Media")) for photo in database.iter_media_objects(): fullname = media_path_full(database, photo.get_path()) try: posixpath.getsize(fullname) except: stab.row(fullname) matches += 1 elif (filter_name == 'media by size'): stab.columns(_("Media"), _("Size in bytes")) for photo in database.iter_media_objects(): fullname = media_path_full(database, photo.get_path()) try: bytes = posixpath.getsize(fullname) stab.row(fullname, bytes) matches += 1 except: pass elif (filter_name == 'list of people'): stab.columns(_("Person"), _("Birth Date"), _("Name type")) handles = kwargs["handles"] for person_handle in handles: person = database.get_person_from_handle(person_handle) stab.row(person, sdb.birth_or_fallback(person), str(person.get_primary_name().get_type())) matches += 1 else: raise AttributeError, ("invalid filter name: '%s'" % filter_name) sdoc.paragraph( ngettext("Filter matched %d record.", "Filter matched %d records.", matches) % matches) sdoc.paragraph("") document.has_data = matches > 0 if matches > 0: stab.write(sdoc)
def main(self): self.set_text(_("Processing...")) database = self.dbstate.db personList = database.iter_people() with_media = 0 total_media = 0 incomp_names = 0 disconnected = 0 missing_bday = 0 males = 0 females = 0 unknowns = 0 bytes = 0 namelist = [] notfound = [] mobjects = database.get_number_of_media_objects() mbytes = "0" for media in database.iter_media_objects(): fullname = media_path_full(database, media.get_path()) try: bytes += posixpath.getsize(fullname) length = len(str(bytes)) if bytes <= 999999: mbytes = _("less than 1") else: mbytes = str(bytes)[:(length - 6)] except OSError: notfound.append(media.get_path()) for cnt, person in enumerate(personList): length = len(person.get_media_list()) if length > 0: with_media += 1 total_media += length for name in [person.get_primary_name() ] + person.get_alternate_names(): # Count unique surnames if not name.get_surname().strip() in namelist \ and not name.get_surname().strip() == "": namelist.append(name.get_surname().strip()) if name.get_first_name().strip() == "": incomp_names += 1 else: if name.get_surname_list(): for surname in name.get_surname_list(): if surname.get_surname().strip() == "": incomp_names += 1 else: incomp_names += 1 if (not person.get_main_parents_family_handle() and not len(person.get_family_handle_list())): disconnected += 1 birth_ref = person.get_birth_ref() if birth_ref: birth = database.get_event_from_handle(birth_ref.ref) if not DateHandler.get_date(birth): missing_bday += 1 else: missing_bday += 1 if person.get_gender() == gen.lib.Person.FEMALE: females += 1 elif person.get_gender() == gen.lib.Person.MALE: males += 1 else: unknowns += 1 if not cnt % _YIELD_INTERVAL: yield True self.clear_text() self.append_text(_("Individuals") + "\n") self.append_text("----------------------------\n") self.link(_("Number of individuals") + ":", 'Filter', 'all people') self.append_text(" %s" % database.get_number_of_people()) self.append_text("\n") self.link("%s:" % _("Males"), 'Filter', 'males') self.append_text(" %s" % males) self.append_text("\n") self.link("%s:" % _("Females"), 'Filter', 'females') self.append_text(" %s" % females) self.append_text("\n") self.link("%s:" % _("Individuals with unknown gender"), 'Filter', 'people with unknown gender') self.append_text(" %s" % unknowns) self.append_text("\n") self.link("%s:" % _("Individuals with incomplete names"), 'Filter', 'people with incomplete names') self.append_text(" %s" % incomp_names) self.append_text("\n") self.link("%s:" % _("Individuals missing birth dates"), 'Filter', 'people with missing birth dates') self.append_text(" %s" % missing_bday) self.append_text("\n") self.link("%s:" % _("Disconnected individuals"), 'Filter', 'disconnected people') self.append_text(" %s" % disconnected) self.append_text("\n") self.append_text("\n%s\n" % _("Family Information")) self.append_text("----------------------------\n") self.link("%s:" % _("Number of families"), 'Filter', 'all families') self.append_text(" %s" % database.get_number_of_families()) self.append_text("\n") self.link("%s:" % _("Unique surnames"), 'Filter', 'unique surnames') self.append_text(" %s" % len(namelist)) self.append_text("\n") self.append_text("\n%s\n" % _("Media Objects")) self.append_text("----------------------------\n") self.link("%s:" % _("Individuals with media objects"), 'Filter', 'people with media') self.append_text(" %s" % with_media) self.append_text("\n") self.link("%s:" % _("Total number of media object references"), 'Filter', 'media references') self.append_text(" %s" % total_media) self.append_text("\n") self.link("%s:" % _("Number of unique media objects"), 'Filter', 'unique media') self.append_text(" %s" % mobjects) self.append_text("\n") self.link("%s:" % _("Total size of media objects"), 'Filter', 'media by size') self.append_text(" %s %s" % (mbytes, _("Megabyte|MB"))) self.append_text("\n") self.link("%s:" % _("Missing Media Objects"), 'Filter', 'missing media') self.append_text(" %s\n" % len(notfound)) self.append_text("", scroll_to="begin")
def write_person(self, count): if count != 0: self.doc.page_break() self.bibli = Bibliography(Bibliography.MODE_DATE | Bibliography.MODE_PAGE) media_list = self.person.get_media_list() name = self._name_display.display(self.person) # feature request 2356: avoid genitive form title = _("Summary of %s") % name mark = IndexMark(title, INDEX_TYPE_TOC, 1) self.doc.start_paragraph("IDS-Title") self.doc.write_text(title, mark) self.doc.end_paragraph() self.doc.start_paragraph("IDS-Normal") self.doc.end_paragraph() name = self.person.get_primary_name() text = self._name_display.display_name(name) mark = ReportUtils.get_person_mark(self.database, self.person) endnotes = "" if self.use_srcs: endnotes = Endnotes.cite_source(self.bibli, self.database, name) family_handle = self.person.get_main_parents_family_handle() if family_handle: family = self.database.get_family_from_handle(family_handle) father_inst_id = family.get_father_handle() if father_inst_id: father_inst = self.database.get_person_from_handle( father_inst_id) father = self._name_display.display(father_inst) fmark = ReportUtils.get_person_mark(self.database, father_inst) else: father = "" fmark = None mother_inst_id = family.get_mother_handle() if mother_inst_id: mother_inst = self.database.get_person_from_handle( mother_inst_id) mother = self._name_display.display(mother_inst) mmark = ReportUtils.get_person_mark(self.database, mother_inst) else: mother = "" mmark = None else: father = "" fmark = None mother = "" mmark = None self.doc.start_table('person', 'IDS-PersonTable') self.doc.start_row() self.doc.start_cell('IDS-NormalCell') self.normal_paragraph("%s:" % _("Name")) self.normal_paragraph("%s:" % _("Gender")) self.normal_paragraph("%s:" % _("Father")) self.normal_paragraph("%s:" % _("Mother")) self.doc.end_cell() self.doc.start_cell('IDS-NormalCell') self.normal_paragraph(text, endnotes, mark) if self.person.get_gender() == Person.MALE: self.normal_paragraph(_("Male")) elif self.person.get_gender() == Person.FEMALE: self.normal_paragraph(_("Female")) else: self.normal_paragraph(_("Unknown")) self.normal_paragraph(father, mark=fmark) self.normal_paragraph(mother, mark=mmark) self.doc.end_cell() self.doc.start_cell('IDS-NormalCell') if self.use_images and len(media_list) > 0: media0 = media_list[0] media_handle = media0.get_reference_handle() media = self.database.get_object_from_handle(media_handle) mime_type = media.get_mime_type() if mime_type and mime_type.startswith("image"): filename = media_path_full(self.database, media.get_path()) if os.path.exists(filename): self.doc.add_media_object(filename, "right", 4.0, 4.0, crop=media0.get_rectangle()) else: self._user.warn( _("Could not add photo to page"), "%s: %s" % (filename, _('File does not exist'))) self.doc.end_cell() self.doc.end_row() self.doc.end_table() self.doc.start_paragraph("IDS-Normal") self.doc.end_paragraph() self.write_alt_names() self.write_events() self.write_alt_parents() self.write_families() self.write_addresses() self.write_note() if self.use_srcs: if self.use_pagebreak and self.bibli.get_citation_count(): self.doc.page_break() Endnotes.write_endnotes(self.bibli, self.database, self.doc, printnotes=self.use_srcs_notes)